Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Perkenalkan secara ringkas contoh muat turun automatik e-mel dalam Python

Perkenalkan secara ringkas contoh muat turun automatik e-mel dalam Python

WBOY
WBOYke hadapan
2022-08-17 18:01:002458semak imbas

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.

Perkenalkan secara ringkas contoh muat turun automatik e-mel dalam Python

[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
Kemudian 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(&#39;INBOX&#39;)
        status,data = server.search(None,"ALL")
        if status != &#39;OK&#39;:
            raise Exception(&#39;read email error&#39;)
        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], &#39;(RFC822)&#39;)
            msg = email.message_from_bytes(edata[0][1])
            #获取邮件主题title
            subject = email.header.decode_header(msg.get(&#39;subject&#39;))
            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(&#39;subject&#39;))
        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
Semasa 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(&#39;./src/&#39; + filename, &#39;wb&#39;)
                    att_file.write(data)
                    att_file.close()
                else:
                    pass
Untuk 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(&#39;gbk&#39;)
                f = open(f&#39;./src/{current_title}.txt&#39;,&#39;w&#39;)
                f.write(result)
                f.close()
                return result
Kod 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(&#39;subject&#39;))
        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!

Kenyataan:
Artikel ini dikembalikan pada:jb51.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam