Python使用smtplib模块发送电子邮件的流程详解


Posted in Python onJune 27, 2016

1、登录SMTP服务器
首先使用网上的方法(这里使用163邮箱,smtp.163.com是smtp服务器地址,25为端口号):

import smtplib
server = smtplib.SMTP('smtp.163.com', 25)
server.login('j_hao104@163.com', 'password')
Traceback (most recent call last):
 File "C:/python/t.py", line 192, in <module>
  server.login('j_hao104@163.com', 'password')
 File "C:\Python27\lib\smtplib.py", line 622, in login
  raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, 'Error: authentication failed')

发现返回: 

smtplib.SMTPAuthenticationError: (535, 'Error: authentication failed')

,提示验证失败。
有说python不支持SMTP服务,或是服务没开启之类的。但是我想起上次我用foxmail登录我的163邮箱的时候,邮箱密码都输对了还是提示我密码错误,最后的解决办法是:像QQ和163邮箱现在都有个客户端密码,用第三方登录时需用客户端密码登录才行,python也是如此,因此去设置好客户端密码,再用客户端密码登录。

Python使用smtplib模块发送电子邮件的流程详解

import smtplib
server = smtplib.SMTP('smtp.163.com', 25)
server.login('j_hao104@163.com', 'clientPassword')

    此时便返回登录成功提示:

(235, 'Authentication successful')

2、发送邮件

首先使用网上给出的代码:

import smtplib
from email.mime.text import MIMEText
server = smtplib.SMTP('smtp.163.com', 25)
server.login('j_hao104@163.com', 'clientPassword')
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
server.sendmail('j_hao104@163.com', ['946150454@qq.com'], msg.as_string())

构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后个是编码方式。
sendmail是发邮件方法,第一个参数是发件邮箱,第二个参数是收件人邮箱,是一个列表,代表可以同时发给多个人,as_string是把MIMEText对象变成str。
但是执行结果并不能得到网上说的结果:

Python使用smtplib模块发送电子邮件的流程详解

而是:

Traceback (most recent call last):
 File "C:/python/t.py", line 195, in <module>
  server.sendmail('j_hao104@163.com', ['946150454@qq.com'], msg.as_string())
 File "C:\Python27\lib\smtplib.py", line 746, in sendmail
  raise SMTPDataError(code, resp)
smtplib.SMTPDataError: (554, 'DT:SPM 163 smtp11,D8CowEDpDkE427JW_wQIAA--.4996S2 1454562105,please see http://mail.163.com/help/help_spam_16.htm?ip=171.221.144.51&hostid=smtp11&time=1454562105')

网上一查才知道:smtplib.SMTPDataError: (554, 'DT:SPM 163 smtp11……的错误是因为信封发件人和信头发件人不匹配。可以看出看出图片中并没有发件人和主题,所以需要对代码做如下修改:

import smtplib
from email.header import Header
from email.mime.text import MIMEText
server = smtplib.SMTP('smtp.163.com', 25)
server.login('j_hao104@163.com', 'clientPassword')
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
msg['From'] = 'j_hao104@163.com <j_hao104@163.com>'
msg['Subject'] = Header(u'text', 'utf8').encode()
msg['To'] = u'飞轮海 <jinghao5849312@qq.com>'
server.sendmail('j_hao104@163.com', ['946150454@qq.com'], msg.as_string())

这样就能成功发出邮件啦
msg里的具体信息可以用一般发邮件方式发封邮件测试下

Python使用smtplib模块发送电子邮件的流程详解

3、参考示例

import smtplib
from email.mime.text import MIMEText

to_list = ['123@123.com', '456@456.com']
server_host = 'smtp.163.com'

username = '你的邮箱账号'
password = '你的邮箱密码'


def send(to_list, sub, content):
  '''
  :param to_list: 收件人邮箱
  :param sub: 邮件标题
  :param content: 内容
  '''
  me = "manager" + "<" + username + ">" 
  # _subtype 可以设为html,默认是plain
  msg = MIMEText(content, _subtype='html')
  msg['Subject'] = sub
  msg['From'] = me
  msg['To'] = ';'.join(to_list)
  try:
    server = smtplib.SMTP()
    server.connect(server_host)
    server.login(username, password)
    server.sendmail(me, to_list, msg.as_string())
    server.close()
  except Exception as e:
    print str(e)

if __name__ == '__main__':
  send(to_list, "这个是一个邮件", "<h1>Hello, It's test email.</h1>")
Python 相关文章推荐
python访问纯真IP数据库的代码
May 19 Python
python抓取京东价格分析京东商品价格走势
Jan 09 Python
Python中无限元素列表的实现方法
Aug 18 Python
Python实现把数字转换成中文
Jun 29 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
Python格式化输出%s和%d
May 07 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
实例讲解Python中浮点型的基本内容
Feb 11 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
Django model select的多种用法详解
Jul 16 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
Python selenium如何打包静态网页并下载
Aug 12 Python
Python教程之全局变量用法
Jun 27 #Python
python设计模式大全
Jun 27 #Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 #Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 #Python
Python读写txt文本文件的操作方法全解析
Jun 26 #Python
Python实现快速排序算法及去重的快速排序的简单示例
Jun 26 #Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 #Python
You might like
PHP实现的简易版图片相似度比较
2015/01/07 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
PHP实现将base64编码字符串转换成图片示例
2018/06/22 PHP
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
JS实现身份证输入框的输入效果
2017/08/21 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
python服务器与android客户端socket通信实例
2014/11/12 Python
详解Python中with语句的用法
2015/04/15 Python
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
python编程嵌套函数实例代码
2018/02/11 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
python循环输出三角形图案的例子
2019/11/22 Python
django在开发中取消外键约束的实现
2020/05/20 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
CSS3 渐变(Gradients)之CSS3 线性渐变
2016/07/08 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
儿科护理实习自我鉴定
2013/09/19 职场文书
工程力学硕士生的自我评价范文
2013/11/16 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
党员查摆剖析材料
2014/10/10 职场文书
职称评定个人总结
2015/03/05 职场文书
党员读书活动心得体会
2016/01/14 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python