Flask-MailでHTML形式のメールを送信する方法
2024年7月9日

こんにちは!
今回の記事では、Flask-MailでHTML形式のメールを送信する方法について解説します。
Flask-Mailとは、Flaskでメールを送信するためのパッケージです。Flask-Mailをインストールすることで、メールの送信機能が簡単に実装できます。
具体的なコード例を交えながら、セットアップから実際のメール送信までのステップを順を追って解説します。
Flask-Mailの準備
まずは、Flask-Mailの準備を行いましょう。
Flask-Mailのインストール
まずは、Flask-Mailをインストールします。以下のコマンドを実行しましょう。
pip install Flask-Mail
メールサーバーの設定
続いて、メールサーバーを準備します。
メールサーバーとは、メールを送信するSMTPサーバーのことです。
メールの設定は、環境変数(.envファイル)に格納します。.envファイルに以下の環境変数を設定します。
MAIL_SERVER=smtp.example.com
MAIL_PORT=587
MAIL_USE_TLS=True
MAIL_USE_SSL=False
MAIL_USERNAME=your-email@example.com
MAIL_PASSWORD=your-email-password
MAIL_DEFAULT_SENDER=your-email@example.com
SMTPサーバーやログイン情報などは自身の環境に合わせます。
次にFlaskで環境変数の読み込みをおこないます。以下のパッケージをインストールします。
pip install python-dotenv
続いて、app.pyに以下のように設定します。
from flask import Flask
from flask_mail import Mail
from dotenv import load_dotenv
import os
# .envファイルの内容を読み込みます
load_dotenv()
app = Flask(__name__)
# Flaskアプリケーションの設定を環境変数から読み込みます
app.config['MAIL_SERVER'] = os.getenv('MAIL_SERVER')
app.config['MAIL_PORT'] = os.getenv('MAIL_PORT')
app.config['MAIL_USE_TLS'] = os.getenv('MAIL_USE_TLS') == 'True'
app.config['MAIL_USE_SSL'] = os.getenv('MAIL_USE_SSL') == 'True'
app.config['MAIL_USERNAME'] = os.getenv('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD')
app.config['MAIL_DEFAULT_SENDER'] = os.getenv('MAIL_DEFAULT_SENDER')
mail = Mail(app)
ここまでは、Flaskでメールを使う準備です。詳しくは、以下の記事で解説しています。
【関連記事】Flaskでメールを送信する方法を解説【Flask-Mail】
HTMLメール送信の実装
続いて、HTMLメールを送信するための実装をおこないます。
まずはHTMLの準備です。
HTMLメールテンプレートの作成
HTMLメールテンプレートは、templatesディレクトリに格納しましょう。
ディレクトリ構造は以下の通りです。
flask_mail_app/
│
├── app.py
├── templates/
│ └── email_template.html
└── .env
email_template.htmlにメールの本文などを記述します。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Email</title>
</head>
<body>
<h1>こんにちは, {{ name }}!</h1>
<p>こちらは、Flaskから送られたメールです。</p>
</body>
</html>
app.pyの記述
最後にメール送信の実装を行います。app.pyに以下を追加します。
@app.route('/send_email')
def send_email():
msg = Message('Hello from Flask',
sender='youremail@gmail.com',
recipients=['recipient@example.com'])
msg.body = 'This is the plain text body of the email'
msg.html = render_template('email_template.html', name='taro')
mail.send(msg)
return 'Email sent!'
上記のセットアップが完了したら、Flaskアプリケーションを実行し、ブラウザで/send_emailエンドポイントにアクセスすると、指定したメールアドレスにHTML形式のメールが送信されます。
メールの実装時はエラーハンドリングも付けよう
実際のアプリケーションでは、メール送信時にエラーが発生する可能性があります。
これを適切にハンドリングするために、try-exceptを使用します。
以下のように、app.pyの中身を改修します。
@app.route('/send_email')
def send_email():
try:
msg = Message('Hello from Flask',
sender='youremail@gmail.com',
recipients=['recipient@example.com'])
msg.body = 'This is the plain text body of the email'
msg.html = render_template('email_template.html', name='taro')
mail.send(msg)
return 'Email sent!'
except Exception as e:
return str(e)
これで、メールは送信されない場合はエラーが出力されるようになります。
まとめ
今回の記事では、Flask-Mailを使用してHTML形式のメールを送信する方法について詳しく説明しました。
Flask-Mailの基本的なセットアップから、HTMLテンプレートの作成、メール送信の実装、エラーハンドリングまで、順を追って解説しました。
メールを送信する際は、HTML形式で送信することが多いと思うので参考にしてください。
ここまでお読みいただきありがとうございました。
Pythonの基礎から応用まで学べる
Python WebAcademy
Python WebAcademyでは、Pythonの基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。また、ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。

インフラの学習はInfraAcademy

おすすめの記事









