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快速排序代码实例
Nov 21 Python
python函数参数*args**kwargs用法实例
Dec 04 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
python逆序打印各位数字的方法
Jun 25 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
Python3最长回文子串算法示例
Mar 04 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
Django对models里的objects的使用详解
Aug 17 Python
Python调用C语言程序方法解析
Jul 07 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
Python 如何利用ffmpeg 处理视频素材
Nov 27 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/15 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
python实现巡检系统(solaris)示例
2014/04/02 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
django rest framework 自定义返回方式
2020/07/12 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
公司备用金管理制度
2015/08/04 职场文书