本文摘自php中文网,作者不言,侵删。
本篇文章给大家带来的内容是关于python发送邮件SMTP的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。如何使用Python将生成的测试报告以邮件附件的形式进行发送呢?
一、概要
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件,它对smtp协议进行了简单的封装。
Python对SMTP支持有smtplib和email两个模块。其中email负责构造邮件,smtplib则负责发送邮件。
来理一理Python发送一个未知MIME类型的文件附件基本思路:
1 2 3 4 5 6 7 8 9 10 11 12 | 0、前提:导入邮件发送模块
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
1、构造MIMEMultipart对象作为根容器
2、构造MIMEText对象作为邮件显示内容并附加到根容器
a、读入文件内容并格式化
b、设置附件头
3、设置根容器属性
4、得到格式化后的完整文本
5、用smtp发送邮件
6、封装成sendEmail类。
|
二、邮件发送要素
同时想想我们要发送邮件的几个要素:
1 2 3 4 5 6 7 8 | 1、服务器。以QQ邮箱举例,则为smtp.qq.com
2、端口号。有465和587,请使用587
3、发送者。
4、密码。密码总不能直接写在文件里吧?哈哈,这里需要使用qq邮箱获取授权码。
5、收件人。(可能还不止一个)
6、发送邮件的主题subject。
7、邮件文本内容。
8、附件。
|
因为之前写过如何读取.ini配置文件,所以此部分,将发送邮件的一些要素放在了配置文件中,配置文件如下:

对应读取配置文件脚本为:(readConfig.py部分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import os
import configparser
# config
cur_path = os.path.dirname(os.path.relpath( __file__ ))
configPath = os.path.join(cur_path, 'config.ini' )
conf = configparser.ConfigParser()
conf.read(configPath)
def get_smtpServer(smtpServer):
smtp_server = conf.get( 'email' ,smtpServer)
return smtp_server
#
......
|
三、邮件部分
构建MIMEMultipart()邮件根容器对象后,需要借助根容器来定义邮件的各个要素,比如邮件主题subject、发送人from、接收人to、邮件正文body、邮件附件等。
如何给邮件定主题、收发人呢?
1 2 3 4 5 6 7 | # 构建根容器
msg = MIMEMultipart()
# 邮件主题、发送人、收件人、内容,此部分可以来自配置文件,也可以直接填入
msg[ 'Subject' ] = self.mail_subject # u '自动化测试报告'
msg[ 'from' ] = self.mail_sender
msg[ 'to' ] = self.mail_pwd
|
如何定义邮件正文body部分呢?
1 2 3 4 5 | # 邮件正文部分body,1、可以用HTML自己自定义body内容;2、读取其他文件的内容为body
# body = "您好,<p>这里是使用Python登录邮箱,并发送附件的测试<\p>"
with open(reportFile, 'r' ,encoding= 'UTF-8' ) as f:
body = f.read()
msg.attach(MIMEText(_text=body, _subtype= 'html' , _charset= 'utf-8' )) # _charset 是指Content_type的类型
|
如何给邮件添加附件呢?
1 2 3 4 5 | # 添加附件
attachment = MIMEText(_text=open(reportFile, 'rb' ).read(), _subtype= 'base64' ,_charset= 'utf-8' )
attachment[ 'Content-Type' ] = 'application/octet-stream'
attachment[ 'Content-Disposition' ] = 'attachment;filename = "result.html"'
msg.attach(attachment)
|
如何发送?
发送四部曲:取得服务器连接、再登录邮箱、发送邮件、退出。
大致如下啦:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | try :
smtp = smtplib.SMTP_SSL(host=self.mail_smtpserver, port=self.mail_port) # 继承自SMTP
except:
smtp = smtplib.SMTP()
smtp.connect(self.mail_smtpserver, self.mail_port)
# smtp.set_debuglevel(1)
# 创建安全连接,加密SMTP
smtp.starttls() # Puts the connection to the SMTP server into TLS mode.
# 用户名和密码
smtp.login(user=self.mail_sender, password=self.mail_pwd)
# 函数:sendmail(self, from_addr, to_addrs, msg, mail_options=[],rcpt_options=[]):
smtp.sendmail(self.mail_sender, self.mail_receiverList, msg.as_string())
smtp.quit()
|
在里面添加了一句smtp.starttls()
。这一句是用来加密SMTP会话,保证邮件安全发送不被窃听的。
在创建完SMTP对象后,立刻调用starttls()
方法即可。
其实整个下来邮件发送模块也就完成了。
四、问题
在这个过程中有遇见几个问题,也贴上来跟大家一起分享一下。
抛错535
抛错:smtplib.SMTPAuthenticationError: (535, b'Error:
xc7xebxcaxb9xd3xc3xcaxdaxc8xa8xc2xebxb5xc7xc2xbcxa1xa3xcfxeaxc7xe9xc7xebxbfxb4:
http://service.mail.qq.com/cg...')
解决办法:点击最后的链接,其实是因为授权码问题
替换授权码后继续报错,535
解决办法:替换端口。因为qq邮箱ssl协议端口有两个:465/587。
报错:smtplib.SMTPAuthenticationError: (530, b'Must issue a STARTTLS command first.')
解决方法:在login()之前,添加一句:smtp.starttls()
五、代码all
下面贴上整个文件,这个文件是依赖于其他文件的的,所以仅供参考,但是方法是一样的。
阅读剩余部分
相关阅读 >>
Python里lambda是什么
Python中函数赋值给变量时的问题注意详解
Python函数重写怎么理解
啥是佩奇,Python 告诉你!
Python可以做动图吗
Python中降序用哪个单词
Python怎么读取txt文件
Python如何保留2位小数
Python中hashlib加密模块的分析(代码实例)
Python之正弦曲线实现方法分析
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » python SMTP发送邮件的详细介绍(附代码)