1、使用zmail接收邮件
1)安装zmail
pip install zmail
2)使用代码
import zmail mail_pass = '**********' # 使用的qq邮箱发送邮件,为qq邮箱的授权码,非密码,可在网页的邮箱设置中开通,其它邮箱也类似 server = zmail.server('cjavapy@qq.com', mail_pass)
# 获取最新的邮件 mail = server.get_latest() # 通过邮件id获取邮件 mail = server.get_mail(2) # 通过邮件 标题/日期/发送人 查找邮件 mail = server.get_mails(subject='GitHub',start_time='2018-1-1',sender='github') # 查找邮件并列出前10的邮件列表 mail = server.get_mails(subject='GitHub',start_time='2018-1-1',sender='github',start_index=1,end_index=10) # 获取邮箱信息,返回元组(邮件数目,邮箱大小) mailbox_info = server.stat() # Zmail中每一个邮件对应一个字典,通过如下方法获取邮件内容 subject = mail['subject'] # 显示邮件基础信息 mail = server.get_latest() zmail.show(mail) # 显示邮件的所有内容 mail = server.get_latest() for k,v in mail.items(): print(k,v) #验证SMTP和POP是否运转正常 #if server.smtp_able(): # pass # SMTP function. #if server.pop_able(): # pass # POP function.
2、使用imapclient接收邮件
1)安装imapclient
pip install imapclient
2)使用代码
#!/usr/bin/env python # -*- coding: utf-8 -*- # from imapclient import IMAPClient class Imapmail(object): def __init__(self): # 初始化数据 self.serveraddress = None self.user = None self.passwd = None self.prot = None self.ssl = None self.timeout = None self.savepath = None self.server = None def client(self): # 链接 try: self.server = IMAPClient(self.serveraddress, self.prot, self.ssl, timeout=self.timeout) return self.server except BaseException as e: return "ERROR: >>> " + str(e) def login(self): # 认证 try: self.server.login(self.user, self.passwd) except BaseException as e: return "ERROR: >>> " + str(e) def getmaildir(self): # 获取目录列表 [((), b'/', 'INBOX'), ((b'\\Drafts',), b'/', '草稿箱'),] dirlist = self.server.list_folders() return dirlist def getallmail(self): # 收取所有邮件 print(self.server) self.server.select_folder('INBOX', readonly=True) # 选择目录 readonly=True 只读,不修改,这里只选择了 收件箱 result = self.server.search() # 获取所有邮件总数目 [1,2,3,....] #self.server.search(['FROM', 'cjavapy@qq.com'], charset='UTF-8') #self.server.search([u'SINCE', date(2022, 3, 14)]) print("邮件列表:", result) for _sm in result: # data = self.server.fetch(_sm, ['ENVELOPE']) # size = self.server.fetch(_sm, ['RFC822.SIZE']) # print("大小", size) # envelope = data[_sm][b'ENVELOPE'] # print(envelope) # subject = envelope.subject.decode() # if subject: # subject, de = decode_header(subject)[0] # subject = subject if not de else subject.decode(de) # dates = envelope.date # print("主题", subject) # print("时间", dates) msgdict = self.server.fetch(_sm, ['BODY[]']) # 获取邮件内容 mailbody = msgdict[_sm][b'BODY[]'] # 获取邮件内容 with open(self.savepath + str(_sm), 'wb') as f: # 存放邮件内容 f.write(mailbody) def close(self): self.server.close() if __name__ == "__main__": imap = Imapmail() imap.serveraddress = "imap.163.com" # 邮箱地址 imap.user = "xxxxxx" # 邮箱账号 imap.passwd = "xxxxx" # 邮箱密码,QQ邮箱或其它邮箱,可能需要使用授权码 imap.savepath = "" # 邮件存放路径 imap.client() imap.login() imap.getallmail() imap.close() # 'Trash' 回收站邮件 # 'Spam' 垃圾邮件 # 'Sent' 已发送邮件 # 'Drafts' 草稿箱 # 'Archive' 存档 # 'INBOX' 收件箱
3、使用imap_tools接收邮件
1)安装imap_tools
pip install imap-tools
2)使用代码
# 'Trash' 回收站邮件 # 'Spam' 垃圾邮件 # 'Sent' 已发送邮件 # 'Drafts' 草稿箱 # 'Archive' 存档 # 'INBOX' 收件箱 import datetime as dt from imap_tools import MailBox, AND, OR, NOT mail_pass = '**********' # 使用的qq邮箱发送邮件,为qq邮箱的授权码,非密码,可在网页的邮箱设置中开通,其它邮箱也类似 with MailBox('imap.mail.com').login('cjavapy@qq.com', mail_pass, 'INBOX') as mailbox: # 从收件箱文件夹中获取邮件主题列表 subjects = [msg.subject for msg in mailbox.fetch()] # 将所有邮件从当前文件夹(INBOX)移动到folder2 mailbox.move(mailbox.fetch(), 'INBOX/folder2') # 获取带有INBOX子文件夹名称的列表 inbox_subfolders = [folder_info['name'] for folder_info in mailbox.folder.list('INBOX')] # 获取大量的电子邮件 (日期不在 (2020-1-1, 2020-1-2) 并标记,主题包含 "你好") criteria = AND(NOT(OR(date=[dt.date(2020, 1, 11), dt.date(2020, 1, 12)])), flagged=True, subject='你好') for msg in mailbox.fetch(criteria, charset='utf8'): body = msg.text or msg.html print(body)
参考文档:https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28