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基本数据类型详细介绍
Mar 11 Python
Python中用函数作为返回值和实现闭包的教程
Apr 27 Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
Python sys.argv用法实例
May 28 Python
python编码总结(编码类型、格式、转码)
Jul 01 Python
Python做简单的字符串匹配详解
Mar 21 Python
python实现俄罗斯方块
Jun 26 Python
pyhanlp安装介绍和简单应用
Feb 22 Python
python写日志文件操作类与应用示例
Jul 01 Python
Django 反向生成url实例详解
Jul 30 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
python破解同事的压缩包密码
Oct 14 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时间戳使用实例代码
2008/06/07 PHP
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
ExtJs的Date格式字符代码
2010/12/30 Javascript
iframe子页面与父页面在同域或不同域下的js通信
2014/05/07 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
javascript匀速动画和缓冲动画详解
2016/10/20 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
微信小程序实现图片压缩
2019/12/03 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
python根据文件大小打log日志
2014/10/09 Python
Python定时执行之Timer用法示例
2015/05/27 Python
Python中文竖排显示的方法
2015/07/28 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
python文本数据处理学习笔记详解
2019/06/17 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
python实现三壶谜题的示例详解
2020/11/02 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
澳大利亚家具商店:Freedom
2020/12/17 全球购物
super()与this()的区别
2016/01/17 面试题
一套带网友答案的.NET笔试题
2016/12/06 面试题
五一服装活动方案
2014/01/11 职场文书
小学生竞选班干部演讲稿
2014/04/24 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
房产电话营销开场白
2015/05/29 职场文书
妇产科护理心得体会
2016/01/22 职场文书
Python图片检索之以图搜图
2021/05/31 Python
Java版 单机五子棋
2022/05/04 Java/Android
mysql sock 文件解析及作用讲解
2022/07/15 MySQL