Artikel ini membawakan anda pengetahuan yang berkaitan tentang Python Ia memperkenalkan secara terperinci cara menggunakan bahasa Python untuk merealisasikan fungsi muat turun e-mel dan penghuraian lampiran secara terperinci lihat di bawah, semoga ia membantu semua.
[Cadangan berkaitan: Tutorial video Python3 ]
Sebelum kita memulakan pengekodan, mari kita fahami tiga protokol perkhidmatan e-mel dahulu :
1. Protokol SMTP
SMTP (Simple Mail Transfer Protocol), iaitu, Simple Mail Transfer Protocol. Ia bersamaan dengan stesen pemindahan dan menghantar e-mel kepada pelanggan.
2. Protokol POP3
POP3 (Protokol Pejabat Pos 3), versi ketiga protokol pejabat pos, ialah standard protokol luar talian yang pertama untuk e-mel. Protokol ini memuat turun e-mel ke komputer tempatan dan tidak menyegerakkan dengan pelayan Kelemahannya ialah ia lebih berkemungkinan kehilangan e-mel atau memuat turun e-mel yang sama beberapa kali.
3. Protokol IMAP
IMAP (Internet Mail Access Protocol), iaitu protokol akses mel interaktif. Protokol ini bersambung ke peti mel jauh untuk operasi terus dan menyegerakkan kandungan dengan pelayan.
Kemudian perkenalkan pakej e-mel
Komponen utama pakej ini ialah "model objek" yang mewakili mesej e-mel. Aplikasi berinteraksi dengan pakej ini terutamanya melalui antara muka model objek yang ditakrifkan dalam submodul mesej. Aplikasi boleh menggunakan API ini untuk bertanya soalan tentang e-mel sedia ada, membina e-mel baharu atau menambah atau mengalih keluar subkomponen e-mel yang menggunakan antara muka model objek yang sama. Iaitu, mengikut sifat mesej e-mel dan subkomponen MIMEnya, model objek e-mel ialah struktur pokok semua objek yang menyediakan API EmailMessage.
Seterusnya, kami menggunakan kod khusus untuk melaksanakan fungsi log masuk ke klien e-mel, memuat turun e-mel dan menghuraikan kandungan lampiran e-mel.
Mula-mula kita perlu menentukan kelas penghuraian e-mel, yang memerlukan tiga pembolehubah:
1 Alamat perkhidmatan imap yang dimiliki oleh e-mel
2.
3. Kata laluan e-mel [Nota: Alamat e-mel yang berbeza memerlukan dasar keselamatan yang berbeza, contohnya, e-mel QQ memerlukan pengesahan SMS untuk mendapatkan kod kebenaran log masuk dan bukannya kata laluan teks yang jelas untuk log masuk ke klien jauh] <.>
class Email_parse: def __init__(self,remote_server_url,email_url,password): # imap服务地址 self.remote_server_url = remote_server_url # 邮箱账号 self.email_url = email_url # 邮箱密码 self.password = password
def main_parse_Email(self): """入口函数,登录imap服务""" server = imaplib.IMAP4_SSL(self.remote_server_url, 993) server.login(self.email_url, self.password) server.select('INBOX') status,data = server.search(None,"ALL") if status != 'OK': raise Exception('read email error') emailids = data[0].split() mail_counts = len(emailids) print("count:",mail_counts) # 邮件的遍历是按时间从后往前,这里我们选择最新的一封邮件 for i in range(mail_counts - 1, mail_counts - 2, -1): status, edata = server.fetch(emailids[i], '(RFC822)') msg = email.message_from_bytes(edata[0][1]) #获取邮件主题title subject = email.header.decode_header(msg.get('subject')) if type(subject[-1][0]) == bytes: title = subject[-1][0].decode(str(subject[-1][1])) elif type(subject[-1][0]) == str: title = subject[-1][0] print("title:", title)
def get_email_title(msg): subject = email.header.decode_header(msg.get('subject')) if type(subject[-1][0]) == bytes: title = subject[-1][0].decode(str(subject[-1][1])) elif type(subject[-1][0]) == str: title = subject[-1][0] print("title:", title) return title
def get_att(msg): """获取附件并下载""" filename = Email_parse.get_email_name(msg) for part in msg.walk(): file_name = part.get_param("name") if file_name: data = part.get_payload(decode=True) if data != None: att_file = open('./src/' + filename, 'wb') att_file.write(data) att_file.close() else: pass
def get_text_from_HTML(msg): """获取邮件中的html""" filename = Email_parse.get_email_name(msg) current_title = Email_parse.get_email_title(msg) print("filename:",filename,type(filename)) for part in msg.walk(): if not part.is_multipart(): result = part.get_payload(decode=True) result = result.decode('gbk') f = open(f'./src/{current_title}.txt','w') f.write(result) f.close() return result
import email import imaplib from email.header import decode_header import pandas as pd import datetime class Email_parse: def __init__(self,remote_server_url,email_url,password): self.remote_server_url = remote_server_url self.email_url = email_url self.password = password def get_att(msg): filename = Email_parse.get_email_name(msg) for part in msg.walk(): file_name = part.get_param("name") if file_name: data = part.get_payload(decode=True) if data != None: att_file = open('./src/' + filename, 'wb') att_file.write(data) att_file.close() else: pass def get_email_title(msg): subject = email.header.decode_header(msg.get('subject')) if type(subject[-1][0]) == bytes: title = subject[-1][0].decode(str(subject[-1][1])) elif type(subject[-1][0]) == str: title = subject[-1][0] print("title:", title) return title def get_email_name(msg): for part in msg.walk(): file_name = part.get_param("name") if file_name: h = email.header.Header(file_name) dh = email.header.decode_header(h) filename = dh[0][0] if dh[0][1]: value, charset = decode_header(str(filename, dh[0][1]))[0] if charset: filename = value.decode(charset) print("附件名称:", filename) return filename def main_parse_Email(self): server = imaplib.IMAP4_SSL(self.remote_server_url, 993) server.login(self.email_url, self.password) server.select('INBOX') status,data = server.search(None,"ALL") if status != 'OK': raise Exception('read email error') emailids = data[0].split() mail_counts = len(emailids) print("count:",mail_counts) for i in range(mail_counts - 1, mail_counts - 2, -1): status, edata = server.fetch(emailids[i], '(RFC822)') msg = email.message_from_bytes(edata[0][1]) subject = email.header.decode_header(msg.get('subject')) if type(subject[-1][0]) == bytes: title = subject[-1][0].decode(str(subject[-1][1])) elif type(subject[-1][0]) == str: title = subject[-1][0] print("title:", title) Email_parse.get_att(msg) Email_parse.get_text_from_HTML(msg) def get_text_from_HTML(msg): filename = Email_parse.get_email_name(msg) current_title = Email_parse.get_email_title(msg) print("filename:",filename,type(filename)) for part in msg.walk(): if not part.is_multipart(): result = part.get_payload(decode=True) result = result.decode('gbk') f = open(f'./src/{current_title}.txt','w') f.write(result) f.close() return result if __name__ == "__main__": remote_server_url = 'imap.qq.com' email_url = "*********@qq.com" password = "**********" demo = Email_parse(remote_server_url,email_url,password) demo.main_parse_Email()
Tutorial video Python3 ]
Atas ialah kandungan terperinci Perkenalkan secara ringkas contoh muat turun automatik e-mel dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!