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 相关文章推荐
分享15个最受欢迎的Python开源框架
Jul 13 Python
浅谈python中的__init__、__new__和__call__方法
Jul 18 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
selenium+python实现自动化登录的方法
Sep 04 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 Python
Django之提交表单与前后端交互的方法
Jul 19 Python
python之pexpect实现自动交互的例子
Jul 25 Python
python实现大战外星人小游戏实例代码
Dec 26 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
Python %r和%s区别代码实例解析
Apr 03 Python
如何让python的运行速度得到提升
Jul 08 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/25 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
详解WordPress中添加友情链接的方法
2016/05/21 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
js函数的延迟加载实现代码
2012/10/11 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
Python操作注册表详细步骤介绍
2020/02/05 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
HTML5注册页面示例代码
2014/03/27 HTML / CSS
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
大学校务公开实施方案
2014/03/31 职场文书
中专生自荐信
2014/06/25 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
超强台风观后感
2015/06/09 职场文书
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python