>  기사  >  백엔드 개발  >  Python에서 이메일을 자동으로 다운로드하는 예를 간략하게 소개합니다.

Python에서 이메일을 자동으로 다운로드하는 예를 간략하게 소개합니다.

WBOY
WBOY앞으로
2022-08-17 18:01:002448검색

이 기사에서는 Python에 대한 관련 지식을 제공합니다. Python 언어를 사용하여 자동 이메일 다운로드 및 첨부 파일 구문 분석 기능을 구현하는 방법을 자세히 소개합니다. 기사의 샘플 코드를 함께 살펴보겠습니다. 모든 사람에게 도움이 되기를 바랍니다.

Python에서 이메일을 자동으로 다운로드하는 예를 간략하게 소개합니다.

[관련 권장 사항: Python3 비디오 튜토리얼 ]

코딩을 시작하기 전에 먼저 세 가지 메일 서비스 프로토콜을 이해합시다:

1. SMTP 프로토콜

SMTP(Simple Mail Transfer Protocol) 단순 메일 전송 프로토콜. 환승 스테이션과 동일하며 클라이언트에게 이메일을 보냅니다.

2. POP3 프로토콜

우체국 프로토콜의 세 번째 버전인 POP3(Post Office Protocol 3)는 이메일을 위한 최초의 오프라인 프로토콜 표준입니다. 이 프로토콜은 이메일을 로컬 컴퓨터에 다운로드하고 서버와 동기화하지 않습니다. 단점은 이메일이 손실되거나 동일한 이메일을 여러 번 다운로드할 가능성이 높다는 것입니다.

3. IMAP 프로토콜

IMAP(인터넷 메일 액세스 프로토콜)은 대화형 메일 액세스 프로토콜입니다. 이 프로토콜은 직접 작동을 위해 원격 사서함에 연결하고 콘텐츠를 서버와 동기화합니다.

그럼 이메일 패키지를 소개하겠습니다

이 패키지의 핵심 구성 요소는 이메일 메시지를 나타내는 "객체 모델"입니다. 응용 프로그램은 주로 메시지 하위 모듈에 정의된 개체 모델 인터페이스를 통해 이 패키지와 상호 작용합니다. 애플리케이션은 이 API를 사용하여 기존 이메일에 대해 질문하고, 새 이메일을 구성하고, 자체적으로 동일한 개체 모델 인터페이스를 사용하는 이메일 하위 구성 요소를 추가 또는 제거할 수 있습니다. 즉, 이메일 메시지와 해당 MIME 하위 구성 요소의 특성에 따라 이메일 개체 모델은 EmailMessage API를 제공하는 모든 개체의 트리 구조입니다.

다음으로 특정 코드를 사용하여 이메일 클라이언트에 로그인하고, 이메일을 다운로드하고, 이메일 첨부 파일의 내용을 구문 분석하는 기능을 구현합니다.

먼저 세 가지 변수가 필요한 이메일 구문 분석 클래스를 정의해야 합니다.

1. 이메일이 속한 imap 서비스 주소

2. 이메일 계정; 다른 보안 정책이 필요합니다. 예를 들어 qq 사서함은 SMS 확인이 필요하며 원격 클라이언트에 로그인하기 위해 일반 텍스트 비밀번호 대신 로그인 인증 코드를 얻습니다.】

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)

그중 msg 변수는 이메일 본문을 저장합니다. msg 및 Tilt가 재사용되므로 msg 및 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

이메일을 분석할 때 이메일 본문[HTML]과 첨부파일[xlsx, etc.] 두 부분으로 나누어 첨부파일이 있다고 판단되면 고정된 경로에 저장합니다. 테이블 구문 분석에 대해서는 자세히 설명하지 않겠습니다. 팬더와 같은 패키지만으로도 충분합니다.

    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

이메일 본문 내용의 경우 HTML을 직접 구문 분석하고 쉽게 읽을 수 있도록 텍스트 내용을 .txt 파일에 직접 저장합니다.

    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()

실행 결과:

[관련 권장 사항:

Python3 비디오 튜토리얼

]

위 내용은 Python에서 이메일을 자동으로 다운로드하는 예를 간략하게 소개합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제