python imaplib模块下载邮件附件

Python imaplib下载邮件附件

代码如下:

# 登陆邮箱并读取原始邮件
import imaplib
import email

from django.core.files import File
import io


def get_mail(username, passsword):
    # 选择服务器
    # server = imaplib.IMAP4_SSL('imap.qq.com', 993)  #qq邮箱
    server = imaplib.IMAP4_SSL('imap.gmail.com', 993)  # gmail邮箱
    server.login(username, passsword)
    server.select("INBOX")
    # 搜索未读邮件
    email_type, items = server.search(None, "UNSEEN")
    # 邮件列表,使用空格分割得到邮件索引
    msg_list = items[0].split()
    print(f'未读邮件为{len(msg_list)}')
    count = 0
    """
    下方把count改为1是因为gmail有个问题,就是一次性读取超过1封邮件的时候,第二封的真实数据由原本的data[0][1]变为data[1][1], 而其他的邮箱没有遇到这个问题,所以需要用count来判断一下
    """
    for email_id in msg_list:
        email_type, data = server.fetch(email_id, "(RFC822)")
        if count == 0: 
            email_body = data[0][1]
            count = 1
        else:
            email_body = data[1][1]

        mail = email.message_from_bytes(email_body)

        server.store(email_id, '+FLAGS', '\\Seen')
        server.expunge()
   			from_user = mail["From"].split()[-1][1:-1]  # 发件人的邮箱	

        print("[" + mail["From"] + "] :" + mail["Subject"])  # Subjects是标题
        for part in mail.walk():
            if part.get_content_maintype() == "multipart":
                continue
            if part.get("Content-Disposition") is None:
            	continue
            filename: str = part.get_filename()
            # 如果文件名为纯数字、字母时不需要解码,否则需要解码 不然会报错
            try:
                filename = decode_header(part.get_filename())[0][0].decode(decode_header(part.get_filename())[0][1])
            except:
            	pass
            # 获取二进制数据 使用with open可以直接保存在指定路径下
            file_bytes = part.get_payload(decode=True) 
            # 转换成File对象 可以保存django的FileField/ImageField字段
            file = File(io.BytesIO(file_bytes), name=filename)  

    server.close()
    server.logout()


if __name__ == '__main__':
    username = "xx"  # qq
    # 这里的密码不是原邮箱密码 而是一个需要设置的允许第三方访问的密码
    password = "yy"  # qq
    get_mail(username, password)

下面是开启SMTP/IMAP的方法(上面的密码)
https://www.cnblogs.com/jiyuwu/p/16313476.html

posted @ 2022-12-30 15:00  zong涵  阅读(424)  评论(0编辑  收藏  举报