📧

Pythonでメールを受信する方法

2024/12/22に公開

仕様と動作環境

  • 仕様

    • 任意のサーバー名、ユーザー名、パスワードを指定
    • 受信しているメールの件数を取得
    • 受信しているメール情報を取得(件名・本文・送信者・受信日時)
    • 受信したメールは削除する
    • pop3を使ってメール取得
  • Pythonバージョン

    • Python 3.12.4
  • 開発環境

    • VSCode

ソースコード

import poplib
import email
from email.header import decode_header


# メール関連
def fetchmail(cli, msg_no):
    content = cli.retr(msg_no)[1]
    msg = email.message_from_bytes(b'\r\n'.join(content))
    # From ヘッダ(差出人)
    from_ = get_header(msg, 'From')
    # Date ヘッダ(送信日時)
    date = get_header(msg, 'Date')
    # Subject ヘッダ(件名)
    subject = get_header(msg, 'Subject')
    # 本文
    content = get_content(msg)
    return (subject, content, from_, date)


# ヘッダを取得
def get_header(msg, name):
    header = ''
    if msg[name]:
        for tup in decode_header(str(msg[name])):
            if type(tup[0]) is bytes:
                charset = tup[1]
                if charset:
                    header += tup[0].decode(tup[1])
                else:
                    header += tup[0].decode()
            elif type(tup[0]) is str:
                header += tup[0]
    return header


# 本文を取得
def get_content(msg):
    charset = msg.get_content_charset()
    payload = msg.get_payload(decode=True)
    try:
        if payload:
            if charset:
                return payload.decode(charset)
            else:
                return payload.decode()
        else:
            return ""
    except:
        return payload


# メールメイン処理
def main():
    # メールサーバーの情報
    server = "サーバ名"
    user_name = "メールアドレス"
    pwd = 'パスワード'

    # 認証
    cli = poplib.POP3(server)
    cli.user(user_name)
    cli.pass_(pwd)

    count = len(cli.list()[1])
    print('メール受信件数' + str(count) + '件')

    for i in range(count):
        msg = fetchmail(cli, i + 1)
        msg = list(msg)  # msg[0]=件名 [1]=本文 [2]=送信者 [3]=受信日時

        # 取得情報の表示
        print(f"件名:{msg[0]}")
        print(f"送信者:{msg[2]}")
        print(f"受信日時:{msg[3]}")
        print(f"本文:{msg[1]}")
        print("=======================================================")

        # メール削除
        # cli.dele(i+1)

    cli.quit()


if __name__ == "__main__":
    main()

大雑把ソースコード解説

まずは各種メソッドについてです
ソースコードの記述の順番とは異なります。注意してください。

メールのヘッダーを取得

get_header(msg, name)のメソッドです。

メールのヘッダーとはメールの送信や配送に関する詳細な情報が登録されている部分のことを指します。
メールが配送された経路や時間、経由したサーバーなどが記録されています。
個人的にこの北里大学が出している資料が分かりやすかったです。
https://www.kitasato-u.ac.jp/knc/mail/download/info_mail_header_v2.pdf

メソッドの引数にはmsgにメールデータを入れて、nameには抽出したいデータ名を指定します。
プログラムに関しては一旦こんなの書けばOKです。

メール本文を取得

get_content(msg)のメソッドです。

ヘッダーのメソッドと同様に渡されたmsgからメールの本文を抽出します。

メールの処理のまとめ

fetchmail(cli, msg_no)のメソッドです。
ここのメソッドでは取得したメールからヘッダーから差出人、送信日時(受信日時)、メールの件名、メール本文を上記のget_header(msg, name)get_content(msg)のメソッドを使ってメールデータから抽出します。

メインメソッド

cli = poplib.POP3(server)
cli.user(user_name)
cli.pass_(pwd)

この3行でメールサーバにアクセスをします

その後count = len(cli.list()[1])でメールの受信件数を取得

あとはfor文を使って順番にメールの情報を取得&表示します。

また、取得したメールを削除する場合はcli.dele(i+1)のコメントアウトを外せばそのメールはサーバーから削除することが可能です。
今回は念のためコメントアウトしてあります。

まとめ

ここに記載したソースコードをコピペで受信したメールを表示することができます。
メールを誤って削除してしまうとあとから「困った!」ってことになりかねないので削除の部分はお気をつけください(^^)

Discussion