CakePHP5入門【CakePHP5応用編⑦】メール送信①
A子
C菜
ggrksと~
A子
それじゃGoogleで検索してみようか
キーワードは「CakePHP5 メール送信」で良いかな?
C菜
(クリックすると別ウィンドウで開きます)
A子
なんだかここに全部書かれてる気がする…(苦笑)
とりあえず「PostsController.php」の先頭に以下の一文を書こう
use Cake\Mailer\Mailer; |
C菜
$mailer = new Mailer('default');
$mailer->setFrom(['(送信元メールアドレス)' => '(送信者名)']) ->setTo('(宛先メールアドレス)') ->setSubject('(件名)') ->deliver('(本文)'); |
A子
C菜
define("FROM_ADDRESS", "root@friction-river.jp");
define("FROM_NAME", "掲示板システム"); define("TO_ADDRESS", "xxxx@xxxx"); define("MAIL_SUBJECT", "投稿通知"); define("MAIL_BODY", "掲示板に新たな投稿がありました。"); |
注:「TO_ADDRESS」の値については伏字にしています
A子
それじゃ、さっきのコードを定数に置き換えてっと…
$mailer = new Mailer('default');
$mailer->setFrom([FROM_ADDRESS => FROM_NAME]) ->setTo(TO_ADDRESS) ->setSubject(MAIL_SUBJECT) ->deliver(MAIL_BODY); |
これでもうメール送信できるかな?
C菜
さっきのWebページの真ん中からちょい下に「トランスポートの設定」ってありますよ~
多分、これは必要なことなんじゃないですかね~?
A子
くっ、わけ分からん…
C菜
・・・
C菜
もしもこのWebサーバ上でメールサーバも稼働しているのなら、「className」を「Smtp」に変えるだけで良いはずです~
(「host」や「port」もそのままで…)
A子
開発環境構築編でメールサーバの設定なんてやったっけ?
覚えがないような…
C菜
なので、選択肢は二つあります~
一つはメールサーバをこの開発環境にインストールすること
もう一つは外部のメールサーバを利用するコードを書くことです~
A子
C菜
(本番環境でメールサーバが動いているなら、開発環境もそうすべきってことです~)
A子
ちょっと呼んでくるよ
B美
本番環境のサーバマシン上でメールサーバが動いてるかどうか…ですって?
もちろん稼働しているわよ
だって私が作ったWebアプリもメール送信機能を実装してるしね
C菜
B美
ただ、インストールはすぐにできるんだけど、サーバの設定がねぇ
A子
もしかして難しい?
B美
うーん、そうねぇ
Postfixだと面倒だから、exim4にしようかしら…
A子
B美
Sendmail、Postfix等々…
exim4ってのもその一つね
C菜
B美
ただ、さっきも言ったように設定がちょっとだけ面倒くさいのよね(苦笑)
A子
B美
んじゃ、さくっとexim4を入れちゃいましょうか
「MATE端末」を開いてから、以下のコマンドを打ち込んでね
su -[Enter]
apt install -y exim4[Enter] |
↓
B美
(これこそがexim4を選んだ理由ね)
dpkg-reconfigure exim4-config[Enter] |
って打ち込むと、以下の画面が出現するわ
A子
B美
で、次の画面で気を付けて欲しいのが、一番上の「internet site」か、二番目の「mail sent by smarthost」を選択するってことね
(最初はデフォルトで「local delivery only」になってるかもしれない)
あ、選択自体は上下カーソルキーで、選択欄を切り替えるにはTabキーを押すこと
A子
B美
「mail sent by smarthost」の場合は、アクセス権を持つ他のメールサーバを利用して宛先メールサーバと接続する形ね
C菜
A子
でも、わざわざ「mail sent by smarthost」を説明した理由が何かあるんじゃないの?
B美
A子にしては良い勘してるじゃん
実は「ダイナミックDNSサービス」を使う場合って、宛先のメールサーバがメールの受け取りを拒否することが多々あるのよ
(Gmailや携帯電話会社のメールアドレス等)
C菜
B美
(てか、うちもそうだけど…)
つまり、うちで使ってる本来のドメイン名って、外部に借りているサーバのものなのよ
(我が社は「さくらインターネット」のVPSサーバを借りてるけどね)
なので、「MyDNS.JP」という無料の「ダイナミックDNSサービス」を使うことで、社内に設置しているサーバをインターネット上に公開してるってわけ
A子
C菜
それは良いとして、「メールの受け取り拒否」って何か対策はできないんですか~?
B美
(残念ながら…)
A子
これって他のメールサーバにメール送信を代行してもらうってことでしょ?
B美
要するに、うちで契約しているプロバイダのメールサーバか、我が社で運用しているメールサーバのどちらかを指定すれば良いってわけ
C菜
B美
ちなみに、OSのインストール時にサーバのホスト名を「debian」のままにしていたから、初期値は以下の通りよ
↓
C菜
なんだか少し違うみたいなんですが~
B美
ここに設定するのは、さっき言った「ダイナミックDNSサービス」のドメイン名よ
C菜
私も自宅のインターネット環境を「ダイナミックDNSサービス」で公開してみようかな~
B美
A子
まぁ良いや
とりあえず次へ進もう
B美
C菜
B美
あ、「127.0.0.1」というのはこのサーバ自体のこと(localhostを意味するIPアドレス)だからね
開発環境としては、このままで大丈夫よ
B美
二つ前の画面で入力したドメイン名と同じものを入力すること!(必ずね)
B美
(正確に言えば、Tabキー → Enterキー)
B美
利用するメールサーバ名を入力してね
(その際、「サーバ名::ポート番号」の形で入力すること)
ちなみに、一部伏字にしています
B美
まぁ、普通は「No」のままで良いと思う
B美
B美
B美
(送信しかしないから関係ないんだけど…)
B美
C菜
これでメールを送信できるようになったんでしょうか~?
B美
プロバイダのメールサーバを使うにはIDとパスワードが必要だからね
それを設定します
「MATE端末」で以下のコマンドを打ち込んでね
nano /etc/exim4/passwd.client[Enter] |
B美
(三つの要素をコロンで接続する形)
あと、伏字だらけなのは勘弁してね(笑)
B美
echo "test" | mail -s "Test" xxxx@xxxx[Enter] |
これは、手動でメール送信を行うコマンドよ
(「test」がメール本文で、「Test」がタイトル)
あ、必ず受信確認できるメールアドレスあてに送ってね
(宛先である「xxxx@xxxx」の部分を適宜書き換えるように!)
C菜
A子
超・簡単じゃん
んじゃ、掲示板に投稿して確認してみよう
C菜
まだ「bbsapp/config」の中の「app.php」を書き換えてませんよ~
A子
あと、送信元のメールアドレスは「root@friction-river.mydns.jp」に変えておくべきかな?
C菜
A子
んじゃ、テスト投稿してみますか…
C菜
なんの苦労も無かったです~
A子
よく考えたら、上記の差出人(送信元)って「なりすまし」てない?
この開発環境って、正しくは「friction-river.mydns.jp」よね?
(というか、「friction-river.jp」になってるのは、さっき「const.php」を書き換えなかったせいだけど…)
B美
だからこそGoogleのGmailなんかでは、メールが届かない(Gmail側が受け取りを拒否する)ことが多々あるんだけどね
(さっき言ったように、DNSサーバにSPFレコードの設定を行えばOKなんだけど、ダイナミックDNSでは無理なのよね)
C菜
これがexim4の「mail sent by smarthost」の話へとつながってくるわけですか~
B美
さて、ちょっと長くなっちゃったから今回はここまでね
(次回もメールの話の続きをやっていきましょう)
A子
それにしても、簡単にメール送信できる「CakePHP」って、やっぱすごいね
C菜