LoginSignup
24
22

More than 5 years have passed since last update.

PHPメール送信ライブラリ SwiftMailer の日本用カスタマイズ

Posted at

1. RFCに従わないキャリアメールにメールを送れるように

デフォルトだと、foo..bar@docomo のように . が連続したり foo.@docomo のように . で終わるユーザー名だとエラーになり送れません。
それを回避する方法

参考
https://teratail.com/questions/28363

2. エンコードを iso-2022-jp にする

デフォルトだとutf-8になりますが、どうしてもiso-2022-jp でないと受け取れないクライアント向けに iso-2022-jp にエンコードする方法

参考
http://uzulla.hateblo.jp/entry/2015/03/20/235252

サンプル

別途 Sample/Email/LooseMimeGrammar.php を作成しておく。

<?php

use Sample\Email\LooseMimeGrammar;

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

            // RFC違反のアドレスにメール送る設定
            // @link https://teratail.com/questions/28363
            \Swift_DependencyContainer::getInstance()
                ->register('mime.grammar')
                ->asSharedInstanceOf(LooseMimeGrammar::class);
        }
    );


// SMTP サーバーとの接続設定
/** @var \Swift_SmtpTransport $transport */
$transport = \Swift_SmtpTransport::newInstance($host, $port);

/** @var \Swift_Mailer $mailer */
$mailer    = \Swift_Mailer::newInstance($transport);

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

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

24
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
22