[PHP]Swift Mailerで日本語(ISO-2022-JP)のメールを送信

Pocket

PHP で Gmail などの 外部 SMTP サーバーからメールを送信する場合、Swift Mailer というライブラリがよく使われています。初期設定ではメールの文字コードは UTF-8 が使われているので、一部の古いメールクライアントソフトでは文字化けを起こしてしまう可能性があります。そこで、昔ながらの ISO-2022-JP でメールを送信する方法について説明します。

インストールには Composer が必要です。こちらからダウンロード&インストールしておいて下さい。Windows には .exe 形式のインストーラーがあります。Mac や Linux の場合はターミナルで次のように入力します。

$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/bin/composer

次は Swift Mailer をインストールするために適当なフォルダを作ります。ターミナル(コマンドプロンプト)を使ってそのフォルダに移動し、次のコマンドを入力します

$ composer require swiftmailer/swiftmailer

すると composer.json や vendor フォルダなどが生成されます。vendor フォルダにある autoload.php を require_once などで読み込むことで利用できるようになります。
composer による管理を行わない場合は swiftmailer の lib フォルダだけを取り出して 「lib/swift_required.php」 をrequire_once で読み込む形でも利用可能です。

<?php
require_one __DIR__ . '/vendor/autoload.php';

// アカウントの設定
$config = array(
	'host' => 'smtp.gmail.com',
	'port' => 465,
	'user' => 'example@gmail.com',
	'pass' => 'password',
	'encryption' => 'ssl'
);

// メールの内容
$subject = '件名です';
$body = '本文です';
$from = array('example@gmail.com' => '送信者名');
$to = array('to@example.com' => '受信者名');

// 日本語に関する初期設定
Swift::init(function () {
    Swift_DependencyContainer::getInstance()
        ->register('mime.qpheaderencoder')
        ->asAliasOf('mime.base64headerencoder');
    Swift_Preferences::getInstance()->setCharset('iso-2022-jp');
});

// SMTP サーバーとの接続設定
$transport = Swift_SmtpTransport::newInstance($config['host'], $config['port'])
	->setUsername($config['user'])
	->setPassword($config['pass'])
	->setEncryption($config['encryption']);

$mailer = Swift_Mailer::newInstance($transport);

// メールの作成
$message = Swift_Message::newInstance()
	->setCharset('iso-2022-jp')
	->setEncoder(Swift_Encoding::get7BitEncoding())
	->setSubject($subject)
	->setFrom($from)
	->setTo($to)
	->setBody($body);

// 送信
$result = $mailer->send($message);

例では Gmail の SMTP サーバーからメールを送っています。送信サーバーによってはポートや暗号化方法も異なってくるので環境に合わせて設定を書き換えて下さい。暗号化方法(encryption)には tls と ssl が指定できます。$from や $to を連想配列で指定すると名前を表示できます。配列を使わずに文字列でメールアドレスだけを指定することもできます。

Swift::init() の部分でデフォルトとなる文字コードを指定しています。ここで「iso-2022-jp」を指定しておくと件名や送信者名が ISO-2022-JP(base64)に自動的に変換されます。Swift_Message::newInstance() の部分でも setCharset() が使われていますが、こちらはメッセージ本文にのみ影響します。Swift::init() を行わずに Swift_Message だけに ISO-2022-JP を指定すると、件名と送信者名などは UTF-8(quoted-printable)、本文は ISO-2022-JP という状態になってしまいます。逆に Swift::init() でISO-2022-JP を指定しておけば Swift_Message でのデフォルト文字コードも ISO-2022-JP になっているので、Swift_Message 部分での setCharset() を省略しても実際には問題ありません。


Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です