1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| import imaplib, email from email.utils import parseaddr from email.header import decode_header from email.mime.multipart import MIMEMultipart class jieshou:
def __init__(self, imap_host,imap_port,username, password): self.mail = imaplib.IMAP4_SSL(imap_host,imap_port) self.mail.login(username, password) self.select("INBOX") print("登录成功\n") def select(self, selector): return self.mail.select(selector) def search(self, charset, *criteria): try: se = ",".join(criteria) return self.mail.search(charset, se) except Exception as e: print(f"发生错误 更改为选择默认未读邮件:{e}") return self.mail.search(charset, "ALL") def getUnread(self,tj): tj = tj.strip() return self.search("utf-8",tj)
def getEmailFormat(self, num): data = self.mail.fetch(num, 'RFC822') if data[0] == 'OK': return email.message_from_bytes(data[1][0][1]) else: return "fetch error"
def getSenderInfo(self, msg): name = email.utils.parseaddr(msg["from"])[0] deName = email.header.decode_header(name)[0] if deName[1] is not None: name = deName[0].decode(deName[1]) address = email.utils.parseaddr(msg["from"])[1] return (name, address)
def getReceiverInfo(self, msg): name = email.utils.parseaddr(msg["to"])[0] deName = email.header.decode_header(name)[0] if deName[1] is not None: name = deName[0].decode(deName[1]) address = email.utils.parseaddr(msg["to"])[1] return (name, address)
def getSubjectContent(self, msg): deContent = decode_header(msg['subject'])[0] if deContent[1] is not None: return deContent[0].decode(deContent[1]) return deContent[0]
def parse_attachment(self, message_part): content_disposition = message_part.get("Content-Disposition", None) if content_disposition: file_data = message_part.get_payload(decode=True) attachment = {} attachment["content_type"] = message_part.get_content_type() deName = decode_header(message_part.get_filename())[0] name = deName[0] if deName[1] is not None: name = deName[0].decode(deName[1]) attachment["name"] = name attachment["data"] = file_data return attachment return None
def getMailInfo(self, num): msg = self.getEmailFormat(num) attachments = [] print("主题:" + self.getSubjectContent(msg) + "\n") print("发件人: " + self.getSenderInfo(msg)[0] + " 发件人邮箱: " + self.getSenderInfo(msg)[1] + "\n") print("收件人: " + self.getReceiverInfo(msg)[0] + " 收件人邮箱: " + self.getReceiverInfo(msg)[1] + "\n") for part in msg.walk(): attachment = self.parse_attachment(part) if part.get_content_type() == "text/plain": body = part.get_payload(decode=True).decode('utf-8', errors='ignore') print(body) if part.get_content_type() == "text/html": html = part.get_payload(decode=True).decode('utf-8', errors='ignore') print(html) if attachment: attachments.append(attachment) if len(attachments) != 0: print("附件:\n") for idx, att in enumerate(attachments): print(f"{idx + 1}:Name: {att['name']}\n") print('-' * 50) return { 'attachments': attachments, }
|