Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでメールを送信する方法:smtplibとemailモジュール徹底ガイド

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

Pythonはデータ分析やWeb開発など、幅広い用途に活用できる多機能なプログラミング言語です。実はPythonには、メールを送信するという隠れた機能もあります。これにより、パスワードリセットメール、ユーザーへの通知など、あらゆる種類のメールをPythonプログラムから自動的に送信できるようになります。

このガイドでは、Pythonを使ってメールを送信する方法について解説します。emailライブラリとsmtplibライブラリの仕組みを紹介し、実際にメールを送信するサンプルプログラムを作成していきます。

それでは、さっそく始めましょう!

Pythonによるメール送信の仕組み

プログラムからメールを送信する場合、メッセージは「SMTP(Simple Mail Transfer Protocol:シンプルメール転送プロトコル)」と呼ばれるプロトコルを使用して送信されます。このプロトコルは、世界中のメールサービスやメールクライアントがメッセージ送信に使用している標準的な仕組みです。

プログラムからメールを送信するには、SMTPサーバーが必要です。自分でSMTPサーバーを構築することもできますが、必ずしもその必要はありません。GmailやOutlookなどのサービスはSMTPサービスを提供しているため、既存のメールアカウントを使ってメールを送信できます。

このガイドでは、GmailのSMTPサーバーからメールを送信することを前提として進めます。GmailのSMTPサーバーの詳細については、公式ドキュメントをご確認ください。お使いのメールプロバイダがSMTPに対応しているかどうかを調べるには、「[プロバイダ名] SMTP credentials」などのキーワードで検索してみてください。

メール送信の手順は以下の3ステップです。

  • SMTP接続を設定する
  • メッセージオブジェクトを作成する
  • SMTP経由でメッセージを送信する

SMTP接続の設定

まずはSMTP接続を設定しましょう。ここでは「smtplib」というライブラリを使用します。このライブラリには、接続管理に必要なコードがすべて含まれているため、わずか数行のコードでメールを送信できます。

まず、smtplibライブラリをインポートします。

import smtplib

次に、SMTPサーバーの認証情報を格納する変数を設定します。認証情報を変数にまとめておくことで、コードの可読性が向上します。使用する変数は以下の通りです。

sender = 'test@careerkarma.com'
password = '123456'
server = 'smtp.gmail.com'
port = 465

このコードには、SMTP接続を作成するために必要な設定がすべて含まれています。準備ができたら、SMTPサーバーにログインします。

server = smtplib.SMTP_SSL(server, port)
server.login(sender, password)

このコードは、SMTPサーバーへのSSL(Secure Socket Layer)接続を作成します。SSLは従来の接続よりも安全であるため、現在ではSMTPサーバーの標準となっています。

これでSMTP接続の設定は完了です!

メッセージオブジェクトの作成

現時点では、このコードはまだメールを送信できません。それは、まだメッセージオブジェクトを作成していないためです。ここでは「email」ライブラリを使用します。smtplibでもメッセージオブジェクトを作成できますが、emailライブラリの方がより簡潔に記述できます。

まず、必要なemailパッケージをインポートします。

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

ライブラリをインポートしたら、メッセージオブジェクトを作成できます。

message = MIMEMultipart()

body = 'This is an email sent from Python!'

message['From'] = sender
message['To'] = 'test@careerkarma.com'
message['Subject'] = 'This is a test email'

message.attach(MIMEText(body, 'plain'))

まず「message」というオブジェクトを初期化します。このオブジェクトは、emailライブラリのMIMEMultipartクラスを参照しています。続いて、メール本文と、差出人・受取人・件名を指定します。

最後の行で、メッセージの本文をメールに添付しています。

メッセージの送信

あとはメッセージを送信するだけです。

server.send_message(message)

すべてのコードを実行すると、メールが送信されます。「This is a test email」という件名のメールが、test@careerkarma.comからtest@careerkarma.com宛てに送信されます。

ファイルからテンプレートを読み込む

先ほどのメール本文は1行だけでした。この程度の長さであれば、Pythonコード内に直接本文を書いても問題ありません。しかし、実際のメールはもっと長いのが普通です。そこで、特定のメール用のテキストを保存するテンプレートを作成すると便利です。

まず「email.txt」というファイルを作成し、以下の内容を貼り付けます。

Hello ${NAME},

This is a test email!

Thanks,
Career Karma

このテンプレートには「NAME」という変数が含まれています。この変数は波括弧({})で囲まれ、先頭にドル記号($)が付いています。この変数は、後ほどコード内で受取人の名前に置き換えられます。

次に、このテンプレートをコードに読み込む必要があります。open()メソッドを使ってファイルを読み込む「read_email」という関数を作成しましょう。

stringライブラリからTemplateオブジェクトをインポートします。このオブジェクトを使って、メールとして扱えるオブジェクトを作成します。Pythonプログラムの先頭に以下の行を追加してください。

from string import Template

すべてのimport文の下に、以下のコードを貼り付けます。

def read_email():
	with open('email.txt', 'r') as file:
		contents = file.read()
	return Template(contents)

この関数は「email.txt」というファイルを読み込んで変数「contents」に格納します。その値は、stringライブラリのTemplateメソッドを使ってTemplateオブジェクトに変換されます。ファイルの読み込みについて詳しくは、Pythonのファイル読み込みに関するチュートリアルをご覧ください。

プログラム内の次の行を変更します。

body = 'This is an email sent from Python!'

変更後は以下のようになります。

email_content = read_email()
body = email_content.substitute(NAME="Test")

このコードは、read_email()関数を呼び出して「email.txt」ファイルの内容を読み込みます。そして、テンプレート内のNAMEの値が「Test」に置き換えられます。すべてのコードをまとめると、以下のようになります。

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from string import Template

def read_email():
	with open('email.txt', 'r') as file:
		contents = file.read()
	return Template(contents)

sender = 'test@careerkarma.com'
password = '123456'
server = 'smtp.gmail.com'
port = 465

server = smtplib.SMTP_SSL(server, port)
server.login(sender, password)

message = MIMEMultipart()

email_content = read_email()
body = email_content.substitute(NAME="Test")

message['From'] = sender
message['To'] = 'test@careerkarma.com'
message['Subject'] = 'This is a test email'

message.attach(MIMEText(body, 'plain'))

SMTPサーバーの認証情報を自分のものに置き換えてこのプログラムを実行すると、メールが送信されます。これで、メールを送信するプログラムが完成しました。

まとめ

Pythonでのメール送信は決して難しくありません。テンプレートを使わなければ、わずか数行のコードでメールを送信できます。emailモジュールとsmtplibモジュールが面倒な処理のほとんどを担ってくれるのです。さらに、emailモジュールを活用すれば、値を置き換えられるメールテンプレートを作成することもできます。

挑戦してみませんか?上記のプログラムを改造して、複数の受取人にメールを送信できるようにしてみましょう。ヒント:forループを使ってメールを送信するとよいでしょう。

これであなたも、プロのようにPythonでメールを送信できるようになりました!

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

    市販のメールクライアントは使いやすいGUIを備えている一方で、開発者やコンテンツ制作者が求める柔軟性やカスタマイズ性に欠けることが少なくありません。 SNSチャンネルの新規登録者へのお礼メールの送信や、最新プロジェクトへのメール機能の組み込みなど、PythonとSMTPを使ってメッセージを自動送信できるスキルは、必ず役立つ場面が訪れます。 この記事では、Pythonスクリプトでメールを送信する方法を、事前準備から通信の暗号化まで、ステップごとにわかりやすく解説します。 SMTPとは? 簡単に言えば、SMTP(Simple Mail Transfer Protocol)とは、メールサーバーがイ

  2. WhatsAppの写真をメールで送信する方法|iPhone・Android対応の完全ガイド

    WhatsAppユーザーが写真をメールに送りたいと考える理由はさまざまです。GoogleドライブやiCloudが大切な会話履歴、画像、動画を意図せず削除してしまうことを心配する方もいれば、AndroidからiOS(またはその逆)へバックアップを移行する際に、写真をメールで共有したいというケースもあります。また、書き出したバックアップデータを他の人と共有したい場合にも、メール送信は便利な手段です。写真のエクスポート方法は複数ありますが、どの方法でも送信先として使えるメールアカウントが必要になります。この記事では、WhatsAppからメールへ写真を送る方法を詳しく解説します。大切な写真のバックアッ