カテゴリ: 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の文字列型(str)を完全解説!連結・分割・検索の方法を紹介
New2
Python
Pythonで日付文字列から曜日を取得する方法を完全ガイド!初心者でもわかる日時処理入門
New3
Flask
FlaskアプリのSSL設定方法をやさしく解説!初心者でもわかるHTTPS対応の手順
New4
Python
Pythonでリストを辞書に変換する方法を完全ガイド!初心者でもわかるdict()とzip()の使い方
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.3
Java&Spring記事人気No3
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.4
Java&Spring記事人気No4
Python
Pythonでリストをコピーする方法!copy()・スライス・list()の使い方を比較
No.5
Java&Spring記事人気No5
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.6
Java&Spring記事人気No6
Python
Pythonでリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.7
Java&Spring記事人気No7
Flask
Flaskとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.8
Java&Spring記事人気No8
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説