|
100鱼币
本帖最后由 shenshuai 于 2019-11-27 01:03 编辑
大佬们,我在网上找到一个可以输入指定的标题下载附件。但是这里面有个问题,如果一个人发了很多标题一样的邮件很多次,那这个程序就会下载所有的附件。
我现在想把这段代码改一下, 改成按照时间顺序来下载。下载这个标题下最新时间的附件,应该怎么做啊?
这是代码:
- def decode_str(s):
- if not s:
- return None
- value, charset = decode_header(s)[0]
- if charset:
- value = value.decode(charset)
- return value
- def get_mails(prefix):
- host = 'pop.qq.com'
- username = 'email '
- password = 'password'
-
- server = poplib.POP3(host)
- server.user(username)
- server.pass_(password)
- # 获得邮件
- messages = [server.retr(i) for i in range(1, len(server.list()[1]) + 1)]
- messages = [b'\r\n'.join(mssg[1]).decode() for mssg in messages]
- messages = [Parser().parsestr(mssg) for mssg in messages]
- print("===="*10)
- messages = messages[::-1]
- for message in messages:
- subject = message.get('Subject')
- subject = decode_str(subject)
- #如果标题匹配
- if subject and subject[:len(prefix)] == prefix:
- value = message.get('From')
- if value:
- hdr, addr = parseaddr(value)
- name = decode_str(hdr)
- value = u'%s <%s>' % (name, addr)
- print("发件人: %s" % value)
- print("标题:%s" % subject)
- for part in message.walk():
- fileName = part.get_filename()
- fileName = decode_str(fileName)
- # 保存附件
- if fileName:
- with open(fileName, 'wb') as fEx:
- data = part.get_payload(decode=True)
- fEx.write(data)
- print("附件%s已保存" % fileName)
- server.quit()
- if __name__ == '__main__':
- prefix = 'first demo'
- get_mails(prefix)
复制代码
本帖最后由 XiaoPaiShen 于 2019-11-28 03:28 编辑
我用 imaplib 实现了下载最新标题的功能,只是我无法在QQ邮箱测试,你试试运行对不对
- import imaplib
- import email
- from email.header import decode_header
- class Email_Checker:
- def __init__(self, email='', password='', server='imap.gmail.com'):
- self.server = server
- self.email = email
- self.password = password
- self.mail = imaplib.IMAP4_SSL(self.server)
- self.mail.login(self.email, self.password)
- self.mail.select('inbox')
- self.mail_content = {'plain': None, 'html': None}
- self.mail_messages = list()
- def decode_content(self, content):
- if not content:
- return None
- value, charset = decode_header(content)[0]
- if charset:
- value = value.decode(charset)
- return value
- def filter_mails(self, title):
- status, data = self.mail.uid('search', None, "ALL")
- email_uids = data[0].split()
- for uid in email_uids:
- status, content = self.mail.uid('fetch', uid, '(RFC822)')
- raw_email = content[0][1]
- message = email.message_from_bytes(raw_email)
- mail_subject = message['subject']
- if mail_subject == title:
- self.mail_messages.append(message)
- def get_content(self, message):
- for part in message.walk():
- if part.is_multipart:
- content_type = part.get_content_type()
- charset = part.get_content_charset()
- print("Content_Type: {0} Charset: {1}".format(content_type, charset))
- if content_type == 'text/plain':
- self.mail_content['plain'] = part.get_payload(decode=True).decode(charset)
- elif content_type == 'text/html':
- self.mail_content['html'] = part.get_payload(decode=True).decode(charset)
-
- else:
- self.mail_content['plain'] = message.get_payload(decode=True).decode(charset)
- return self.mail_content['plain'].strip() if self.mail_content['plain'] else self.mail_content['html'].strip()
- def download_attachment(self, message):
- for part in message.walk():
- if part.get_content_maintype() == 'multipart':
- continue
- if part.get('Content-Disposition') is None:
- continue
- filename = part.get_filename()
- filename = self.decode_content(filename)
- # print('FileName: ', filename)
- if not filename:
- continue
-
- # save attachment
- with open(filename, 'wb') as attach:
- data = part.get_payload(decode=True)
- attach.write(data)
- print("attachment {0} saved".format(filename))
- if __name__ == '__main__':
- host = 'pop.qq.com'
- username = 'email '
- password = 'password'
- title = 'first demo'
- checker = Email_Checker(username, password, host)
- checker.filter_mails(title)
- lastest_msg = checker.mail_messages[-1]
- checker.download_attachment(lastest_msg)
复制代码
|
最佳答案
查看完整内容
我用 imaplib 实现了下载最新标题的功能,只是我无法在QQ邮箱测试,你试试运行对不对
|