python发邮件详解,smtplib和email模块详解 在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理。SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是⼀组⽤于由源地址到⽬的地址传送邮件的规则,由它来控制信件的中转⽅式,python实现发邮件也是基于此基础上进⾏封装的。
1.python发邮件所需要的基础包
python发送邮件需要⽤到python⾃带的两个模块,smtplib和email。直接import导⼊,⽆需下载。 python的smtplib提供了⼀种很⽅便的途径发送电⼦邮件,它对smtp协议进⾏了简单的封装。
2.smtplib的⽤法
smtplib⽤法相对来说很简单,就是分为两步。
创建SMTP的操作对象并连接smtp⽬标服务器,可以是163、QQ等
根据⾃⼰的账号登录⽬标服务器(⾃⼰的邮箱地址和邮箱授权码)
调⽤对象中的⽅法,发送邮件到⽬标地址
python与smtp服务器之间的具体交互的通⽤代码:
import smtplib
server = smtplib.SMTP(mailserver, port) # 发件⼈邮箱中的SMTP服务器,端⼝是25
server.login(sender, passwd) # 发件⼈邮箱账号、邮箱授权码
# msg.as_string()中as_string()是将msg(MIMEText或MIMEMultipart对象)变为str。
server.sendmail(sender, receive, msg.as_string())
server.quit()
具体的python连接⽬标服务器的代码如下:注:本⽂章⽤的是qq的smtp服务器。
常⽤邮箱的smtp服务器地址:
新浪邮箱:smtp.sina,搜狐邮箱:smtp.sohu,qq邮箱:smtp.qq
sender_maile='80617252@qq'# 发送⽅的邮箱地址
sender_pass = 'lsjdfsljdfk'# 邮箱提供的授权码,可在第三⽅登录,我这个是随便打的。
sftp_obj =smtplib.SMTP('smtp.qq', 25)
sftp_obj.login(sender_mail, sender_pass)
#三个参数分别是:发件⼈邮箱账号,收件⼈邮箱账号,发送的邮件体
sftp_obj.sendmail(sender_mail, receiver_mail, msg_root.as_string())
sftp_obj.quit()
email模块下的mime模块下有常⽤的三个模块,三个模块中有三个⼤类。其实就是下边这三个了,说的很绕,下边为导⼊⽅式,⼀⽬了然。
from import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
简单说下他们的关系,如果构造⼀个MIMEText对象,就表⽰⼀个⽂本邮件对象,如果构造⼀个MIMEImage对象,就表⽰⼀个作为附件的图⽚对象,要把多个对象组合起来,就⽤MIMEMultipart对象,他代表的是整个邮件。这样说应该还不是很清晰,下边就分开来说,最后会总的总结,在最后边就是完整的代码(可以发送⼀切内容的代码)。 A.MIMEText对象中有三个需要我们设置的参数,⼀个是正⽂内容,⼀个是正⽂内容的类型,例如:”text/plain”和”text/html”,⼀个是正⽂内容的编码。
构造普通⽂本:
text_info = 'hello world '
text_sub = MIMEText(text_info,'plain', 'utf-8')
构造超⽂本:
url = "blog.csdn/chinesepython"
html_info = """
<p>点击以下链接,你会去向⼀个更⼤的世界</p>
<p><a href="%s">click me</a></p>
<p>i am very glasses for you</p>
""" % url
html_sub = MIMEText(html_info, 'html', 'utf-8')
# 如果不加下边这⾏代码的话,上边的⽂本是不会正常显⽰的,会把超⽂本的内容当做⽂本显⽰
html_sub["Content-Disposition"] = 'attachment; filename="csdn.html"'
构造base64数据流,⽤于发送⽂件的时候使⽤,构造附件代码:
txt_file = open(r'D:\python_files\files\', 'rb').read()
txt = MIMEText(txt_file, 'base64', 'utf-8')
txt["Content-Type"] = 'application/octet-stream'
# 命名发送的附件
txt.add_header('Content-Disposition', 'attachment', filename='')
B.MIMEImage对象中只需要把读取的⽂件传⼊就⾏
构造图⽚:
广州天河部落image_file = open(r'D:\python_files\images\test.png', 'rb').read()
image = MIMEImage(image_file)
image.add_header('Content-ID', '<image1>')
# 命名发送的图⽚
image["Content-Disposition"] = 'attachment; filename="red_people.png"'
C.MIMEMultipart对象创建的类型有三种,此模块主要是通过attach⽅法把上边构造的内容传⼊到邮件的整体内容中。
邮件类型为”multipart/alternative”的邮件正⽂中包括纯⽂本正⽂(text/plain)和超⽂本正⽂(text/html)。
邮件类型为”multipart/related”的邮件正⽂中包括图⽚,声⾳等内嵌资源。
邮件类型为”multipart/mixed”的邮件包含附件,图⽚,⽂本等都可以添加,所以发的内容多的话⼀般是⽤这个的,选择mixed类型,什么内容都可以发。
3.邮件头添加内容
直接上⽰例代码:
from email.mime.multipart import MIMEMultipart
msg_root = MIMEMultipart('mixed')
# 发件⼈
msg_root['From'] = 'aaa@qq<aaa@qq>'
# 收件⼈软硬件环境
msg_root['To'] = '666666@qq'
# 邮件主题
subject = 'python sendemail test successful'
msg_root['subject'] = Header(subject, 'utf-8')
4.特别的⽤法说明:
注:以下的msg_root为:
msg_root = MIMEMultipart(‘mixed’)
msg_root.as_string()是将msg_root对象变为str。
msg_root.attach(MIMEText或者MIMEImage对象),因为MIMEMultipart对象代表邮件本⾝,其他连个是代表邮件正⽂,所以这个⽅法还是很强⼤的,把其他的构造内容添加到MIMEMultipart对象中就可以把⽂本,html,附件等⼀起发送了。
5.发送各种内容的具体代码实现:
所有代码合到⼀块,发送⽂本,html,图⽚,txt内容,⽤的时候你可以把需要的部分摘出来,也就是把没有加⼊到msg_root的对象拿出来,直接通过下边命令发送,例如只发送⽂本。
sftp_obj.sendmail(sender_mail, receiver_mail, text_sub.as_string())。
import smtplib
from email.header import Header
from import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
def send_email_by_qq(to):
sender_mail = '80617252@qq'
sender_pass = 'aljflsjdf'#同样是乱打的
# 设置总的邮件体对象,对象类型为mixed
msg_root = MIMEMultipart('mixed')
# 邮件添加的头尾信息等
msg_root['From'] = '80617252@qq<80617252@qq>'
msg_root['To'] = to
# 邮件的主题,显⽰在接收邮件的预览页⾯
牛津小学英语2a教案subject = 'python sendemail test successful'
msg_root['subject'] = Header(subject, 'utf-8')
# 构造⽂本内容
text_info = 'hello world'
text_sub = MIMEText(text_info, 'plain', 'utf-8')
msg_root.attach(text_sub)
# 构造超⽂本
url = "blog.csdn/chinesepython"
html_info = """
<p>点击以下链接,你会去向⼀个更⼤的世界</p>
滨州学院图书馆<p><a href="%s">click me</a></p>
<p>i am very galsses for you</p>
"""% url
html_sub = MIMEText(html_info, 'html', 'utf-8')
# 如果不加下边这⾏代码的话,上边的⽂本是不会正常显⽰的,会把超⽂本的内容当做⽂本显⽰
html_sub["Content-Disposition"] = 'attachment; filename="csdn.html"'
# 把构造的内容写到邮件体中
msg_root.attach(html_sub)
# 构造图⽚
image_file = open(r'D:\python_files\images\test.png', 'rb').read()
image = MIMEImage(image_file)
image.add_header('Content-ID', '<image1>')
# 如果不加下边这⾏代码的话,会在收件⽅⽅⾯显⽰乱码的bin⽂件,下载之后也不能正常打开
image["Content-Disposition"] = 'attachment; filename="red_people.png"'
msg_root.attach(image)
# 构造附件
txt_file = open(r'D:\python_files\files\', 'rb').read()
txt = MIMEText(txt_file, 'base64', 'utf-8')
txt["Content-Type"] = 'application/octet-stream'
铸轧#以下代码可以重命名附件为
txt.add_header('Content-Disposition', 'attachment', filename='')
msg_root.attach(txt)
try:
try:
sftp_obj =smtplib.SMTP('smtp.qq', 25)
sftp_obj.login(sender_mail, sender_pass)
sftp_obj.sendmail(sender_mail, to, msg_root.as_string())
sftp_obj.quit()
print('sendemail successful!')
except Exception as e:
print('sendemail failed next is the reason')
本田crm250print(e)
if __name__ == '__main__':
# 可以是⼀个列表,⽀持多个邮件地址同时发送,测试改成⾃⼰的邮箱地址
to = '666666@qq'
send_email_by_qq(to)
6.总结
为了让不是很理解发邮件的朋友能更好的理解,在这⾥是把所有的参数都写死了,⽐如说发送⽂件的具体内容,在真正开发使⽤过程中,可以把具体的内容通过预留出来参数去传⼊之后发送你想要发送的内容。
发邮件功能还是很实⽤的,在真正的开发中或者⼤多数场合都能⽤到,⽐如说项⽬中⼀个重要的模块如果出问题了,你需要第⼀时间知道,就可以加⼊这个功能,把项⽬出问题报的具体内容发到你的邮箱,也可以第⼀时间想下处理的对策。
下⾯以我通过此程序发送的邮件内容的截图做结尾吧。