SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
首先,我们来构造一个最简单的纯文本邮件:
from email.mime.text import MIMEText
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
注意到构造MIMEText对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入’plain’,最终的MIME就是’text/plain’,最后一定要用utf-8编码保证多语言兼容性。[1]
收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上。收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3。
Python内置一个poplib模块,实现了POP3协议,可以直接用来收邮件。
注意到POP3协议收取的不是一个已经可以阅读的邮件本身,而是邮件的原始文本,这和SMTP协议很像,SMTP发送的也是经过编码后的一大段文本。
要把POP3收取的文本变成可以阅读的邮件,还需要用email模块提供的各种类来解析原始文本,变成可阅读的邮件对象。
所以,收取邮件分两步:
第一步:用poplib把邮件的原始文本下载到本地;
第二部:用email解析原始文本,还原为邮件对象。[2]
综合应用实例:
import smtplib
from email.mime.text import MIMEText
from email.mime.message import MIMEMessage
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import poplib
#生成带有html格式的邮件内容
username=‘215658134@qq.com’
password=‘qvcbgvqyiqzzbies’
def makeHtmlMail():
email=MIMEMultipart(‘alternative’)
text=MIMEText('第一封邮件\n ',‘plain’)
html=MIMEText(‘
hello!
’,‘html’)email.attach(html)
email.attach(text)
return email
def makeImgMail(fn):
f=open(fn,‘rb’)
data=f.read()
f.close()
image=MIMEImage(data,name=fn)
image.add_header(‘Connect-Dispostion’,‘attachment;filename="%s"’%fn)
return image
def sendmail(user,passwd,touser,msg):
server=smtplib.SMTP(‘smtp.qq.com’)
print(“正在登录”)
server.login(user,passwd)
print(“登录成功”)
server.sendmail(user,touser,msg.as_string())
print(“发送成功”)
def pop3Obtain(user,passwd):
pop3server=poplib.POP3(‘pop.qq.com’)
pop3server.set_debuglevel(1)
pop3server.user(user)
pop3server.pass_(passwd)
print(“已登录pop3服务器”)
resp,mails,octets=pop3server.list()
index=len(mails)
rsp,lines,size=pop3server.retr(index)
msg_content=b’\r\n’.join(lines).decode(‘utf-8’)
print(msg_content)
if name==‘main’:
print(“等待发送邮件”)
‘’’
user=input(“发送人:”)
passwd=input(“发送人密码:”)
touser=input(“收件人密码:”)
‘’’
user=‘215658134@qq.com’
touser=‘2463822717@qq.com’
passwd=‘qvcbgvqyiqzzbiea’
i=int(input(‘发送html格式邮件(0) or 发送图片附件(1)?’))
if i == 0:
msg = makeHtmlMail()
print(“geshi1:”, type(msg))
msg[‘From’] = user
msg[‘To’] = touser
msg[‘Subject’] = ‘测试邮件’ # 邮件的主题
elif i ==1:
fn=input(“附件图片地址:”)
if not fn:
fn=‘C:\Users\21565\Desktop\垃圾代码\ceshi.png’
msg = makeImgMail(fn)
msg[‘From’]=user
msg[‘To’]=passwd
msg[‘Subject’]=‘图片测试’
sendmail(user,passwd,touser,msg)
pop3Obtain(user,passwd)
[1]文本来源:https://www.liaoxuefeng.com/wiki/897692888725344/923057144964288
[2]文本来源:
https://www.liaoxuefeng.com/wiki/897692888725344/967961517614816