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