Flask×Celeryでメール送信を非同期化する手順をやさしく解説|初心者向けタスク管理入門
生徒
「Flaskでお問い合わせメールを送ると、画面が固まることがあるんですが、どうすればいいですか?」
先生
「それはメール送信に時間がかかっているからです。Celeryを使って、メール送信を非同期処理にすると解決できます。」
生徒
「非同期処理って難しそうです……。パソコンもあまり触ったことがなくて。」
先生
「大丈夫です。今回はFlaskとCeleryを使って、メール送信を裏で動かす仕組みを、たとえ話を交えながら説明します。」
1. Flaskでメール送信が遅くなる理由
Flask(フラスク)は、Pythonで作られたシンプルなWebアプリの仕組みです。 お問い合わせフォームや会員登録などで、メール送信を行う場面はとても多いです。
しかし、メール送信は「外部のメールサーバー」と通信するため、どうしても時間がかかります。 これは、手紙を郵便局に持っていって、配達されるまで少し待つのと似ています。
Flaskでそのままメール送信をすると、送信が終わるまで画面が待ち状態になります。 その結果、「画面が固まった」「送信ボタンを何度も押してしまう」という問題が起こります。
2. 非同期処理とCeleryの基本的な考え方
非同期処理とは、「時間のかかる作業を裏で進める仕組み」です。 レストランで注文だけ先に受けて、料理は厨房で作るイメージです。
Celery(セロリ)は、その裏作業を担当する専用スタッフのような存在です。 Flaskが「メール送信お願い!」と依頼すると、Celeryが代わりに処理します。
これにより、Flaskはすぐに画面を返せるため、ユーザーは待たされません。 Flask 非同期処理、Flask Celery、タスク管理というキーワードでよく検索される理由です。
3. Flaskでメール送信する最小サンプル
まずは、非同期化する前の「普通のメール送信」を見てみましょう。 ここでは「送信しました」と表示するだけの簡単な例です。
from flask import Flask
app = Flask(__name__)
@app.route("/send")
def send_mail():
print("メールを送信しました")
return "送信完了"
if __name__ == "__main__":
app.run()
実際のメール送信処理は省略していますが、 ここに時間のかかる処理が入ると、画面表示が遅くなります。
4. Celeryでメール送信タスクを作る
次に、Celeryを使って「メール送信専用の仕事」を作ります。 この仕事をタスクと呼びます。
from celery import Celery
import time
celery = Celery(
"mail_tasks",
broker="redis://localhost:6379/0"
)
@celery.task
def send_mail_task(address):
time.sleep(3)
print(f"{address} にメールを送信しました")
ここでは3秒待ってから、メールを送ったことにしています。 Redis(レディス)は、FlaskとCeleryの間で連絡を取るための伝言板です。
5. FlaskからCeleryのメールタスクを呼び出す
Flask側では、メール送信を「自分でやらずに」Celeryに任せます。
このときに使うのがdelay()です。
from flask import Flask
from tasks import send_mail_task
app = Flask(__name__)
@app.route("/send_async")
def send_async():
send_mail_task.delay("test@example.com")
return "メール送信を受け付けました"
これで、画面はすぐに表示され、メール送信は裏で進みます。 宅配便の「受付完了」と同じイメージです。
6. 非同期メール送信の動作イメージ
ここで、処理の流れを整理してみましょう。
- ① ユーザーが送信ボタンを押す
- ② FlaskがCeleryにメール送信を依頼
- ③ Flaskはすぐに画面を返す
- ④ Celeryが裏でメール送信を実行
この仕組みによって、Flask メール送信 非同期、Celery メール送信という検索ニーズを満たせます。
7. 初心者がつまずきやすいポイント
よくある勘違いは、「なぜ画面にメール送信結果が出ないのか」という点です。 非同期処理では、結果をすぐに返さないのが普通です。
メールは「あとで送られるもの」と考えましょう。 今は「依頼できたかどうか」だけが大切です。
FlaskとCeleryを使うときは、 すぐ終わる処理と時間がかかる処理を分けて考えることが重要です。
8. Flask×Celeryでメール非同期化するメリット
メール送信を非同期化すると、次のような良い点があります。
- 画面が固まらない
- ユーザーの操作感が良くなる
- サーバーの負担を減らせる
Flask 非同期処理、Celery タスク管理、メール送信 非同期という組み合わせは、 実務でもよく使われる基本パターンです。