Rumah >pembangunan bahagian belakang >Tutorial Python >Perkenalkan secara ringkas contoh muat turun automatik e-mel dalam Python
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 = passwordKemudian tentukan fungsi kemasukan dalam kelas, log masuk dari jauh dan dapatkan semua e-mel pada halaman pertama secara lalai. Kami mendapatkan subjek e-mel dan mencetaknya [Pengekodan subjek e-mel yang berbeza mungkin berbeza, dan binari perlu ditranskodkan untuk dipaparkan dengan betul]
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)Antaranya, pembolehubah msg menyimpan badan e-mel Seterusnya, kerana ia akan Menggunakan semula msg dan condong, kami akan membina fungsi kelas untuk mengembalikan mesej dan tajuk.
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 titleSemasa menghuraikan e-mel, kami membahagikannya kepada dua bahagian, badan e-mel [HTML] dan lampiran [xlsx, dll.]. Jika kami menentukan bahawa terdapat lampiran, kami akan menyimpannya ke jalan yang tetap. Saya tidak akan menerangkan butiran tentang penghuraian jadual. Pakej seperti panda sudah cukup untuk mengendalikannya.
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: passUntuk kandungan badan e-mel, kami menghuraikan terus html dan menyimpan kandungan teks terus ke dalam fail .txt untuk bacaan mudah.
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 resultKod lengkap adalah seperti berikut:
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()Hasil berjalan: 【 Pengesyoran berkaitan:
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!