こんにちは! webエンジニアデビューして3ヶ月が経ちました。
ようやく仕事にも慣れてきて、3ヶ月間で学んできたことをアウトプットしたい気持ちが高まってきたので、少しずつ記事を投稿させて頂き、更なるアドバイスを頂きたいと考えています。よろしくお願い致します!
(あとここの記事でソースコードを書くとき、行列番号とか色がついて綺麗に見せるやつをどうやって使うのか…どなたかこそっと教えて頂けると助かります…)
さて、今回はCakePHP3のEmailクラスを使い、メールを一斉配信する方法を考えてみました。
条件
- BCCではなくToで送信(BCCを使うとスパムと認識される可能性があるらしい)
- メール本文内に、受信者の名前を表示する
- テンプレートを使う
- cakePHPのインストールにはcomposerを使用し、その後bakeしている
Controller
<?php
namespace xxx;
use xxx;
use Cake\Mailer\Email; //これを追加
—中略—
public function mail(){
//送信のため使用する配列の構造はこんなかんじにしています
$mail_list[0] = [‘address’ => ‘n_nobi@xxx.com’, ‘name’ => ‘野比 のび太’];
$mail_list[1] = [‘address’ => ‘s_isono@xxx.com’, ‘name’ => ‘磯野 サザエ’];
$mail_list[2] = [‘address’ => ‘s_nohara@xxx.com’, ‘name’ => ‘野原 しんのすけ’];
//メールに複数の変数を使いたいときの見本として$urlを使用してみる
$url = ‘http://cafe.geekgirl-labo.com/’;
foreach($mail_list as $mail){
$email = new Email();
$email->from([‘自分のメールアドレスをここに入力’ => ‘自分の名前’])
->to($mail[‘address’])
->subject(‘メールの件名’)
->viewVars([
//メール本文で使いたい変数を、メール本文での変数名 => Controller側での変数名で指定する
‘name’ => $mail[‘name’],
‘url’ => $url
])
->template(‘テンプレートファイルの名前(.ctpを除いたもの)’)
->emailFormat(‘html’) //html形式のメールを送りたい場合に記入
->send();
}
}
Template
<?= $name; ?>様<br />
<a href=”<?= $url; ?>”>こちら</a>へアクセスをお願い致します。
※今回はhtml形式でテンプレートを作成したので、phpのviewを作成する感覚でメールテンプレートを作成することができました。ちなみに保存場所は「src/Template/Email/html」です。
出来上がり(1件目の場合)
To.n_nobi@xxx.com
本文
野比のび太様
こちらへアクセスをお願い致します。
こんなかんじになりました!
ただforeachを使用することで、宛先が多くなった場合にメモリ不足に陥ったり、そうはならずとも動作がとても重くなるような気がします。個人的にメモリ不足にはとても嫌な思い出があるので、メモリ不足由来による「あの赤い画面」はもう見たく無いよ…ってかんじです。
ちなみに「->to(ここに3件全てのメールアドレスを記述)」という方法を取ってみると、3人同時にToに入っている状態となり、面識のない他2人のメールアドレスがバレる事態になりました…(昔よく発生していた、メアド変えました報告問題みたいですね)。よく考えれば当たり前ですが、開発中ってこのくらいのことが思い付かなくなるくらい判断能力鈍ってたりしますよね…?
「こう書けばもっと早くなるよ!」というのをご存知の方がいらっしゃいましたらコメントを頂けると嬉しいです!
ありがとうございました!
金子風月
最新記事 by 金子風月 (全て見る)
- vue.jsに触ってみた話 - 2019年3月26日
- DockerでCakePHP2の開発環境を作ってみた(Mac版) - 2019年3月15日
- CakePHP3+Authコンポーネントで任意のタイミングでログインさせる処理をつくる - 2019年3月14日
おお!!就職先で、CakePHPを使っていらっしゃるんですね!素晴らしいですー!!大活躍してるみたいで、嬉しいです!
> 行列番号とか色がついて綺麗に見せるやつ
これは、SyntaxHighlighterという機能です。使い方は以下をご覧ください。
http://vdeep.net/wp-syntax-highlighter-evolved
> 宛先が多くなった場合にメモリ不足に陥ったり、そうはならずとも動作がとても重くなる
実務だと、ユーザー数がめっちゃ多いとかありますからね。
あと、気をつけないといけないのが、プログラムから自動送信メールを送りまくると、スパム認定されて、迷惑メールフォルダに入りやすくなります。
メモリ不足と迷惑メール認定を同時に回避(迷惑メール認定回避は100%ではありませんが)する方法が、
「一旦TEMPテーブルに入れて、ちょっとずつ送る」という方法です。
送信先、本文などを一回別のテーブルに入れます。
そこから、cronなどで、10分に一回などのペースで、一回に50件とか、ちょっとずつ送る方法があります。
cronはまたちょっと高度ですし、サーバー側で設定が必要なのですが、ぜひチャレンジしてみてください!
柳田さん、今回も教えてくださりありがとうございます!
毎日新しい専門用語に戸惑っていますが、なんとかしがみついて生き残ってます!
メモリ不足対策と迷惑メール認定を同時に回避できるとは…! そんなに便利なものがあったんですね。
今回の案件では同時に3~5件で済みそうだからこれでOKを頂きましたが、今後必ずcronを使う場面に出くわしそうです。その時のためにも調べてみます!
ありがとうございました。