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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
2021-12-30 linux共享文件之NFS