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 相关文章推荐
Python3读取文件常用方法实例分析
May 22 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
python字符串str和字节数组相互转化方法
Mar 18 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
对python:print打印时加u的含义详解
Dec 15 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
python 处理微信对账单数据的实例代码
Jul 19 Python
Python+Redis实现布隆过滤器
Dec 08 Python
Python Flask框架实现简单加法工具过程解析
Jun 03 Python
Python实现给PDF添加水印的方法
Jan 25 Python
python运行脚本文件的三种方法实例
Jun 25 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 array_flip() 删除数组重复元素
2009/01/14 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
用javascript实现自定义标签
2007/05/08 Javascript
基于Jquery的温度计动画效果
2010/06/18 Javascript
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
基于JavaScript实现淘宝商品广告效果
2017/08/10 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
Vue 组件复用多次自定义参数操作
2020/07/27 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
学Python 3的理由和必要性
2019/11/19 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
python不同系统中打开方法
2020/06/23 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
澳大利亚家具商店:Freedom
2020/12/17 全球购物
预备党员思想汇报范文
2013/12/29 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
学习雷锋倡议书
2014/04/15 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python
SQL Server 中的事务介绍
2022/05/20 SQL Server