邮件处理

发送电子邮件

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值