发送电子邮件
SMTP发送电子邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
#邮箱用户名
sender = "**********@qq.com"
#邮箱密码
password = "****************"
#收件人必须是列表
receiver = ["**********@qq.com",]
#邮件正文
message = MIMEText("使用Python发送的邮件","plain","utf-8")
#发件人现实的名字
message["From"] = Header("Python电子邮件","utf-8")
#收件人显示的名字
message["To"] = Header("邮件","utf-8")
#邮件标题
message["Subject"] = "Python SMTP 发送邮件"
try:
#使用QQ企业邮箱服务器发送
smtp = smtplib.SMTP_SSL("smtp.qq.com",465)
#登录
smtp.login(sender,password)
#发送
smtp.sendmail(sender,receiver,message.as_string())
print("邮件已发送")
except smtplib.SMTPException as e:
print("Error!发送失败",e)
注:该邮箱密码(16位,不是手机上登录的QQ密码)需要去网站http://mail.qq.com中设置POP3/IMAP/SMTP服务,点击设置->账户->POP3/IMAP/SMTP服务,开启或关闭相应服务最后保存更改即可。
发送HTML格式电子邮件
发送HTML电子邮件只要使用MIMEText函数构造邮件消息体的时候将第二个参数指定为“html”即可
发送带附件的电子邮件
附件其实就是另一种格式的MIME,所以在构造邮件消息体的时候使用MIMEMultipart来构造复合类型消息体,然后把文本和附件一个一个的加进去
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
#邮箱用户名
sender = "**********@qq.com"
#邮箱密码
password = "*****************"
#收件人必须是列表
receiver = ["**********@qq.com",]
#指定消息体使用复合类型
message = MIMEMultipart()
#发件人现实的名字
message["From"] = Header("Python电子邮件","utf-8")
#收件人显示的名字
message["To"] = Header("邮件","utf-8")
#邮件标题
message["Subject"] = "Python SMTP 发送邮件"
#邮件正文
mail_msg = """
<p>使用Python发送邮件</p>
"""
#将正文添加到复合体中
message.attach(MIMEText(mail_msg,"html","utf-8"))
#添加附件
attched_file = MIMEText(open(r"C:\Users\Adminisrator\Desktop\haha.txt",encoding="utf-8").read(),"base64","utf-8")
attched_file["Content-Disposition"] = 'attachment;filename="hahaha"' #一定要写这句
message.attach(attched_file)
try:
#使用QQ企业邮箱服务器发送
smtp = smtplib.SMTP_SSL("smtp.qq.com",465)
#登录
smtp.login(sender,password)
#发送
smtp.sendmail(sender,receiver,message.as_string())
print("邮件已发送")
except smtplib.SMTPException as e:
print("Error!发送失败",e)
发送图片
如果我们想发送图片,只需要把图片作为附件添加到邮件消息中,然后在HTML格式正文中使用src = cid:img1格式嵌入即可
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.header import Header
#邮箱用户名
sender = "*******@qq.com"
#邮箱密码
password = "**************"
#收件人必须是列表
receiver = ["*************@qq.com",]
#采用related定义内嵌资源邮件体
message = MIMEMultipart("related")
#发件人现实的名字
message["From"] = Header("Python带图片邮件","utf-8")
#收件人显示的名字
message["To"] = Header("邮件","utf-8")
#邮件标题
message["Subject"] = "Python SMTP 发送邮件"
#邮件正文
msg_content = MIMEMultipart("alternative")
mail_msg = """
<p>使用Python发送邮件</p>
<br>
<p>
图片
<img src = "cid:imgl">
</p>
"""
#将正文添加到复合体中
msg_content.attach(MIMEText(mail_msg,"html","utf-8"))
message.attach(msg_content)
#添加图片
with open(r"C:\Users\Adminisrator\Pictures\Saved Pictures\bb5539f97c433137aeb2148ceb5bad35.jpg","rb") as f:
img1 = MIMEImage(f.read())
#定义资源名为img1
img1.add_header("Content-ID","img1")
message.attach(img1)
try:
#使用QQ企业邮箱服务器发送
smtp = smtplib.SMTP_SSL("smtp.qq.com",465)
#登录
smtp.login(sender,password)
#发送
smtp.sendmail(sender,receiver,message.as_string())
print("邮件已发送")
except smtplib.SMTPException as e:
print("Error!发送失败",e)
接收电子邮件
使用POP3协议下载邮件
import poplib
from email.parser import Parser
#登录邮箱用户名
username = "********@qq.com"
#登录邮箱的密码
password = "************"
#链接邮箱服务器
pop_sever = poplib.POP3_SSL("pop.qq.com",995)
#打印出邮箱服务的欢迎文字
print(pop_sever.getwelcome().decode("utf-8"))
#登录邮箱服务器
pop_sever.user(username)
pop_sever.pass_(password)
#打印出当前账号的状态,第一个返回值为邮件数,第二个返回值为占用空间
print("Sever stat",pop_sever.stat())
#获取邮件列表
resp,mails,octets = pop_sever.list()
print(mails)
#获取最新一封电子邮件
index = len(mails)
resp,lines,octets = pop_sever.retr(index)
msg_content = b'\r\n'.join(lines).decode("utf-8")
#解析出邮件
msg = Parser().parsestr(msg_content)
#可以根据邮件索引号删除邮件
pop_sever.dele(index)
#关闭连接
pop_sever.quit()
使用IMAP协议下载邮件
和使用POP3协议基本相同,在此不做介绍
解析邮件
解析邮件和发送邮件时构造邮件过程正好相反,只要做相反操作就好
解析邮件要比构造邮件繁琐,因为解析邮件需要每时每刻判断消息体的类型和编码。
import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
#登录邮箱用户名
username = "*************@qq.com"
#登录邮箱的密码
password = "*************"
#链接邮箱服务器
pop_sever = poplib.POP3_SSL("pop.qq.com",995)
#打印出邮箱服务的欢迎文字
print(pop_sever.getwelcome().decode("utf-8"))
#登录邮箱服务器
pop_sever.user(username)
pop_sever.pass_(password)
#打印出当前账号的状态,第一个返回值为邮件数,第二个返回值为占用空间
print("Sever stat",pop_sever.stat())
#获取邮件列表
resp,mails,octets = pop_sever.list()
print(mails)
#获取最新一封电子邮件
index = len(mails)
resp,lines,octets = pop_sever.retr(index)
msg_content = b'\r\n'.join(lines).decode("utf-8")
#解析出邮件
msg = Parser().parsestr(msg_content)
#关闭连接
pop_sever.quit()
def decode_emails(s):
if not s:
return ""
value,charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
#打印邮件发件人,收件人和主题
mail_from = msg.get("From","")
hdr,mail_from_addr = parseaddr(mail_from)
mail_from_name = decode_emails(hdr)
print("发件人",mail_from_name,mail_from_addr)
mail_to = msg.get("To","")
hdr,mail_to_addr = parseaddr(mail_to)
mail_to_name = decode_emails(hdr)
print("收件人",mail_to_name,mail_to_addr)
subject = decode_emails(msg.get("Subject",""))
print("主题",subject)
#递归解析邮件
def decode_mime(msg):
if msg.is_multipart():
parts = msg.get_payload()
for part in parts:
print(decode_mime(part))
else:
content_type = msg.get_content_type()
if content_type in ("text/plain","text/html"):
content = msg.get_payload(decode=True)
print(content)
else:
print("Attachement",content_type)
decode_mime(msg)