[PHP] Swift Mailer の使い方
Swift Mailer のインストールとメール送信方法。
Swift Mailer を使うと外部 SMTP サーバーからのメール送信が簡単、 HTML メール送信が簡単におこなえる。そして、モダンらしい。
Swift Mailer を選んだ理由
- 外部 SMTP サーバーを指定できる、そして簡単
- マルチパートメール送信ができる ( HTML メール送信時には、テキストパートもつけたい)
- ファイル添付ができる
- composer でインストールできる
- コードが難解ではない
メール送信ライブラリを検索すると、 PHPMailer , Swift Mailer (たまに PEAR , Zend_Mail ) が鉄板らしい。
PHPMailer と Swift Mailer の間に大きな違いはないようだけれど、モダンということで Swift Mailer を選んだ。
注意: Swift Mailer version 6 以上だと、 PHP 7.0 以上でないとダメ。
Swift Mailer のインストール
composer を使ってインストールする。
(いつも忘れるけど、インストールする場所に移動 cd
してからコマンドを実行しよう。)
Installation – 公式ドキュメント
$ composer require swiftmailer/swiftmailer
Using version ^6.2 for swiftmailer/swiftmailer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 7 installs, 0 updates, 0 removals
- Installing symfony/polyfill-php72 (v1.12.0): Downloading (100%)
- Installing symfony/polyfill-mbstring (v1.12.0): Downloading (100%)
- Installing symfony/polyfill-intl-idn (v1.12.0): Downloading (100%)
- Installing symfony/polyfill-iconv (v1.12.0): Downloading (100%)
- Installing doctrine/lexer (1.0.2): Downloading (100%)
- Installing egulias/email-validator (2.1.11): Downloading (100%)
- Installing swiftmailer/swiftmailer (v6.2.1): Downloading (100%)
symfony/polyfill-intl-idn suggests installing ext-intl (For best performance)
egulias/email-validator suggests installing ext-intl (PHP Internationalization Libraries are required to use the SpoofChecking validation)
swiftmailer/swiftmailer suggests installing ext-intl (Needed to support internationalized email addresses)
swiftmailer/swiftmailer suggests installing true/punycode (Needed to support internationalized email addresses, if ext-intl is not installed)
Writing lock file
Generating autoload files
ファイルダウンロードが必要な場合は、 GitHub から swiftmailer/swiftmailer
テキストメール送信
これが基本的な使い方。
require_once
で SwiftMailer を読み込む- SMTP サーバーの設定 ( ここでは
localhost
, ポート 25 番を指定している) - Swift_Mailer クラスを
new
する - メッセージの作成 (引数に件名を渡し、 Swift_Message クラスを
new
する)
From , To や CC などと、本文をセット - メッセージの送信 (戻り値は送信したメールの数)
// 1. SwiftMailer を読み込む
require_once '/パス/vendor/autoload.php';
// 2. SMTP サーバーの設定
$transport = new Swift_SmtpTransport('localhost', 25);
// 3. Swift_Mailer クラスを new する
$mailer = new Swift_Mailer($transport);
// 4. メッセージの作成
$message = new Swift_Message('Hoge Subject');
$message->setFrom(['test@hoge.com' => 'TEST']);
$message->setTo(['hoge1@hoge.com', 'hoge2@hoge.com']);
$message->setBody('This is TEST.');
// 5. メッセージの送信
$result = $mailer->send($message);
var_dump($result); // int(2) 2 つのあて先に送信したから
SMTP サーバーの設定
テキストメール送信の項では、ローカルホストを指定している。外部 SMTP サーバーの設定も簡単。
・ Swift_SmtpTransport
の引数
第一引数:ホスト名 , 第二引数:ポート番号 , 第三引数:プロトコル
第三引数のプロトコルは、 25
番ポートならなし(よって省略)、 587
番ポートなら tls
、 465
番ポートなら ssl
、ポート 587
や 465
を使っていても、プロトコルを記載していないコード例もあるため、省略しても動くかもしれない。
どのポート番号とプロトコルが使えるのかは、使用する SMTP サーバーで確認する。
例えば、 Gmail SMTP サーバーの要件とか。
* Gmail と Mailgun の書き方が異なるが、どっちで書いても同じ。
Sendmail を使う
Linux や Unix 上でプログラムを動かしている場合、ローカルにある Sendmail
を指定することもできる。
$transport = new Swift_SendmailTransport('/usr/sbin/sendmail -bs');
Gmail の SMTP サーバー
$transport = new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl')
->setUsername('Gmail アドレス')
->setPassword('Google パスワード');
Mailgun の SMTP サーバー
Mailgun のコントロールパネルにて、対象ドメインの SMTP credentials にメールアドレスを追加し、パスワードを取得する。
$transport = new Swift_SmtpTransport('smtp.mailgun.org', 587, 'tls');
$transport->setUsername('SMTP credentials に追加したアドレス');
$transport->setPassword('パスワード');
HTML + テキスト形式のマルチパートメール送信
1 つのメールにテキスト形式と HTML 形式を両方含めたメールを送信する。
HTML メールを表示できない、または、しない設定にしている人もいるので、 HTML メールを送信する場合はテキスト形式も一緒に送信する。
// HTML 形式のメール本文
$html = 'これはテスト送信です。
';
// テキスト形式のメール本文
$text = 'これはテスト送信です。';
$message = new Swift_Message();
$message->setSubject('HTMLメール件名');
$message->setFrom(['test@hoge.com' => 'TEST']);
$message->setTo(['hoge1@hoge.com', 'hoge2@hoge.com']);
// メール本文に HTML パートをセット
$message->setBody($html, 'text/html');
// メール本文にテキストパートをセット
$message->addPart($text, 'text/plain');
$mailer->send($message);
受信したメールのソースを表示すると、 Content-Type: text/plain;
と Content-Type: text/html;
の 2 つに別れていることが確認できる。
また、メーラーの表示形式を「プレーンテキスト」とかにすると、テキスト形式のメール本文が表示される。