Python使用smtplib模块发送电子邮件的流程详解
admin
2023-08-02 05:21:46
0

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 
  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 
  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 \'
msg[\'Subject\'] = Header(u\'text\', \'utf8\').encode()
msg[\'To\'] = u\'飞轮海 \'
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, \"这个是一个邮件\", \"

Hello, It\'s test email.

\")

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...