ディーバ Blog

大阪発 C#の会社、株式会社ディーバの Blog です。

Azure App Service上のPHPでmb_send_mailを使う方法

青柳 @ShinichiAoyagi です。
ブログを書くのも技術系の記事を書くのもすごく久しぶりな感じですが、なぜかPHPネタ。
(単にめったに使わないPHP関連のことだとさっさとどっかに書いとかないと忘れちゃうからという理由です)

ディーバが作ったわけではいなのですが、Webサイト(いわゆるホームページ)でPHPの以下の構文でメールを送信しているそうです。

mb_send_mail($to,$subject,$msg,$header)

これをAzure App Serviceに配置したところメールが送信されないとのこと。
mb_send_mail関数って始めて知りましたがパラメーターにSMTPサーバーの指定もないので「いったいどこに向かって送信しているんだ?」と思って調べてみたらlocalhostの25番ポートに送っているとのこと。App ServiceのlocalhostにSMTPサーバーなんて動いてないですからそりゃ送信できないですよね。
だいたいこういうのはphp.iniで設定できるんだろうと調べてみたらありました。

https://www.php.net/manual/ja/mail.configuration.php

しかし、残念ながらTLS/SSLで接続したり認証付きで接続したりはできないとのこと。どうやらそういうのはPHPMailerなりを入れてやれということなようです。
しかし今回はできれば修正なしでなんとかしたいとのことで。
php.iniのsendmail_pathはWindowsでも使えるとあるのでこれでなんとかしてみました。

まずはphp.iniの設定。
あれ?php.iniってどこに置けばいいんだ?となりましたがググったら出てきました。

PHP アプリの構成 - Azure App Service | Microsoft Docs

今回設定したいsendmail_pathはPHP_INI_SYSTEMなのでどっかにphp.iniを入れてそのパスをPHP_INI_SCAN_DIRに書いておけばいいそうです。
上記だとAzure CLIで設定していますがAzureポータルの[構成]で設定することもできます。その場合は以下。

f:id:ShinichiAoyagi:20201220112410p:plain:w300
AzureポータルでPHP_INI_SCAN_DIRを設定

php.ini自体はFTPでアップロードするなりkuduで作るなりします。
私はこれくらいのファイルならKuduの[Debug console]-[CMD]でディレクトリー作ったりファイル作ったりしちゃいます。今回は上記と同じようにd:\home\site\iniにphp.iniを作りました。

次はsendmailです。
今回は以下のsendmailを使わせてもらいました。Unixのsendmailと同じように動くWindows版sendmailならば何でもいいです。

GitHub - sendmail-tls1-2/main: Sendmail.exe is a windows program that's emulates unix sendmail behavior

このsendmail.exeなどをd:\home\site\sendmailディレクトリーを作りそこに入れました。
もちろんphp.iniのsendmail_pathにはこのsendmai.exeのパスを書いておきます。

あとはsendmail.iniを書くだけです。
今回はSMTPサーバーはSendGridだったので以下を参考に設定しました。

SendGrid - SMTPの接続情報を教えてください。 – サポート

これで無事mb_send_mailでメールを送信できるようになりました。

--

上記を調べている過程で↓の記事をみつけてこれも試してみようとなったんですが「あれ?App Service上のPHPでComposerってどうやるんだ?」となったのでここからはその記録です。

PHPからSendGridを使ってトランザクションメールを送信する方法 | SendGridブログ

Composerは拡張機能として用意されています。
AzureポータルのApp Serviceの[拡張機能]-[追加]-[拡張機能の選択]を開いてComposerを探します。これをインストールしてやればOKです。
このComposerはたぶん↓これです。Cory Fowler氏ってMicrosoftの人っぽいです。

GitHub - SyntaxC4-MSFT/ComposerExtension: Brings Composer Support to Azure Websites via a Site Extension

インストール後にApp Serviceを再起動してやるとkuduの[Debug console]-[CMD]でcomposerコマンドが使えるようになっていました。
なのであとは上記記事にあるようにcomposer.jsonを作ってやって以下のようにcomposerコマンドを使ってやればPHPで new \SendGrid\Mail\Mail() としてSendGridにメールできました(記事にあるソースで Dotenv\Dotenv::create(__DIR__) のところは Dotenv\Dotenv::createImmutable(__DIR__) としてやらないとダメでしたが他はそのまま)。

> composer require vlucas/phpdotenv && touch .env
> composer require sendgrid/sendgrid

--

Azure App ServiceでPHPを動かそうという人がどれくらいいるのかわかりませんし、私自身も始めてだったんですが、このようにphp.iniも使えるしComposerも使えるしで結構ちゃんと使えました。