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标准库urllib2的一些使用细节总结
Mar 16 Python
python使用arp欺骗伪造网关的方法
Apr 24 Python
Python中有趣在__call__函数
Jun 21 Python
Python将多个list合并为1个list的方法
Jun 27 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
Sep 04 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
Python 从列表中取值和取索引的方法
Dec 25 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
Python 获取ftp服务器文件时间的方法
Jul 02 Python
Python实现12306火车票抢票系统
Jul 04 Python
使用python 将图片复制到系统剪贴中
Dec 13 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
Jan 19 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/06/19 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
懒加载实现的分页&amp;&amp;网站footer自适应
2016/12/21 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
如何利用nodejs实现命令行游戏
2020/11/24 NodeJs
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
python简单实现操作Mysql数据库
2018/01/29 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
Python imutils 填充图片周边为黑色的实现
2020/01/19 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
python递归函数用法详解
2020/10/26 Python
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
诚信考试倡议书
2014/04/15 职场文书
五四演讲稿范文
2014/09/03 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python