0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloud Run Functions入門 ~なんでもメール通知を作る~

Posted at

Cloud Run Functionsにリニューアル

前回Cloud FunctionsがCloud Runに統合されCloud Run functionsになったことを紹介しました。

今回は実際にCloud Run functionsを利用してみたいと思います。

URL叩く→メールを送信

個人で開発したサイトやシステムのエラー時にメールで通知が行くと便利ですが、いちいちメール送信のためのコードを書くのは面倒です。

そんなときにメール通知用のCloud Run functionsを作っておくとURLを叩く(httpでPost)だけで、メールの送信をすることができます。

Snapshot_294.PNG


↓このURLからPostする(件名、内容は送信時に指定できます)
スクリーンショット 2025-04-13 085637.png


今回はこちらの作成例を紹介します。(Google Cloudのアカウント、アプリパスワードが必要です。)

アプリパスワードはこちらから(セキュリティ設定から2段階認証が必要です)

※こちらを作成したアカウントからメールが送信されます

Cloud Run Functions作成

Cloud Runのページを開きます(前回の通りCloud Functionsのページはなくなりました)。[関数を作成]をクリック。

Snapshot_273.PNG


今回はソースを直接入力するので[インライン エディタで関数を作成する]を選択します。サービス名を適当に付けてリージョンを選んで下さい。あまり変わらないですがとりあえずリージョンは東京にしておきます。

Snapshot_274.PNG


ランタイムは今回はPythonにします。トリガーは今回設定しませんがスケジューラーで利用するときは必要です。どこでも呼べるように未認証の呼び出しを許可しますが、緊急の通達など万が一でも呼び出されたらまずいものであれば認証を設定して下さい。

Snapshot_275.PNG


今回はリクエストベースにします。そうすると呼び出された時に起動するので動作が遅くなりますが費用は安く抑えられます。

Snapshot_276.PNG


次にコンテナの設定から[変数とシークレット]タブに移ります。

Snapshot_277.PNG


ここに環境変数を設定します。今回は送り元のアドレス(上のアプリパスワードを発行したGoogleアカウントのアドレス)、送り先のアドレス(こちらは呼び出し時に指定することもできますが、固定としました)、アプリパスワードを設定しておきます。

Snapshot_290.PNG


[完了]を押して保存し、特に設定することはないので [作成] を押します。

Snapshot_279.PNG


ソースの編集画面になります。今回は次のようにしました。

Snapshot_280.PNG


main.py
import functions_framework
import os
from smtplib import SMTP
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

GMAIL_HOST = 'smtp.gmail.com'
GMAIL_PORT = 587

def send_email(account, password, msg):

    # Gmailのサーバ接続
    server = SMTP(GMAIL_HOST, GMAIL_PORT)

    # STARTTLSで暗号化
    server.starttls()

    # ログイン処理
    server.login(account, password)

    # メールを送信する
    server.send_message(msg)

    # 閉じる
    server.quit()

def make_msg(from_email, to_email, title, content):

    # MIMETextでメールの内容を作成作成
    msg = MIMEMultipart()

    msg['Subject'] = title
    msg['From'] = from_email
    msg['To'] = to_email
    message = content
    msg.attach(MIMEText(message, "plain"))

    return msg

@functions_framework.http
def hello_http(request):

    request_json = request.get_json(silent=True)

    if not request_json:
        raise RuntimeError("get json error")


    if 'title' not in request_json or 'content' not in request_json:
        raise RuntimeError("json key error")

    try:

        title = request_json['title']
        content = request_json['content']

        # アカウント設定
        account = os.environ['MAIL_FROM']
        password = os.environ['PASSWORD']

        # メールの送信元・送信先設定
        from_email = os.environ['MAIL_FROM']
        to_email = os.environ['MAIL_TO']

        # メッセージ作成
        msg = make_msg(from_email, to_email, title, content)

        # # メールの送信
        send_email(account, password, msg)

        return 'send success'

    except Exception as e:
        print(e)
        raise RuntimeError("mail send error")

Smtplibによるメールの送信です。Smtplibについて詳しくはこちらを参考にして下さい。

デフォルトのエントリーポイントが"hello_http"なのでそのままこちらの名前で関数を作りました。Functionが起動するとこちらの関数が呼び出される形になります。変えても問題ありません。

request.get_jsonでPost時のJSONを受け取れます。今回はタイトルと内容だけを受け取りましたが、送信先アドレスを受け取って使うこともできます。


今回はrequirements.txtを追加しませんでしたが、必要なパッケージがあるなら追記します。また「+」マークをクリックで別のファイルも追加できます。

Snapshot_295.PNG


では [保存して再デプロイ] でデプロイします。

Snapshot_281.PNG


少し時間がかかります。

Snapshot_282.PNG


エラーにならなければOKです。エラーの場合はログを確認してソースを再度修正して下さい。

[テスト]ボタンからテストしてみます。curlするだけなのでそんなに意味はないですが認証の問題かどうか把握するためにやっておきます。

Snapshot_283.PNG


POST時のテスト用JSONを設定します。今回は"title"と"content"です。

Snapshot_284.PNG


[Cloud Shellでテストする]をクリックします。

Snapshot_285.PNG


テスト用スクリプトが打ち込まれるのでEnterだけ押して下さい。

Snapshot_289.PNG


エラーにならず、メールが送れていたら成功です。(今回はコードで"send success"を返すようにしていますが、何も設定していなければ表示されません。)

Snapshot_286.PNG

スクリーンショット 2025-04-16 214207.png


後は発行されたURLを使ってどっからでも送信してみて下さい。

Snapshot_287.PNG


WindowsのPowerShellから呼び出す例です。

curl.exe -X POST https://func-send-mail-1043149056745.asia-northeast1.run.app -H "Content-Type: application/json" -d '{ \"title\": \"title_test\" , \"content\": \"content_test\" }'

※ここでエラーとなる場合はこのスクリプトか未認証の呼び出しが許可されていないと思われます

Pythonから呼び出す例です。

import requests
import json

MAILHOOK = "https://func-send-mail-175332392539.asia-northeast1.run.app"

json_data = {
    "title": "title_test",
    "content": "content_test"
}

response = requests.post(
    MAILHOOK,
    data=json.dumps(json_data),
    headers={"Content-Type": "application/json"}
)

おわりに

何かの役に立てば幸いです!
見る方多ければトリガーを作ってスケジューラーから呼び出す方法を紹介したいと思います!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?