python 收发邮件 学习笔记

导包并进行连接收信箱服务:

复制代码
class IMAP:
    def __init__(self, user_id, password, imap_server):
        self.user_id = user_id  # 邮箱地址
        self.password = password
        self.imap_server = imap_server

        try:
            serv = imaplib.IMAP4_SSL(self.imap_server)  # SSL加密
            print('imap4 服务器连接成功')
            try:
                serv.login(self.user_id, self.password)
                print('imap4 登录成功')
            except Exception as e:
                print('imap4 登录失败:', e)
        except Exception as e:
            print('imap4 服务器连接失败:', e)

        self.serv = serv
复制代码

收取邮件,可选多种条件('ALL','UNSEEN','(SINCE"15-jun-2022")')

复制代码
    def get_content(self):
        # select 可以选择收信或者发信箱
        self.serv.select()
        ret, data = self.serv.search(None, 'UNSEEN')  # 未读邮件
        # 邮件列表
        email_list = data[0].split()    
     
if len(email_list) == 0:
pass
# exit(1)
# 获取最后一封邮件的序号
item = email_list # [len(email_list) - 1]
data_list = []
txt_data_List = []
for item in item:
data_dic = {}
# 获取最后一封邮件内容
ret, data = self.serv.fetch(item, '(RFC822)')

msg = email.message_from_string(data[0][1].decode('utf-8'))
sub = msg.get('subject')
email_from = msg.get('from')
email_to = msg.get('to')
sub_text = email.header.decode_header(sub)
email_from_text = email.header.decode_header(email_from)
email_to_text = email.header.decode_header(email_to)
date = email.header.decode_header(msg.get('date'))

format_time = time_format(date[0][0], '%a, %d %b %Y %H:%M:%S +0800', '%Y-%m-%d %H:%M:%S')
# print(type(date[0][0]), '时间:', format_time)
# 如果是特殊字符,元组的第二位会给出编码格式,需要转码
if sub_text[0]:
sub_detail = self.tuple_to_str(sub_text[0])
email_from_detail = ''
for i in range(len(email_from_text)):
email_from_detail = email_from_detail + self.tuple_to_str(email_from_text[i])
email_to_detail = ''
for i in range(len(email_to_text)):
email_to_detail = email_to_detail + self.tuple_to_str(email_to_text[i])
data1 = ''
for i in range(len(date)):
data1 = data1 + self.tuple_to_str(date[i])
data_dic['主题'] = sub_detail
data_dic['发件人'] = email_from_detail
data_dic['收件人'] = email_to_detail
data_dic['时间'] = format_time
attach = []

count = 0
for part in msg.walk():
if not part.is_multipart():
content_type = part.get_content_type()
name = part.get_filename()
if name:
trans_name = email.header.decode_header(name)
if trans_name[0][1]:
file_name = trans_name[0][0].decode(trans_name[0][1])
else:
file_name = trans_name[0][0]
print('开始下载附件:', file_name)
attach_data = part.get_payload(decode=True)
try:
f = open('donwload/' + file_name, 'wb')
except Exception as e:
print(e)
f = open('tmp', 'wb')
f.write(attach_data)
f.close()
print('附件下载成功:', file_name)
attach.append(file_name)
else:
# 文本内容
txt = part.get_payload(decode=True)
# print(BeautifulSoup(decode_byte(txt), 'lxml'))
# html_sup = BeautifulSoup(decode_byte(txt), 'lxml').find_all('div')
          # 使用bs4解析 返回resultset 首先注意邮件本身发回的decode_byte(txt)是字符串,所以resultset和字符串本身可以相互转换 所以可以先将字符串进行裁剪在通过lxml解析 以解决部分不规则内容
          # 使用css 选择器可以解决大部分选择器
          #resultset 有clear() 函数 用于清理某些不需要的内容

if content_type == 'text/html':
sup = BeautifulSoup(decode_byte(txt), 'lxml')

复制代码

发送邮件: 首先在flask的config中加载配置

# 服务器
MAIL_SERVER = ''
#用户名
# MAIL_USERNAME ='' 
#密码
MAIL_PASSWORD = ''
# 发信人信息
MAIL_DEFAULT_SENDER = ('徐健发', '421803497@qq.com')

  

复制代码
app = Flask(__name__, template_folder='templates')
mail = Mail(app)
def send_mail(subject, to, html, body, attach):
  # 创建message 对象 message
= Message(subject, recipients=[to], html=body + '<br><br><br>' + html) for att in attach: with app.open_resource(f'../{att}') as fp: message.attach(f"{att}", 'file/xls', fp.read()) with app.app_context(): mail.send(message) print('发送成功')
复制代码

 

  

posted @   徐徐徐1  阅读(244)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示