開発中におけるメール送信の扱い方

メールを送信するアプリケーションを開発している際に、開発中では、実際に受信者にメールを送信したくないときもあると思います。 Symfony2 の SwiftmailerBundle を使用すれば、コードの変更をすることなしに、コンフィギュレーションの設定を変更するだけで、この問題を簡単に解決することができます。開発中では、メール送信の処理に関して、主に2つの選択をすることができます。: (a) メール送信を無効にする (b) 特定のメールアドレスにメールを送信する

メール送信を無効にする

disable_delivery オプションを true に設定すればメール送信を無効にすることができます。 Symfony の Standard Distribution の test 環境では、デフォルトでメール送信を無効にしており、この設定になっています。 test 環境でこのようによう指定しているため、テストを実行する際にメールは送信されません。しかし、 proddev 環境では、送信されます。

  • YAML
    # app/config/config_test.yml
    swiftmailer:
        disable_delivery:  true
    
  • XML
    <!-- app/config/config_test.xml -->
    
    <!--
    xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer"
    http://symfony.com/schema/dic/swiftmailer http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd
    -->
    
    <swiftmailer:config
        disable-delivery="true" />
    
  • PHP
    // app/config/config_test.php
    $container->loadFromExtension('swiftmailer', array(
        'disable_delivery'  => "true",
    ));
    

dev 環境でも送信を無効にしたい際には、 config_dev.yml ファイルに同じ設定を追加するだけです。

特定のメールアドレスに送信する

また、メッセージを送信する際に、実際に指定したメールアドレスではなく、全てのメールの送信先を特定のアドレスにすることもできます。 delivery_address オプションを使用してこの設定ができます。

  • YAML
    # app/config/config_dev.yml
    swiftmailer:
        delivery_address:  [email protected]
    
  • XML
    <!-- app/config/config_dev.xml -->
    
    <!--
    xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer"
    http://symfony.com/schema/dic/swiftmailer http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd
    -->
    
    <swiftmailer:config
        delivery-address="[email protected]" />
    
  • PHP
    // app/config/config_dev.php
    $container->loadFromExtension('swiftmailer', array(
        'delivery_address'  => "[email protected]",
    ));
    

そして、次のように recipient@example.com にメールを送信しようとしてみます。

public function indexAction($name)
{
    $message = \Swift_Message::newInstance()
        ->setSubject('Hello Email')
        ->setFrom('[email protected]')
        ->setTo('[email protected]')
        ->setBody($this->renderView('HelloBundle:Hello:email.txt.twig', array('name' => $name)))
    ;
    $this->get('mailer')->send($message);

    return $this->render(...);
}

dev 環境では、メールは、 recipient@example.com には送信されずに dev@example.com に送信されます。 Swiftmailer は、置き換えられたアドレスを X-Swfit-To に指定して、メールのヘッダーに追加します。そうすることによって、実際に送信したかったアドレスを参照することができます。

Note

to に指定したアドレスのみならず、 CCBCC に指定したアドレスにも送信されることはありません。 Swiftmailer はこれらのアドレスを上書きして、 CC であれば、 X-Swift-Cc に、 BCC であれば、 X-Swift-BCC としてメールヘッダに追加します。

ウェブデバッグツールバーで参照する

dev 環境を使用していれば、そのページで送信されたメールは、ウェブデバッグツールバーを使って参照することができます。ツールバーのメールアイコンは送信したメールの数を表しています。そのアイコンをクリックすると、メールの詳細のレポートを見ることができます。

メール送信処理の直後に他のページへリダイレクトする際にはウェブデバッグツールバーは、メールアイコンもレポートもそのリダイレクト後のページに表示されません。

そこで、 config_dev.yml ファイルの intercept_redirects オプションを true にして、リダイレクトを止め、送信メールの詳細のレポートを開くことができるようにすることができます。

Tip

また、他の方法として、リダイレクト後のプロファイラを開き、前のリクエスト ( /contact/handle など)のサブミット URL を探すこともできます。プロファイラの検索機能を使えば、過去のリクエストを全てプロファイルした情報をロードすることができます。

  • YAML
    # app/config/config_dev.yml
    web_profiler:
        intercept_redirects: true
    
  • XML
    <!-- app/config/config_dev.xml -->
    
    <!-- xmlns:webprofiler="http://symfony.com/schema/dic/webprofiler" -->
    <!-- xsi:schemaLocation="http://symfony.com/schema/dic/webprofiler http://symfony.com/schema/dic/webprofiler/webprofiler-1.0.xsd"> -->
    
    <webprofiler:config
        intercept-redirects="true"
    />
    
  • PHP
    // app/config/config_dev.php
    $container->loadFromExtension('web_profiler', array(
        'intercept_redirects' => 'true',
    ));