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创建文件和追加文件内容实例
Oct 21 Python
Python简单进程锁代码实例
Apr 27 Python
python如何查看系统网络流量的信息
Sep 12 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
使用python3+xlrd解析Excel的实例
May 04 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
python爬虫 Pyppeteer使用方法解析
Sep 28 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
PyQt5 控件字体样式等设置的实现
May 13 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
python如何利用Mitmproxy抓包
Oct 10 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
文件上传类
2006/10/09 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
Laravel 5框架学习之表单
2015/04/08 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
python多线程抓取天涯帖子内容示例
2014/04/03 Python
Python列表append和+的区别浅析
2015/02/02 Python
python判断字符串是否包含子字符串的方法
2015/03/24 Python
python实现linux下使用xcopy的方法
2015/06/28 Python
使用Scrapy爬取动态数据
2018/10/21 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
美国电视购物HSN官网:HSN
2016/09/07 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
Linux操作面试题
2012/05/16 面试题
电子商务个人职业生涯规划范文
2014/02/12 职场文书
培训协议书范本
2014/04/22 职场文书
给医院的感谢信
2015/01/21 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
高一军训感想
2015/08/07 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python
HTML中的表格元素介绍
2022/02/28 HTML / CSS
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python