フォロワー 5

メール送信

注記: このセクションは開発中です。

Yii はメールメッセージの作成と送信をサポートしています。ただし、フレームワークのコアはコンテンツ作成機能と基本的なインターフェースのみを提供しています。実際のメール送信メカニズムはエクステンションによって提供される必要があります。これは、異なるプロジェクトで異なる実装が必要になる場合があり、通常は外部サービスとライブラリに依存するためです。

最も一般的なケースでは、yii2-symfonymailer 公式エクステンションを使用できます。

設定

メールコンポーネントの設定は、選択したエクステンションによって異なります。一般的に、アプリケーションの設定は次のようになります。

return [
    //....
    'components' => [
        'mailer' => [
            'class' => 'yii\symfonymailer\Mailer',
            'useFileTransport' => false,
            'transport' => [
                'dsn' => 'smtp://user:pass@smtp.example.com:465',
            ],
        ],
    ],
];

基本的な使用方法

mailerコンポーネントが設定されると、次のコードを使用してメールメッセージを送信できます。

Yii::$app->mailer->compose()
    ->setFrom('from@domain.com')
    ->setTo('to@domain.com')
    ->setSubject('Message subject')
    ->setTextBody('Plain text content')
    ->setHtmlBody('<b>HTML content</b>')
    ->send();

上記の例では、compose()メソッドがメールメッセージのインスタンスを作成し、それが設定されて送信されます。必要に応じて、このプロセスにさらに複雑なロジックを追加できます。

$message = Yii::$app->mailer->compose();
if (Yii::$app->user->isGuest) {
    $message->setFrom('from@domain.com');
} else {
    $message->setFrom(Yii::$app->user->identity->email);
}
$message->setTo(Yii::$app->params['adminEmail'])
    ->setSubject('Message subject')
    ->setTextBody('Plain text content')
    ->send();

注記:mailerエクステンションには、MailerMessageの2つの主要なクラスがあります。Mailerは常にMessageのクラス名と仕様を知っています。Messageオブジェクトを直接インスタンス化しようとしないでください。常にcompose()メソッドを使用してください。

複数のメッセージを一度に送信することもできます。

$messages = [];
foreach ($users as $user) {
    $messages[] = Yii::$app->mailer->compose()
        // ...
        ->setTo($user->email);
}
Yii::$app->mailer->sendMultiple($messages);

単一のネットワークメッセージなどを使用する特定のメールエクステンションはこのアプローチから恩恵を受ける場合があります。

メールコンテンツの作成

Yii は、特別なビューファイルを使用して実際のメールメッセージコンテンツを作成できます。デフォルトでは、これらのファイルは@app/mailパスに配置する必要があります。

メールビューファイルのコンテンツ例

<?php
use yii\helpers\Html;
use yii\helpers\Url;

/* @var $this \yii\web\View view component instance */
/* @var $message \yii\mail\BaseMessage instance of newly created mail message */

?>
<h2>This message allows you to visit our site home page by one click</h2>
<?= Html::a('Go to home page', Url::home('http')) ?>

ビューファイルを使用してメッセージコンテンツを作成するには、ビュー名をcompose()メソッドに渡すだけです。

Yii::$app->mailer->compose('home-link') // a view rendering result becomes the message body here
    ->setFrom('from@domain.com')
    ->setTo('to@domain.com')
    ->setSubject('Message subject')
    ->send();

ビューファイル内で使用できる追加のビューパラメーターをcompose()メソッドに渡すことができます。

Yii::$app->mailer->compose('greetings', [
    'user' => Yii::$app->user->identity,
    'advertisement' => $adContent,
]);

HTMLとプレーンテキストのメッセージコンテンツに異なるビューファイルを設定できます。

Yii::$app->mailer->compose([
    'html' => 'contact-html',
    'text' => 'contact-text',
]);

ビュー名をスカラー文字列で指定した場合、そのレンダリング結果がHTML本文として使用され、プレーンテキスト本文はHTML本文からすべてのHTMLエンティティを削除して作成されます。

ビューのレンダリング結果は、レイアウトでラップできます。レイアウトは、yii\mail\BaseMailer::$htmlLayoutyii\mail\BaseMailer::$textLayoutを使用して設定できます。通常のウェブアプリケーションのレイアウトと同様に機能します。レイアウトは、メールのCSSスタイルやその他の共有コンテンツを設定するために使用できます。

<?php
use yii\helpers\Html;

/* @var $this \yii\web\View view component instance */
/* @var $message \yii\mail\MessageInterface the message being composed */
/* @var $content string main view render result */
?>
<?php $this->beginPage() ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=<?= Yii::$app->charset ?>" />
    <style type="text/css">
        .heading {...}
        .list {...}
        .footer {...}
    </style>
    <?php $this->head() ?>
</head>
<body>
    <?php $this->beginBody() ?>
    <?= $content ?>
    <div class="footer">With kind regards, <?= Yii::$app->name ?> team</div>
    <?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>

ファイル添付

attach()メソッドとattachContent()メソッドを使用して、メッセージに添付ファイルを追加できます。

$message = Yii::$app->mailer->compose();

// attach file from local file system
$message->attach('/path/to/source/file.pdf');

// create attachment on-the-fly
$message->attachContent('Attachment content', ['fileName' => 'attach.txt', 'contentType' => 'text/plain']);

画像の埋め込み

embed()メソッドを使用して、メッセージコンテンツに画像を埋め込むことができます。このメソッドは添付ファイルIDを返し、それをimgタグで使用します。ビューファイルを使用してメッセージコンテンツを作成する場合、このメソッドは使いやすくなっています。

Yii::$app->mailer->compose('embed-email', ['imageFileName' => '/path/to/image.jpg'])
    // ...
    ->send();

ビューファイル内では、次のコードを使用できます。

<img src="<?= $message->embed($imageFileName); ?>">

テストとデバッグ

開発者は、アプリケーションによって実際に送信されたメール、そのコンテンツなどを確認する必要があることがよくあります。Yiiでは、yii\mail\BaseMailer::useFileTransportによってそのような機能が提供されています。有効にすると、このオプションは、通常の送信の代わりにメールメッセージデータをローカルファイルに保存するように強制します。これらのファイルは、デフォルトでは@runtime/mailであるyii\mail\BaseMailer::fileTransportPathに保存されます。

注記: メッセージをファイルに保存するか、実際の受信者に送信するかのどちらかを選択できますが、同時に両方を行うことはできません。

メールメッセージファイルは通常のテキストファイルエディタで開くことができるため、実際のメッセージヘッダー、コンテンツなどを閲覧できます。このメカニズムは、アプリケーションのデバッグや単体テストの実行時に役立ちます。

注記: メールメッセージファイルのコンテンツは\yii\mail\MessageInterface::toString()を使用して構成されるため、アプリケーションで使用している実際のメール拡張機能によって異なります。

独自のメールソリューションの作成

独自のメールソリューションを作成するには、MailerMessageの2つのクラスを作成する必要があります。yii\mail\BaseMaileryii\mail\BaseMessageをソリューションの基本クラスとして使用できます。これらのクラスには、このガイドで説明されている基本的なロジックが既に含まれています。ただし、それらの使用は必須ではなく、yii\mail\MailerInterfaceyii\mail\MessageInterfaceインターフェースを実装するだけで十分です。その後、すべての抽象メソッドを実装して、ソリューションを構築する必要があります。

タイプミスを見つけたり、このページの改善が必要だと思われた場合は、
Githubで編集してください。 !