Python邮件处理


发送邮件

文字邮件

import smtplib

from email.mime.text import MIMEText
from email.header import Header

# 邮箱用户名
sender = '2993431608@qq.com'
# 邮箱密码;这个是授权码
password = 'shou'

# 收件人无论是否只有一个收件人都必须是列表
receiver = ['2415647901@qq.com',]

# 邮件正文
message = MIMEText('使用python发送邮件','plain','utf-8') # plain表示消息体的格式是文本

# 发件人显试的名字
message['Form'] = Header('Python邮件','utf-8')

# 收件人显试的名字To
message['To'] = Header('邮件','utf-8')

# 邮件标题
# MIMEText是一个字典对象,包含Form键的值代表收件人信息:收件人名;Subject:代表邮件标题
message['Subject'] = 'Python SMTP 发送邮件'

try:
    # 使用QQ邮箱服务器发送
    # stmp对象的构建
    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格式邮件

import smtplib

# 邮件构造这两个包就可以构造成一个邮件
from email.mime.text import MIMEText
from email.header import Header

# 邮箱用户名
sender = '2993431608@qq.com'
# 邮箱密码,授权码
password = 'deokfhrgzojvddfh'
# 收件人,一定是个列表的形式
receiver = ['2993431608@qq.com',]

# 邮件正文
msg = '''

改变MIMEText构造函数的第二个参数为html就会发送html格式文件


我的博客 ''' # 指定消息体发送 message = MIMEText(msg,'html','utf-8') # 发件人姓名 message['From'] = Header('Python邮件','utf-8') # 收件人显式的名字 message['To'] = Header('jj','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.SMTPResponseException as e: print(e)

HTML格式邮件

import smtplib

# 邮件构造这两个包就可以构造成一个邮件
from email.mime.text import MIMEText
from email.header import Header

# 邮箱用户名
sender = '2993431608@qq.com'
# 邮箱密码,授权码
password = 'deokfhrgzojvddfh'
# 收件人,一定是个列表的形式
receiver = ['2993431608@qq.com',]

# 邮件正文
msg = '''

改变MIMEText构造函数的第二个参数为html就会发送html格式文件


我的博客 ''' # 指定消息体发送 message = MIMEText(msg,'html','utf-8') # 发件人姓名 message['From'] = Header('Python邮件','utf-8') # 收件人显式的名字 message['To'] = Header('jj','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.SMTPResponseException as e: print(e)

附件邮件

from email import message
import smtplib


from email.mime.text import MIMEText
from email.header import Header

# 多家一个multipart模块
from email.mime.multipart import MIMEMultipart
user = '2993431608@qq.com'
password = 'deokfhrgzojvddfh'
reseivr = ['2993431608@qq.com',]

# 构建邮件主体

# 指定消息为发送复合型类型
message = MIMEMultipart()

# 发件人名字
message['From'] = Header('From别打错了')
# 收件人名字
message['To'] = Header('To别打错了')
# 邮件标题
message['Subject'] ='这个不用采用Header'
# 邮件正文
msg ='''

hello you


这是百度 ''' message.attach(MIMEText(msg,'html','utf-8')) # 添加附件;这个附件是发送本身邮件,他是如何实现的,采用了什么获取到这个文件,是__file__么 attached_file = MIMEText(open(__file__,encoding='utf-8').read(),'base64','utf-8') #指定附件的文件名可以和原先的文件名不一样 attached_file["Content-Disposition"] = 'attachment;filename="mail.py"' # 看不懂,看看效果再说 message.attach(attached_file) try: smtp = smtplib.SMTP_SSL('smtp.qq.com',465) smtp.login(user,password) smtp.sendmail(user,reseivr,message.as_string()) # message记得加as_string() print('发送成功') except smtplib.SMTPException as e: print(e)

附件为图片的邮件

from email import message
from email import header
import smtplib

from email.mime.text import MIMEText
from email.header import Header

# 构造符合类型的消息体
from email.mime.multipart import MIMEMultipart
# 发送照片需要的模块
from email.mime.image import MIMEImage
# 用户名
sender = '2993431608@qq.com'
# 用户密码
password = 'deokfhrgzojvddfh'
# 收件人
receiver= ['2993431608@qq.com',]

# 采用related定义内嵌资源的邮件体
message = MIMEMultipart('related')

# 发件人显式的名字 #这里写错Form
message['From'] = Header('默认上','utf-8')
# 收件人显示的名字
message['To'] = Header('收信人','utf-8')
# 邮件标题
message['Subject'] = '附件的邮件'

# 邮件正文
msg_content = MIMEMultipart('alternative') # alternative啥意思
mail_msg = '''

123

图片

''' # 在这里构造邮件主体 msg_content.attach(MIMEText(mail_msg,'html','utf-8')) message.attach(msg_content) # 添加图片 with open(r'邮件处理\SMTP\640.jpg','rb') as f: img1 = MIMEImage(f.read()) # 定义资源的名字 img1 img1.add_header("Content-ID",'img1') message.attach(img1) # 构造邮件主体结束 try: sm = smtplib.SMTP_SSL('SMTP.qq.com',465) sm.login(sender,password) sm.sendmail(sender,receiver,message.as_string()) print('能执行到这一步代表发送成功了') except smtplib.smtplib.SMTPException as e : print(e)

接收邮件并读取

pop3协议允许对服务器上的邮件进行的操作都是在客户端上操作的,也就是说在客户端指向的任何操作都不会
反馈到服务器上,比如移动邮件,删除邮件等,但你可以查看邮件并导出邮件

IMAP协议提供Webmail与电子邮件客户端之间的双向通信,任何在客户端上做的改变都会同步到服务器上。
他还能更好的支持在多个不同设备上随时访问新邮件的功能

IMAP接收邮件

import imaplib
import email

# 邮箱用户名
sender = '2993431608@qq.com'
# 邮箱密码;这个是授权码
password = 'deokfhrgzojvddfh' # deokfhrgzojvddfh

#连接邮箱服务器
imap_server = imaplib.IMAP4_SSL('imap.qq.com',993)

# 登录邮箱服务器
# 报错,不会qq邮箱不支持把;我并没有把这个设置打开
imap_server.login(sender,password) #  b'Login fail. Password is incorrect or service is not open'

print('------------LOG------------')
imap_server.print_log()
print('------------LOG------------')

# 获取邮件目录
r,d = imap_server.list()
print(d)

# 选择默认邮件箱,并打印邮件数量
r,d = imap_server.select('INBOX')
print(r,d)
print(d[0])

# 获取最新的邮件
t,l = imap_server.fetch(d[0],'(RFC822)')

# 解析出邮件
msg = email.message_from_string(l[0][1].decode('utf-8'))
imap_server.close()

pop3接收邮件

#你能看一遍,,或者看几遍书上的代码,然后记住些啥,可以模仿的写下代码
# 记住有哪些变量,有哪些函数,函数的作用,函数的参数
import poplib
from email.parser import Parser

# 邮箱用户名
sender = '2993431608@qq.com'
# 邮箱密码;这个是授权码
password = 'deokfhrgzojvddfh'

#连接邮箱服务器
pop_server = poplib.POP3_SSL('pop.qq.com',995)

# 打印出邮箱服务器的欢迎文字
print(pop_server.getwelcome().decode('utf-8'))

# 登录邮箱服务器
pop_server.user(sender)
pop_server.pass_(password)

# 打印出当前账户的状态
# 第一个返回值为邮件数,第二个返回值为占用空间
print('server start',pop_server.stat()) # 这里是stat
 
# 获取所有邮件列表
r,m,o = pop_server.list()
print(m) # 

# 获取最新的一封邮件(序号最大的),邮件索引从1开始计数
index = len(m)
print('邮件个数:',index) #  62,我肯定不止62封邮件
r,l,o = pop_server.retr(index)

msg_content = b'\r\n'.join(l).decode('utf-8')
# 解析出邮件
msg = Parser().parsestr(msg_content)
# 可以根据邮件索引号直接从服务器删除邮件
# pop_server.dele(msg) #  您没有权限使用pop3功能,这里不能删除么
# 关闭连接
pop_server.quit()

pop3接收邮件

#你能看一遍,,或者看几遍书上的代码,然后记住些啥,可以模仿的写下代码
# 记住有哪些变量,有哪些函数,函数的作用,函数的参数
import poplib
from email.parser import Parser

# 邮箱用户名
sender = '2993431608@qq.com'
# 邮箱密码;这个是授权码
password = 'deokfhrgzojvddfh'

#连接邮箱服务器
pop_server = poplib.POP3_SSL('pop.qq.com',995)

# 打印出邮箱服务器的欢迎文字
print(pop_server.getwelcome().decode('utf-8'))

# 登录邮箱服务器
pop_server.user(sender)
pop_server.pass_(password)

# 打印出当前账户的状态
# 第一个返回值为邮件数,第二个返回值为占用空间
print('server start',pop_server.stat()) # 这里是stat
 
# 获取所有邮件列表
r,m,o = pop_server.list()
print(m) # 

# 获取最新的一封邮件(序号最大的),邮件索引从1开始计数
index = len(m)
print('邮件个数:',index) #  62,我肯定不止62封邮件
r,l,o = pop_server.retr(index)

msg_content = b'\r\n'.join(l).decode('utf-8')
# 解析出邮件
msg = Parser().parsestr(msg_content)
# 可以根据邮件索引号直接从服务器删除邮件
# pop_server.dele(msg) #  您没有权限使用pop3功能,这里不能删除么
# 关闭连接
pop_server.quit()

解析邮件

# 解析邮件的过程刚好与构造邮件的过程相反

import poplib
from email.parser import Parser
from email.header import decode_header # 解析出错,不知道怎么判断消息体的类型或编码
from email.utils import parseaddr

# 登录邮箱
username = '2993431608@qq.com'
password = 'deokfhrgzojvddfh'

# 连接邮箱服务器
pop_server= poplib.POP3_SSL('pop.qq.com',995)
# 打印出邮箱服务器的欢迎文字
print(pop_server.getwelcome().decode('utf-8'))

# 登录邮箱服务器
pop_server.user(username)
pop_server.pass_(password)

# 打印出当前状态
print('server stat',pop_server.list())

# 获取邮件列表
resp,mail,octets = pop_server.list()
print(mail)

# 获取最新的一封邮件(序号最大),索引从1开始
index = len(mail)
resp,lines,octets = pop_server.retr(index)


msg_content = b'\r\t'.join(lines).decode('utf-8')
# 解析邮件
msg = Parser().parsestr(msg_content)
# 应该没权限删除
pop_server.dele(index)

# 关闭连接
pop_server.quit()

def decode_email(s):
    if not s:
        return ''
        # 判断消息头的类型出错误么
    value,charset = decode_header(s)[0] # 这value作用是啥
    if charset:
        value = value.decode(charset)
    return value

# 打印邮件的发件人、收件人和主题
mail_from = msg.get('From','') #  #不把空格''替换成"utf-8"没关系
hdr,mail_from_addr = parseaddr(mail_from)
mail_from_name = decode_email(hdr)
print('发件人',mail_from_name,mail_from_addr)

mail_to = msg.get('To','') #  #不把空格''替换成"utf-8"没关系
hdr,mail_from_addr = parseaddr(mail_to)
mail_to_name = decode_email(hdr)
print('收件人',mail_to_name,mail_from_addr)

subject = decode_email(msg.get('Subject','')) #不把空格''替换成"utf-8"没关系
print('主题',subject)

# 递归解析邮件
def decode_mime(msg):
    if msg.is_multipart():
        parts = msg.get_patload()
        for part in parts:
            print(decode_email(part))
    else:
        content_type = msg.get_content_type() # content_type是什么
        if content_type in ('text/plain','text/html'):
            content = msg.get_payload(decode=True) # content是什么
            print(content)
        else:
            print('Attachement',content_type)
decode_email(msg)