[PHP] Swift Mailer の使い方

2019-12-04PHPMail

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

テキストメール送信

これが基本的な使い方。

  1. require_once で SwiftMailer を読み込む
  2. SMTP サーバーの設定 ( ここでは localhost , ポート 25 番を指定している)
  3. Swift_Mailer クラスを new する
  4. メッセージの作成 (引数に件名を渡し、 Swift_Message クラスを new する)
    From , To や CC などと、本文をセット
  5. メッセージの送信 (戻り値は送信したメールの数)
// 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 番ポートなら tls465 番ポートなら ssl 、ポート 587465 を使っていても、プロトコルを記載していないコード例もあるため、省略しても動くかもしれない。
どのポート番号とプロトコルが使えるのかは、使用する 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 つに別れていることが確認できる。
また、メーラーの表示形式を「プレーンテキスト」とかにすると、テキスト形式のメール本文が表示される。

Posted by Agopeanuts