Python で添付ファイル付きの電子メールを送信する

Zeeshan Afridi 2023年10月8日
  1. Python で添付ファイル付きの電子メールを送信する
  2. Python で添付ファイル付きの電子メールを送信する手順
Python で添付ファイル付きの電子メールを送信する

今日の記事では、Python を使用して添付ファイル付きのメールを送信する方法について説明します。 そのため、メールを送信するための外部ライブラリは必要ありません。 代わりに、SMTP プロトコルを介してメールが送信されるため、smtplib という名前のモジュールをインポートして使用します。 どうすればできるか見てみましょう。

Python で添付ファイル付きの電子メールを送信する

Python は、テキスト メッセージを送信するときに、すべてのメッセージ コンテンツを通常のテキストとして扱います。 テキスト メッセージに HTML タグを追加しても、HTML 構文に従って構造化されず、メッセージはプライマリ テキストとして表示されます。

ただし、Python は HTML メッセージをネイティブ形式で送信できます。 したがって、HTMLメールを送信するためにメールを送信するときに、MIMEバージョン、コンテンツタイプ、および文字セットを選択できます.

Python には、smtplib と呼ばれるパッケージが含まれています。 メールは SMTP (Simple Mail Transfer Protocol) 経由で送信されます。 メール送信の場合、SMTP クライアント セッション オブジェクトを生成します。

SMTP には、正しい (有効な) ソースと宛先の電子メール アドレス、サーバー アドレス、およびポート番号が必要です。 たとえば、Google のポート番号は 587 です。 サーバーのアドレスとポート番号は、使用しているサービスによって変わることに注意してください。 この記事では、Google を使用しています。

まず、メール送信モジュール smtplib をインポートする必要があります。 また、適応性を高めるために、MIME (Multipurpose Internet Mail Extension) モジュールも使用しています。

MIME ヘッダーを使用して、送信者、受信者、およびその他の情報を保存する場合があります。 メールにファイルを添付するには、MIME も必要です。 メッセージの送信には、Google の Gmail サービスを利用しています。

Google のセキュリティ要件に準拠するために、特定の調整を行う必要があります。 たとえば、次のコードは、そのような設定がない場合、または Google がサードパーティ アプリからのアクセスをサポートしていない場合、機能しない可能性があります。

アクセスを提供するには、Google アカウントで安全性の低いアプリ アクセス設定を指定する必要があります。 さらに、2 段階認証が有効になっている場合、安全性の低いアクセスを使用することはできません。

Python で添付ファイル付きの電子メールを送信する手順

まず、MIME を作成し、作成した MIME に送信者、受信者、メール タイトル、添付本文を追加します。 その後、メールに添付されたファイルをバイナリモードで開きます。

添付ファイルについては、ヘッダーを追加し、有効なポート番号 587SMTP セッションを開き、セッションを終了します。

コード例:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

mail_content = """Hello,
This mail is to inform you about Today's meeting.
"""

sender_address = "sender@gmail.com"
sender_pass = "-------"
receiver_address = "receiver@gmail.com"

message = MIMEMultipart()
message["From"] = sender_address
message["To"] = receiver_address
message["Subject"] = "Info about meeting."
message.attach(MIMEText(mail_content, "plain"))

session = smtplib.SMTP("smtp.gmail.com", 587)
session.starttls()
session.login(sender_address, sender_pass)
text = message.as_string()
session.sendmail(sender_address, receiver_address, text)
session.quit()

print("Mail Sent")

出力:

Mail Sent

Python で添付ファイル付きの電子メールを送信する方法の別の例を次に示します。

コード例:

import smtplib

from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
import email.utils
from email import encoders
from smtpd import COMMASPACE


def send_mail(
    send_from,
    send_to,
    subject,
    message,
    files=[],
    server="localhost",
    port=587,
    username="",
    password="",
    use_tls=True,
):

    msg = MIMEMultipart()
    msg["From"] = send_from
    import email.utils

    msg["To"] = COMMASPACE.join(send_to)
    msg["Date"] = email.utils.formatdate(localtime=True)
    msg["Subject"] = subject

    msg.attach(MIMEText(message))

    for path in files:
        part = MIMEBase("application", "octet-stream")
        with open(path, "rb") as file:
            part.set_payload(file.read())
        encoders.encode_base64(part)
        part.add_header(
            "Content-Disposition", "attachment; filename={}".format(Path(path).name)
        )
        msg.attach(part)

    smtp = smtplib.SMTP(server, port)
    if use_tls:
        smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.quit()

出力:

/Users/apple/PycharmProjects/email/venv/bin/python /Users/apple/PycharmProjects/email/main.py 

Process finished with exit code 0

Python でメールを送信するための最初のステップは、Google アカウントの安全性を低くすることです。 そうしないと、接続拒否エラーが発生します。 機能させるには、2 段階認証 (2FA) が削除されていることを確認してください。

次に、メーリング送信モジュールをインポートする必要があります。有効な送信元と送信先の電子メール アドレスとポート番号が SMTP に必要です。 たとえば、Google のポート番号は 587 です。

著者: Zeeshan Afridi
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

関連記事 - Python Email