Python使用SMIP发送邮件

如今Python已经成为最受欢迎的程序设计语言之一,所以利用工作时间学一学Python,廖雪峰的Python教学写的真的是通俗易懂,今天跟着教程做了一个SMIP发送邮件,也算是费劲周折才完成了这个小Demo

首先我们有必要了解下什么是SMIP

SMTP 是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。
SMTP 是建立在 TCP上的一种邮件服务,主要用于传输系统之间的邮件信息并提供来信有关的通知。

写程序前应该做的事

发送邮件之前,我们需要获取邮箱的’授权码’,以’QQ邮箱’为例
请在网页端登录邮箱后,进入 设置—>账户—>开启POP3/SMTP服务 ,如下图:

image

开始写程序

# eml.py
# email负责构造邮件
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
#smtplib 负责发送邮件
import smtplib

# 输入email地址和密码
from_addr = '2696709667@qq.com'
# QQ邮箱授权码gpnjvacjweahbeca
password = 'hkrmrklurnbsdebi'
# 输入收件人地址
to_addr = input('To: ')
# 输入SMTP服务器地址,smtp.qq.com
smtp_server = 'smtp.qq.com'
# 格式化邮件,如果name包含中文需要进行编码
def _format_addr(s):
name, addr= parseaddr(s)
# 构造MIMEText对象,第一个参数是邮件正文,第二个参数是MIME的subtype,'plain'表示纯文本
# 最后一定要用utf-8编码保证多语言兼容性
msg = MIMEText('Hello, send by Python...','plain','utf-8')
# 把From、To和Subject添加到MIMEText中
msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
msg['To'] = _format_addr('管理员 <%s>' % to_addr)
msg['Subject'] = Header('来自Kebin.Wang、、','utf-8').encode()
server = smtplib.SMTP_SSL(smtp_server,465)
# 可以打印出和SMTP服务器交互的所有信息
server.set_debuglevel(1)
# login()方法用来登录SMTP服务器
server.login(from_addr,password)
# sendemail()方法是发送邮件,由于可以一次发给多个人,所以传入一个list
# 邮件正文是一个str,as_string()把MIMEText对象变成str
server.sendmail(from_addr,[to_addr],msg.as_string())
server.quit()

把上面的QQ邮箱授权码改成自己的,Email地址也改成自己的

CMD控制台测试 给我的钉钉发一条邮件

E:\pytonPro>python eml.py
To: wkb1997@dingtalk.com
send: 'ehlo [192.168.153.1]\r\n'
reply: b'250-smtp.qq.com\r\n'
reply: b'250-PIPELINING\r\n'
reply: b'250-SIZE 73400320\r\n'
reply: b'250-AUTH LOGIN PLAIN\r\n'
reply: b'250-AUTH=LOGIN\r\n'
reply: b'250-MAILCOMPRESS\r\n'
reply: b'250 8BITMIME\r\n'
reply: retcode (250); Msg: b'smtp.qq.com\nPIPELINING\nSIZE 73400320\nAUTH LOGIN
PLAIN\nAUTH=LOGIN\nMAILCOMPRESS\n8BITMIME'
send: 'AUTH PLAIN ADI2OTY3MDk2NjdAcXEuY29tAGhrcm1ya2x1cm5ic2RlYmk=\r\n'
reply: b'235 Authentication successful\r\n'
reply: retcode (235); Msg: b'Authentication successful'
send: 'mail FROM:<2696709667@qq.com> size=202\r\n'
reply: b'250 Ok\r\n'
reply: retcode (250); Msg: b'Ok'
send: 'rcpt TO:<wkb1997@dingtalk.com>\r\n'
reply: b'250 Ok\r\n'
reply: retcode (250); Msg: b'Ok'
send: 'data\r\n'
reply: b'354 End data with <CR><LF>.<CR><LF>\r\n'
reply: retcode (354); Msg: b'End data with <CR><LF>.<CR><LF>'
data: (354, b'End data with <CR><LF>.<CR><LF>')
send: b'Content-Type: text/plain; charset="utf-8"\r\nMIME-Version: 1.0\r\nConten
t-Transfer-Encoding: base64\r\nFrom: \r\nTo: \r\nSubject: =?utf-8?b?5p2l6IeqS2Vi
aW4uV2FuZ+OAgeOAgQ==?=\r\n\r\nSGVsbG8sIHNlbmQgYnkgUHl0aG9uLi4u\r\n.\r\n'
reply: b'250 Ok: queued as \r\n'
reply: retcode (250); Msg: b'Ok: queued as'
data: (250, b'Ok: queued as')
send: 'quit\r\n'
reply: b'221 Bye\r\n'
reply: retcode (221); Msg: b'Bye'

E:\pytonPro>

发送成功 效果如图

image

需要注意的坑

  • 源码文件不可命名为email.py,一开始我以此命名,结果解决这个错误花了好长时间
  • 如果看了廖雪峰的教程出错,要把smtplib.SMTP改成smtplib.SMTP_SSL,状态码改成465,


本文标题:Python使用SMIP发送邮件

文章作者:Kebin.Wang

发布时间:2018年06月12日 - 00:06

原始链接:https://yyping.top/python_01/

许可协议: 署名-非商业性使用-禁止演绎 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!

分享到: