メール
 Computer >> コンピューター >  >> ソフトウェア >> メール

Pythonでメールを自動送信する方法|smtplibの基本からTLS暗号化まで

市販のメールクライアントは使いやすいGUIを備えている一方で、開発者やコンテンツ制作者が求める柔軟性やカスタマイズ性に欠けることが少なくありません。

SNSチャンネルの新規登録者へのお礼メールの送信や、最新プロジェクトへのメール機能の組み込みなど、PythonとSMTPを使ってメッセージを自動送信できるスキルは、必ず役立つ場面が訪れます。

この記事では、Pythonスクリプトでメールを送信する方法を、事前準備から通信の暗号化まで、ステップごとにわかりやすく解説します。

SMTPとは?

簡単に言えば、SMTP(Simple Mail Transfer Protocol)とは、メールサーバーがインターネット上でメールをやり取りするための通信プロトコルです。

インターネットなどのネットワーク通信に使われるプロトコル群であるTCP/IPスイートのアプリケーション層に属しており、SMTPが実装されたネットワークではストア・アンド・フォワードと呼ばれる仕組みによって、メールがネットワーク間を中継されていきます。

各エンドポイントには、MTA(Mail Transfer Agent)と呼ばれるソフトウェアが存在し、ストア・アンド・フォワードを通じてSMTPサーバー同士の通信を仲介します。つまりSMTPの主な役割は、ネットワーク内でメールがどの経路で、どのように移動するかを定めることにあるのです。

はじめに:準備するもの

このプログラムでメールを送信するには、送信用のメールアカウントが必要です。今回はGmailのSMTPサービスを利用します。

ローカルのSMTPデバッグサーバーを使ってテストメールを送ることも可能ですが、ここではより直感的に理解できるメールアカウントを使用します。

既存のGmailアカウントをそのまま使うこともできますが、テストを繰り返すうちにテストメールだらけになってしまいます。そのため、テスト専用の「使い捨て」アカウントを作成することをおすすめします。

また、外部アプリからのアクセスを許可する設定変更も必要になります。メインのメールアカウントのプライバシー設定をいじるのは避けたいところなので、これも使い捨てアカウントを使うべき理由のひとつです。

補足: 現在のGoogleアカウントでは「安全性の低いアプリのアクセス許可」が廃止されています。代わりに2段階認証を有効化したうえでアプリパスワードを発行し、それをパスワードとして使用してください。

Pythonでメールを作成する

Python 3には標準でsmtplib(smtp libraryの略)というモジュールが付属しており、これを使ってSMTPサーバーを操作できます。

他のPythonモジュールと同様、まずはsmtplibをインポートします。

import smtplib

SMTPオブジェクトの初期化

smtplibを使ってSMTPオブジェクトを作成すると、通常のメールクライアントが持つ機能の多くを利用できるようになります。ただし、SMTPオブジェクトの機能はインスタンスメソッドを通じてのみ使えるため、次のステップとしてオブジェクトインスタンスを宣言します。

mySMTP = smtplib.SMTP("smtp.gmail.com")

これで、GoogleのSMTPサーバーを使ってメールを送信するようにSMTPオブジェクトが設定されました。

続いて、送信者と受信者のメールアドレスを指定します。先ほど作成したGmailアカウントがここで役立ちます。

emailSender = "senderMail@sender.com"
myThrowaway = "myEmail@gmail.com"
emailRecipients = [myThrowaway]

ここで注目したいのは、受信者リストが配列(リスト)になっている点です。複数の値を格納できる設計のため、メーリングリスト全体をまとめて指定することも可能です。

メッセージ本文の作成

ここがおそらく最もシンプルな工程です。普段メールを新規作成するときに入力する項目を記述していきます。具体的には以下の通りです。

  • 送信者情報
  • 受信者情報
  • 件名
  • 本文

これらのフィールドは三重引用符(トリプルクォート)で囲み、以下のように区切ります。

newEmail = """From: From Person <senderMail@sender.com>
To: To Person <my_email@gmail.com>
Subject: Email Test

This is the body of the email.
"""

メールの送信

最後に、sendmailコマンドを使って、あなたのSMTPサーバーから受信者のサーバーへメールを送信します。

mySMTP.sendmail(emailSender, emailRecipients, newEmail)

あとは、予期しないクラッシュを防ぐためにコードを整理すれば完成です。

Pythonメールプログラムのトラブルシューティング

場合によっては、SMTPサーバーが受信側サーバーとの接続に失敗したり、ポート間のメール送信で問題が発生したりすることがあります。こうした状況では、プログラムが突然クラッシュする可能性があります。

そこでtry-exceptブロックを使い、エラーが発生しやすい処理をtryブロック内に記述します。try-exceptブロックを含むプログラム全体は、次のようになります。

import smtplib

emailSender = "senderMail@sender.com"
myThrowaway = "my_email@gmail.com"
emailRecipients = [myThrowaway]

newEmail = """From: From Person <senderMail@sender.com>
To: To Person <my_email@gmail.com>
Subject: Email Test

This is the body of the email.
"""

try:
    smtpObj = smtplib.SMTP("smtp.gmail.com")
    smtpObj.sendmail(emailSender, emailRecipients, newEmail)
    print("Email sent successfully!")
except smtplib.SMTPException:
    print("Error: There was an error in sending your email.")

メール通信の安全性を確保する

実運用でPythonを使ってメールを送る予定があるなら、両端の通信が安全であることを確認することが重要です。

デフォルトポートのシンプルなSMTPサーバーでは、通信が一切暗号化されません。第三者がネットワークを監視していると、ログイン資格情報やメールの内容を読み取られてしまう恐れがあります。

この問題を回避するひとつの方法が、TLS(Transport Layer Security)プロトコルによる通信の暗号化です。GmailやOutlookといった主要メールクライアントも、メールが悪意ある第三者の手に渡らないよう、同じプロトコルを採用しています。

Pythonでメールを自動送信する方法|smtplibの基本からTLS暗号化まで

実現するには、先ほど作成したプログラムにいくつかの小さな変更を加えます。

まず、smtplibと一緒にsslライブラリをインポートします。sslライブラリを使うことで、安全なSSLコンテキストを作成し、両端で特定のポートに接続することにより、暗号化されたネットワーク通信が可能になります。

安全なSSLコンテキストとは、暗号スイート、プロトコルバージョン、信頼済み証明書、TLSオプション、TLS拡張などをひとまとめにしたものです。

続いてTLS用のポートを指定し、sslライブラリの関数をいくつか追加して、安全なメール送信機能を実装します。

すべての変更を反映したコードは、次のようになります。

import smtplib, ssl

smtpServer = "smtp.gmail.com"
port = 587  # TLS用ポート
myEmail = "my_email@gmail.com"
password = "my_password"
# メールアドレスとパスワードはユーザー入力フィールドにしてもよい

context = ssl.create_default_context()

newEmail = """From: From Person <senderMail@sender.com>
To: To Person <my_email@gmail.com>
Subject: Email Test

This is the body of the email.
"""

try:
    server = smtplib.SMTP(smtpServer, port)
    server.starttls(context=context)
    server.login(myEmail, password)
except Exception as e:
    print("the email could not be sent.")
finally:
    server.quit()

前述のとおり、突然のプログラムクラッシュを防ぐため、SMTPインスタンスの作成と使用は必ずtry-exceptブロック内で行いましょう。

このPythonスクリプトでできること

コードでメールを自動化するという便利で意外と実用的なスキルを身につけた今、多様な宛先にメールを送る必要のあるあらゆるプラットフォームに応用できます。

個人サイトでの自動確認メールの送信から、家族や友人へのクリスマスカードや招待状の一括送信まで、この小さなPythonスクリプトの活用法は、あなたの創造力次第で無限に広がります。

さらに、これはPythonでできる数多くのことのほんの一例にすぎません。充実した開発者コミュニティと学びやすい構文のおかげで、Pythonスキルの習得はかつてないほど簡単になっています。

コードでクールなものを作り続けたい方は、Python 3でオリジナルのTelegramボットを作成するガイドもぜひチェックしてみてください。

  1. Instagramでボイスメッセージを送信する方法をわかりやすく解説

    Instagramは、ユーザー同士をつなぐ広いネットワークを提供するSNSプラットフォームです。ワークアウトの様子をショート動画で投稿したり、フィットネスのコツを発信したり、自分の商品を宣伝したり、単に友人とつながったりと、さまざまな使い方ができます。そんなInstagramでは、新しい機能が随時追加されています。 その中でも比較的最近登場したのが「ボイスメッセージ(音声メッセージ)」機能です。この機能を使えば、他のInstagramユーザーに音声メッセージを送ることができます。実は、この機能はユーザーの間で長らく待ち望まれていたものでもあります。 この記事では、Instagramでボイスメッ

  2. 匿名でメールを送信する方法|プライバシーを守る3つの実践テクニック

    Gmail、Outlook、Yahoo!メールなど、大手インターネット企業が運営する高機能なメールクライアントは市場に数多く存在します。しかし、こうしたプラットフォームはユーザーの行動や他のオンライン活動を追跡・監視しようとするため、多くのユーザーはオンラインのプライバシーに対して不安を感じています。 通常、メールは双方向のコミュニケーション手段として使われますが、身元を明かさずにメールを送受信したい場面もあるでしょう。その理由は完全に正当なものであり得ます。単にプライバシーを大切にしたい、アカウント登録時に個人情報を提供したくない、あるいは決して追跡されたくない機密性の高いメールを送りたい—