Python模块探秘之smtplib,实现纯文本邮件的发送
今天学到了如何使用Python的smtplib库发送邮件,中间也是遇到了各种各样的错误和困难,还好都一一的解决了。下面来谈一谈我的这段经历。
配置你的邮箱
为什么要配置邮箱呢?具体要配置什么呢?
因为我们申请的一些免费邮箱都是默认不开启smtp/pop协议的。
SMTP是发邮件使用到的计算机网络中应用层协议中的一个;而POP则是收邮件时使用到的计算机网络中的应用层协议的其中一个。这都是理论性的知识了,上过计算机网络这门课的想必都知道,就不多说了。
配置就是要开启这项服务。否则我们就不能实现用Python代码来控制发送和接收邮件了。
我们在配置完成之后,系统会提示给我们一个邮箱客户端的授权码。作用就是我们登陆的时候替代原来的登陆密码。大家一定要完善保存咯。我这里采用的是163的邮箱,所以是可以自己设置这个授权码的。
使用代码发邮件
还是按照,先看代码再研究的策略。如下:
# coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
"""
请确保自己的邮箱的smtp协议开启,都则会出现认证的错误的,如ssh等
"""
sender = "1564086XXXX@163.com"
# 收件人,可以是多个
receivers = ['102170XXXX@qq.com']
# 三个参数:第一个为纯文本,第二个plain设置文本格式,第三个为编码格式
message = MIMEText('这里是发送的邮件的主要的内容。Pure Text Here!','plain','utf-8')
message['From'] = Header('来自Mark','utf-8')
message['To'] = Header('测试标题','utf-8')
subject = '哈哈哈哈哈哈,这是邮件的主题 '
message['Subject'] = Header(subject,'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect('smtp.163.com',25)
smtpObj.login(sender,'你的客户端授权码')
smtpObj.sendmail(sender,receivers,message.as_string())
smtpObj.quit()
print '邮件已成功发送了'
except smtplib.SMTPException,e:
print e.message
测试的结果:
D:\Software\Python2\python.exe E:/Code/Python/MyTestSet/mail/PureText.py
邮件已成功发送了
Process finished with exit code 0
确实是成功发送了的。
代码探查
下面就来深入的研究一下发送邮件实现的流程吧。我们注意到了,最最主要的是下面的这样一段代码。
smtpObj = smtplib.SMTP()
smtpObj.connect('smtp.163.com',25)
smtpObj.login(sender,'你的客户端授权码')
smtpObj.sendmail(sender,receivers,\
message.as_string()
smtpObj.quit()
不难看出,主要是经历了下面的这些流程:
- 获得SMTP服务
- 连接服务器
- 模拟客户端登陆
- 实现发送邮件
退出登录
其中核心的也就是客户端登陆和发送邮件的两个步骤。模拟登陆的时候需要注意的就是使用你自己的授权码就行了,没什么难度。而发送邮件的时候需要注意一下参数。发件人是一个,而收件人是一个列表,里面可以有很多个收件人(这样可以借助这个列表实现邮件的群发)。
其他需要注意的也就是使用MIME类型的数据,和使用utf-8编码就行了。属于非智力相关的内容。所以不用太在意。会用就可以了。
这样看来,发个邮件什么的也不是很难嘛。(^__^) 嘻嘻……
错误总结
错误一:500、530等5开头的错误,大致为什么ssh异常啊什么的。有点web常识的都知道,5开头的错误代码一般都是服务器内部的错误,所以这基本上可以判断出我们的代码其实没有出错。我们主要的排错方向应该是服务器端了(当然了,凡是没有任何的绝对,但这种情况出现的概率确实是很小的)。这时,我们要检查一下自己的邮箱的SMTP/POP服务开启了没有啊等等
错误二 :授权码没有写或者填写成了自己的邮箱之前的密码,错误提示一般都是认证相关的。这一点属于低级错误了。因为在配置完自己的SMTP/POP服务之后,系统会发还一个短信提示,告知用户要使用授权码替代原密码登陆邮箱。所以使用你的授权码进行登录呗。
错误三:代码中的错误。这就更加的不应该了,少写了必填项,或者编码没添加等类似的错误是我们应该极力避免的,所以尽量保证自己的代码的正确。
Python模块探秘之smtplib,实现纯文本邮件的发送的更多相关文章
- Python模块探秘 Smtplib发送带有各种附件的邮件
这两天对Python的邮件模块比较感兴趣,于是就查了查资料.同时在实际的编码过程中也遇到了各种各样的问题.下面我就来分享一下我与smtplib的故事. 前提条件 我的上一篇博文里面讲解了,发送邮件必须 ...
- thunderbird发送纯文本邮件
向邮件列表中发邮件时,要求邮件格式必须是纯文本格式的,在thunderbird中,邮件格式(plain text或者html格式)在[工具->账户设置->[账户名称]->通讯录]下的 ...
- PyQt(Python+Qt)学习随笔:纯文本编辑器QPlainTextEdit功能详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QPlainTextEdit是用于纯文本的一个高级文档编辑器 ...
- Python模块探秘之EasyGui
在Windows想用Python开发一些简单的界面,所以找到了很容易上手的EasyGui库.下面就分享一下简单的使用吧. 参考的链接:官网Tutorial 接下来,我将从简单,到复杂一点点的演示如何使 ...
- python的email、smtplib、poplib模块收发邮件
一封电子邮件的旅程是: MUA:Mail User Agent--邮件用户代理.(即类似Outlook的电子邮件软件) MTA:Mail Transfer Agent--邮件传输代理,就是那些Emai ...
- Python通过yagmail和smtplib模块发送简单邮件
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件.python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是pytho ...
- smtplib与email模块(实现邮件的发送)
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件, ...
- php socket通过smtp发送邮件(纯文本、HTML,多收件人,多抄送,多密送)
<?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送 * @example * $mail = new MySendMail(); * ...
- JavaMail入门:创建纯文本、HTML格式的邮件
转自:http://haolloyin.blog.51cto.com/1177454/353849/ 在 http://java.sun.com/products/javamail/ 下载了 Java ...
随机推荐
- [SDOI2010]代码拍卖会
题目描述 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关 ...
- ●UVA 10674 Tangents
题链: https://vjudge.net/problem/UVA-10674 题解: 计算几何,求两个圆的公切线. <算法竞赛入门经典——训练指南>P266,讲得很清楚的. 大致是分为 ...
- HDU2303(数论)大整数求余+素数筛选
Sample Input 143 10 143 20 667 20 667 30 2573 30 2573 40 0 0 Sample Output GOOD BAD 11 GOOD BAD 23 ...
- SpringBoot学习之自动依赖
在前面使用SSM集成时,我们可以使用注解实现无配置化注入,但是这种依赖被进行“人工干预了的”,换句话就是说我们手动进行装配,那么此时还没有达到SpringBoot这种自动装配的效果,那么究竟Sprin ...
- 如何使用GitHub
进行版本控制时,我们可以直接通过网页来进行版本控制,也可以下载git客户端.值得注意的是,git的客户端有很多种,具体的可以参考:https://git-scm.com/downloads/guis/ ...
- jenkins更新后出现JNLP-connect,JNLP2-connect警告
在更新jenkins后出现提示 This Jenkins instance uses deprecated protocols: JNLP-connect,JNLP2-connect. It may ...
- 两个对象用equals方法比较为true,它们的Hashcode值相同吗?
两个对象用equals方法比较为true,它们的Hashcode值相同吗? 答:不一定相同.正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同 ...
- 韩顺平玩转Oracle视频资料整理
.oracle10g 11g:g(grid)表示网格技术 以baidu搜索为准,现在想使用一个软件,但是此软件在离自己非常近的地方就存在了下载地址,但是与自己非常远的地方也同样存在一个下载地址,而搜索 ...
- ACM Find them, Catch them
The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TW ...
- Django Views(视图函数)
http请求中产生两个核心对象: http请求:HttpRequest对象 http响应:HttpResponse对象 所在位置:django.http 之前我们用到的参数request就是HttpR ...