Python使用smtplib模块发送电子邮件的流程详解

 更新时间:2016年06月27日 14:50:19   作者:j_hao104  
Python中自带的smtplib模块可以进行基于SMTP协议的邮件操作,这里我们便总结了Python使用smtplib模块发送电子邮件的流程详解,并对一些常见的问题给出了解决方法:

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也是如此,因此去设置好客户端密码,再用客户端密码登录。

2016627144753064.png (700×421)

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。
但是执行结果并不能得到网上说的结果:

2016627144839301.jpg (350×162)

而是:

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里的具体信息可以用一般发邮件方式发封邮件测试下

2016627144903688.png (424×155)

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实现帕累托图的示例详解

    帕累托图是一种特殊的直方图, 在项目管理知识体系中属于质量管理的工具。本文为大家整理了Python实现帕累托图的方法,需要的可以参考一下
    2023-03-03
  • python实现字符串加密成纯数字

    python实现字符串加密成纯数字

    这篇文章主要为大家详细介绍了python实现字符串加密成纯数字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • python数据抓取分析的示例代码(python + mongodb)

    python数据抓取分析的示例代码(python + mongodb)

    本篇文章主要介绍了python数据抓取分析的示例代码(python + mongodb),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Python smtplib实现发送邮件功能

    Python smtplib实现发送邮件功能

    这篇文章主要为大家详细介绍了Python smtplib实现发送邮件功能,包含文本、附件、图片等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • python实现大文件分割与合并

    python实现大文件分割与合并

    这篇文章主要为大家详细介绍了python实现大文件分割与合并,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • python opencv 二值化 计算白色像素点的实例

    python opencv 二值化 计算白色像素点的实例

    今天小编就为大家分享一篇python opencv 二值化 计算白色像素点的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python 根据日志级别打印不同颜色的日志的方法示例

    Python 根据日志级别打印不同颜色的日志的方法示例

    这篇文章主要介绍了Python 根据日志级别打印不同颜色的日志的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python基础之Numpy库中array用法总结

    python基础之Numpy库中array用法总结

    NumPy(Numerical Python的缩写)是一个开源的Python科学计算库,使用NumPy就可以很自然地使用数组和矩阵,这篇文章主要给大家介绍了关于python基础之Numpy库中array用法的相关资料,需要的朋友可以参考下
    2021-08-08
  • 使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

    使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

    这篇文章主要介绍了使用Python的OpenCV模块识别滑动验证码的缺口,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Python符号计算之实现函数极限的方法

    Python符号计算之实现函数极限的方法

    这篇文章主要介绍了Python符号计算之实现函数极限的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论