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 pickle 和 shelve模块的用法
Sep 16 Python
python中bisect模块用法实例
Sep 25 Python
Python Web框架Flask中使用七牛云存储实例
Feb 08 Python
Python中turtle作图示例
Nov 15 Python
Python魔法方法功能与用法简介
Apr 04 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
Dec 05 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
Python日志logging模块功能与用法详解
Apr 09 Python
python使用建议与技巧分享(二)
Aug 17 Python
一些关于python 装饰器的个人理解
Aug 31 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 form 表单传参明细研究
2009/07/17 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
在Django的模型中添加自定义方法的示例
2015/07/21 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
解决python删除文件的权限错误问题
2018/04/24 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
python开根号实例讲解
2020/08/30 Python
传播学毕业生求职信
2013/10/11 职场文书
应届毕业生求职信
2013/11/30 职场文书
保险经纪人求职信
2014/03/11 职场文书
《将心比心》教学反思
2014/04/08 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
民事和解协议书格式
2014/11/29 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
《乙女游戏世界对路人角色很不友好》OP主题曲无字幕动画MV公开
2022/04/05 日漫
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技