Friction River Software

  • お問い合わせ

CakePHP5入門【CakePHP5応用編⑦】メール送信①

A子

さってと、前回の宿題だけど、まずはどうしようか?

C菜

先人も言ってます~

ggrksググレカスと~

A子

(笑)
それじゃGoogleで検索してみようか

キーワードは「CakePHP5 メール送信」で良いかな?

C菜

検索結果の上位にあるこのページですけど、公式っぽいので良さげですよ~
(クリックすると別ウィンドウで開きます)

A子

うん、良いね
なんだかここに全部書かれてる気がする…(苦笑)

とりあえず「PostsController.php」の先頭に以下の一文を書こう

use Cake\Mailer\Mailer;

C菜

掲示板への投稿を行う「add」メソッド内にはこれを記述するです~

$mailer = new Mailer('default');
$mailer->setFrom(['(送信元メールアドレス)' => '(送信者名)'])
    ->setTo('(宛先メールアドレス)')
    ->setSubject('(件名)')
    ->deliver('(本文)');

A子

「送信元メールアドレス」「送信者名」「宛先メールアドレス」「件名」「本文」については「const.php」の中に定数化したほうが良いかな?

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子

OK
それじゃ、さっきのコードを定数に置き換えてっと…

$mailer = new Mailer('default');
$mailer->setFrom([FROM_ADDRESS => FROM_NAME])
    ->setTo(TO_ADDRESS)
    ->setSubject(MAIL_SUBJECT)
    ->deliver(MAIL_BODY);

これでもうメール送信できるかな?

C菜

ちょっと待ってくださいです~
さっきのWebページの真ん中からちょい下に「トランスポートの設定」ってありますよ~

多分、これは必要なことなんじゃないですかね~?

A子

コメントに「config/app.phpの中で」って書いてるから、「bbsapp/config」の中の「app.php」を見てみよう

くっ、わけ分からん…

C菜

色々とググってみますね~

・・・



C菜

なんとなく分かりました~

もしもこのWebサーバ上でメールサーバも稼働しているのなら、「className」を「Smtp」に変えるだけで良いはずです~
(「host」や「port」もそのままで…)

A子

ん?
開発環境構築編でメールサーバの設定なんてやったっけ?

覚えがないような…

C菜

やってないですね~
なので、選択肢は二つあります~

一つはメールサーバをこの開発環境にインストールすること
もう一つは外部のメールサーバを利用するコードを書くことです~

A子

どっちが簡単かな?

C菜

このWebアプリを本番環境で稼働させることを考えると、その本番環境に合わせるべきだと思いますよ~
(本番環境でメールサーバが動いているなら、開発環境もそうすべきってことです~)

A子

うーん、これはB美に確認すべきかな…

ちょっと呼んでくるよ

B美

何?
本番環境のサーバマシン上でメールサーバが動いてるかどうか…ですって?

もちろん稼働しているわよ
だって私が作ったWebアプリもメール送信機能を実装してるしね

C菜

だったら、開発環境にもメールサーバをインストールして、動作確認できるようにしたいんですけど~

B美

あー、そっかぁ

ただ、インストールはすぐにできるんだけど、サーバの設定がねぇ

A子

え?何?
もしかして難しい?

B美

難しいというよりは、面倒くさい?

うーん、そうねぇ
Postfixだと面倒だから、exim4にしようかしら…

A子

それって何?

B美

メールサーバソフトっていくつもあるのよ

Sendmail、Postfix等々…
exim4ってのもその一つね

C菜

うちの本番環境サーバにインストールされてるのは何ですか~

B美

私の個人的な好みだけど、Postfixにしているわ

ただ、さっきも言ったように設定がちょっとだけ面倒くさいのよね(苦笑)

A子

開発環境と本番環境でサーバソフトを合わせなくても大丈夫?

B美

全然、問題ないわよ
んじゃ、さくっとexim4を入れちゃいましょうか

MATE端末」を開いてから、以下のコマンドを打ち込んでね

su -[Enter]
apt install -y exim4[Enter]




B美

次にサーバ設定を行うんだけど、なんと設定ツールがあります
(これこそがexim4を選んだ理由ね)

dpkg-reconfigure exim4-config[Enter]

って打ち込むと、以下の画面が出現するわ

A子

Enterキーを押せば良いのよね?

B美

ええ

で、次の画面で気を付けて欲しいのが、一番上の「internet site」か、二番目の「mail sent by smarthost」を選択するってことね
(最初はデフォルトで「local delivery only」になってるかもしれない)

あ、選択自体は上下カーソルキーで、選択欄を切り替えるにはTabキーを押すこと

A子

どっちを選べば良いの?

B美

「internet site」では、このサーバが宛先のメールサーバと直接接続してメールを伝送するの

「mail sent by smarthost」の場合は、アクセス権を持つ他のメールサーバを利用して宛先メールサーバと接続する形ね

C菜

だったら「internet site」のほうが良さげですぅ~

A子

だね

でも、わざわざ「mail sent by smarthost」を説明した理由が何かあるんじゃないの?

B美

ほほう
A子にしては良い勘してるじゃん

実は「ダイナミックDNSサービス」を使う場合って、宛先のメールサーバがメールの受け取りを拒否することが多々あるのよ
(Gmailや携帯電話会社のメールアドレス等)

C菜

ダイナミックDNSサービス」って何ですか~?

B美

一般的な中小企業はみんなそうだと思うんだけど、自社のインターネット環境は固定IPアドレスじゃないところがほとんどなの
(てか、うちもそうだけど…)

つまり、うちで使ってる本来のドメイン名って、外部に借りているサーバのものなのよ
(我が社は「さくらインターネット」のVPSサーバを借りてるけどね)

なので、「MyDNS.JP」という無料の「ダイナミックDNSサービス」を使うことで、社内に設置しているサーバをインターネット上に公開してるってわけ

A子

ふーん

C菜

A子社長の興味が失われてます~(苦笑)

それは良いとして、「メールの受け取り拒否」って何か対策はできないんですか~?

B美

DNSサーバのSPFレコードを記述することで受け取り拒否を回避できるんだけど、「ダイナミックDNSサービス」では絶対に無理なのよ
(残念ながら…)

A子

だったら「mail sent by smarthost」を選択するしかないね

これって他のメールサーバにメール送信を代行してもらうってことでしょ?

B美

そういうこと

要するに、うちで契約しているプロバイダのメールサーバか、我が社で運用しているメールサーバのどちらかを指定すれば良いってわけ

C菜

では、それ(mail sent by smarthost)でいくです~

B美

さて、次の画面も重要なんだけど、ドメイン名の設定よ

ちなみに、OSのインストール時にサーバのホスト名を「debian」のままにしていたから、初期値は以下の通りよ



C菜

あれ?我が社のドメイン名って「friction-river.jp」でしたよね~?

なんだか少し違うみたいなんですが~

B美

そのドメイン名(friction-river.jp)は、うちが外部に借りているサーバのものね

ここに設定するのは、さっき言った「ダイナミックDNSサービス」のドメイン名よ

C菜

なるほどですね~

私も自宅のインターネット環境を「ダイナミックDNSサービス」で公開してみようかな~

B美

セキュリティ面には気を付けないと、自宅のサーバに不正侵入されるかもよ(苦笑)

A子

うへぇ、なんか怖いね

まぁ良いや
とりあえず次へ進もう

B美

次はEnterキーを押すだけね

C菜

OKです~

B美

次の画面はどのコンピュータからの送信要求を受け付けるかよ
あ、「127.0.0.1」というのはこのサーバ自体のこと(localhostを意味するIPアドレス)だからね

開発環境としては、このままで大丈夫よ

B美

次はちょっと注意!

二つ前の画面で入力したドメイン名と同じものを入力すること!(必ずね)

B美

次はEnterキーを押すだけね
(正確に言えば、Tabキー → Enterキー)

B美

次は超・重要!

利用するメールサーバ名を入力してね
(その際、「サーバ名::ポート番号」の形で入力すること)

ちなみに、一部伏字にしています

B美

次は「送信者名を非表示にするか」を聞いてくるんだけど、別にどっちでも良いわ

まぁ、普通は「No」のままで良いと思う

B美

次はEnterキーを押すだけ

B美

下の画面では「No」が選択された状態でEnterキーを押してね

B美

で、次はメールボックスの選択なんだけど、個人的には下の「Maildir」を選んだほうが良いと思う
(送信しかしないから関係ないんだけど…)

B美

次も「No」が選択されたままの状態で、Enterキーを押してね

C菜

終わりました~

これでメールを送信できるようになったんでしょうか~?

B美

いいえ、まだよ

プロバイダのメールサーバを使うにはIDとパスワードが必要だからね
それを設定します

MATE端末」で以下のコマンドを打ち込んでね

nano /etc/exim4/passwd.client[Enter]

B美

記述形式は「メールサーバ名:ID:パスワード」よ
(三つの要素をコロンで接続する形)

あと、伏字だらけなのは勘弁してね(笑)

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菜

どうせ実運用については外部のサーバ上(friction-river.jp)なんですから、このままでも良いんじゃないですか~?

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菜

ですです~