カテゴリ: Flask 更新日: 2026/01/06

Flask×Celeryでメール送信を非同期化する手順をやさしく解説|初心者向けタスク管理入門

Flask×Celeryでメール送信を非同期化する手順を解説
Flask×Celeryでメール送信を非同期化する手順を解説

先生と生徒の会話形式で理解しよう

生徒

「Flaskでお問い合わせメールを送ると、画面が固まることがあるんですが、どうすればいいですか?」

先生

「それはメール送信に時間がかかっているからです。Celeryを使って、メール送信を非同期処理にすると解決できます。」

生徒

「非同期処理って難しそうです……。パソコンもあまり触ったことがなくて。」

先生

「大丈夫です。今回はFlaskとCeleryを使って、メール送信を裏で動かす仕組みを、たとえ話を交えながら説明します。」

1. Flaskでメール送信が遅くなる理由

1. Flaskでメール送信が遅くなる理由
1. Flaskでメール送信が遅くなる理由

Flask(フラスク)は、Pythonで作られたシンプルなWebアプリの仕組みです。 お問い合わせフォームや会員登録などで、メール送信を行う場面はとても多いです。

しかし、メール送信は「外部のメールサーバー」と通信するため、どうしても時間がかかります。 これは、手紙を郵便局に持っていって、配達されるまで少し待つのと似ています。

Flaskでそのままメール送信をすると、送信が終わるまで画面が待ち状態になります。 その結果、「画面が固まった」「送信ボタンを何度も押してしまう」という問題が起こります。

2. 非同期処理とCeleryの基本的な考え方

2. 非同期処理とCeleryの基本的な考え方
2. 非同期処理とCeleryの基本的な考え方

非同期処理とは、「時間のかかる作業を裏で進める仕組み」です。 レストランで注文だけ先に受けて、料理は厨房で作るイメージです。

Celery(セロリ)は、その裏作業を担当する専用スタッフのような存在です。 Flaskが「メール送信お願い!」と依頼すると、Celeryが代わりに処理します。

これにより、Flaskはすぐに画面を返せるため、ユーザーは待たされません。 Flask 非同期処理、Flask Celery、タスク管理というキーワードでよく検索される理由です。

3. Flaskでメール送信する最小サンプル

3. Flaskでメール送信する最小サンプル
3. Flaskでメール送信する最小サンプル

まずは、非同期化する前の「普通のメール送信」を見てみましょう。 ここでは「送信しました」と表示するだけの簡単な例です。


from flask import Flask

app = Flask(__name__)

@app.route("/send")
def send_mail():
    print("メールを送信しました")
    return "送信完了"

if __name__ == "__main__":
    app.run()

実際のメール送信処理は省略していますが、 ここに時間のかかる処理が入ると、画面表示が遅くなります。

4. Celeryでメール送信タスクを作る

4. Celeryでメール送信タスクを作る
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のメールタスクを呼び出す

5. 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. 非同期メール送信の動作イメージ

6. 非同期メール送信の動作イメージ
6. 非同期メール送信の動作イメージ

ここで、処理の流れを整理してみましょう。

  • ① ユーザーが送信ボタンを押す
  • ② FlaskがCeleryにメール送信を依頼
  • ③ Flaskはすぐに画面を返す
  • ④ Celeryが裏でメール送信を実行

この仕組みによって、Flask メール送信 非同期、Celery メール送信という検索ニーズを満たせます。

7. 初心者がつまずきやすいポイント

7. 初心者がつまずきやすいポイント
7. 初心者がつまずきやすいポイント

よくある勘違いは、「なぜ画面にメール送信結果が出ないのか」という点です。 非同期処理では、結果をすぐに返さないのが普通です。

メールは「あとで送られるもの」と考えましょう。 今は「依頼できたかどうか」だけが大切です。

FlaskとCeleryを使うときは、 すぐ終わる処理時間がかかる処理を分けて考えることが重要です。

8. Flask×Celeryでメール非同期化するメリット

8. Flask×Celeryでメール非同期化するメリット
8. Flask×Celeryでメール非同期化するメリット

メール送信を非同期化すると、次のような良い点があります。

  • 画面が固まらない
  • ユーザーの操作感が良くなる
  • サーバーの負担を減らせる

Flask 非同期処理、Celery タスク管理、メール送信 非同期という組み合わせは、 実務でもよく使われる基本パターンです。

本文テキスト文字数:約2820文字(全角の平仮名・カタカナ・漢字のみ、コード除外)

カテゴリの一覧へ
新着記事
New1
Python
Pythonでセットの要素数を調べる方法(len()の使い方)を初心者向けに解説!
New2
Python
Pythonのfrozensetとは?ミュータブルなsetとの違いをわかりやすく解説
New3
Flask
FlaskでPOSTリクエストを受け取る方法!初心者でもわかるJSONデータの受け取り方
New4
Python
Pythonでセットを活用してデータをフィルタリングする方法!初心者でもわかるセットの基本と使い方
人気記事
No.1
Java&Spring記事人気No1
Flask
Flaskとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.2
Java&Spring記事人気No2
Python
Pythonでトランザクション処理を実装する方法を完全解説!commit・rollbackで安全なSQL操作
No.3
Java&Spring記事人気No3
Python
Pythonで仮想環境(venv)を作る方法!初心者向けに環境構築をステップ解説
No.4
Java&Spring記事人気No4
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.5
Java&Spring記事人気No5
Flask
FlaskでAPIを作る基本!初心者向けに仕組みと特徴をやさしく解説
No.6
Java&Spring記事人気No6
Flask
Flask‑RESTfulでREST APIを構築する手順まとめ!初心者向けにやさしく解説
No.7
Java&Spring記事人気No7
Python
Pythonの文字列から一部を抽出する方法!スライスを使った基本的な切り出し方
No.8
Java&Spring記事人気No8
Flask
FlaskのSQLAlchemyでフィルタリング検索!filter, filter_byの使い方完全ガイド