Py-imaplib读取163邮箱

Py-imaplib读取163邮箱

  • 引入包
# -*- coding: utf-8 -*-
import os
import email
import imaplib
import quopri
import datetime
import requests
import json
import time
import hmac
import hashlib
import base64
import urllib.parse
from optparse import OptionParser
import re
  • 链接邮箱
    def login(self):
        imap_server = imaplib.IMAP4_SSL(self.host)
        imap_server.login(self.account, self.password)
        # 解决网易邮箱报错:Unsafe Login. Please contact [email protected] for help
        imaplib.Commands["ID"] = ('AUTH',)
        args = ("name", self.account, "contact", self.account, "version", "1.0.0", "vendor", "myclient")
        imap_server._simple_command("ID", str(args).replace(",", "").replace("\'", "\""))
        return imap_server
  • 通过select选中邮箱,注意如果仅读取邮件内容,不改变邮件未读属性,设置readonly=True。该属性默认为False,读取内容后会将邮件设置为已读。
self.imap_server.select(mailbox='INBOX', readonly=True)
  • 通过search获取邮件ID列表,默认邮件接收时间排序是由远到近。
self.imap_server.search(None, message_type)
  • 通过reversed倒排邮件ID循环fetch读取,获取的邮件内容需要处理,通过email获取邮件可读内容。
 for message_index in reversed(items[0].split()):
            msg_data = Message()
            fetch_status, message = self.imap_server.fetch(message_index, "(RFC822)")
            msg = email.message_from_bytes(message[0][1])
  # walk读取邮件主题,获取附件、主体
  for part in msg.walk():
            if not part.is_multipart():
                content_type = part.get_content_type()
                filename = part.get_filename()
                # 是否有附件
                if filename:
                    file_header = email.header.Header(filename)
                    decode_header = email.header.decode_header(file_header)
                    file_name = decode_header[0][0]
                    data = part.get_payload(decode=True)
                    try:
                        print('Attachment : ' + file_name)
                        # 保存附件
                        if file_name:
                            save_file(file_name, data, save_path)
                            files.append(file_name)
                    except:
                        print(file_name)

                else:
                    if content_type in ['text/plain']:
                        suffix = '.txt'
                    if content_type in ['text/html']:
                        suffix = '.htm'
                    if part.get_charsets() is None:
                        message_content = part.get_payload(decode=True)
                    else:
                        message_content = part.get_payload(decode=True).decode(part.get_charsets()[0])
  • 完整代码
# -*- coding: utf-8 -*-
import os
import email
import imaplib
import quopri
import datetime
import r

你可能感兴趣的:(python,python,开发语言)