こんにちは! webエンジニアデビューして3ヶ月が経ちました。
ようやく仕事にも慣れてきて、3ヶ月間で学んできたことをアウトプットしたい気持ちが高まってきたので、少しずつ記事を投稿させて頂き、更なるアドバイスを頂きたいと考えています。よろしくお願い致します!
(あとここの記事でソースコードを書くとき、行列番号とか色がついて綺麗に見せるやつをどうやって使うのか…どなたかこそっと教えて頂けると助かります…)

さて、今回はCakePHP3のEmailクラスを使い、メールを一斉配信する方法を考えてみました。

条件

  1. BCCではなくToで送信(BCCを使うとスパムと認識される可能性があるらしい)
  2. メール本文内に、受信者の名前を表示する
  3. テンプレートを使う
  4. 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人のメールアドレスがバレる事態になりました…(昔よく発生していた、メアド変えました報告問題みたいですね)。よく考えれば当たり前ですが、開発中ってこのくらいのことが思い付かなくなるくらい判断能力鈍ってたりしますよね…?
「こう書けばもっと早くなるよ!」というのをご存知の方がいらっしゃいましたらコメントを頂けると嬉しいです!

ありがとうございました!

The following two tabs change content below.

金子風月

犬と歯車がついたものと跨り移動系スポーツ(馬・自転車)が好きな駆け出しweb系SE(Lv.1)。 2018年2月より、株式会社凛の皆様のおかげでSEになることができました。 現在はcakePHPを愛でたりAWSと喧嘩したりしながら楽し苦すごしています。