本日も乙

ただの自己満足な備忘録。

SwiftMailerを使ってメール送信する

皆さんは、PHPでメール送信する際に何を使っていますか?
mail(), mb_send_mail(), PEAR::Mailなど様々な関数やライブラリがありますが、最近のモダンなライブラリとして SwiftMailer があります。 SwiftMailerはPHP5.2以上で動作するメールライブラリで、PEARComposer などで簡単にインストールでき、Symfony2 にも組み込まれています。
今回は SwiftMailerをComposerでインストールして簡単なメール送信プログラムを作成してみます。

今回の目標

  • SwiftMailerをComposerでインストールする
  • SwiftMailerを使って簡単なメール送信をしてみる

サーバ環境

composerでインストール

Composerのインストール

composerを使うためには、composer自体をインストールする必要がありますが、ここではインストール方法を割愛します。参考URLにComposerについての記事を掲載しますのでそちらをご参照ください。
なお、本環境にてcomposerを以下のようにパスを通しています。

$ which composer
/usr/local/bin/composer

composerでSwiftMailerをインストールするために、composer.jsonを記述します。

// composer.json
{
    "require": {
        "swiftmailer/swiftmailer": "@stable"
    }
}

composer installを実行すればインストールは完了です。

$ composer install

以下のようなディレクトリ構成になります。
vendor以下にSwiftMailerのライブラリが入ります。

.
├── composer.json
├── composer.lock
└── vendor
    ├── autoload.php
    ├── composer
…

SwiftMailerでメール送信

では実際にSwiftMailerでメール送信してみます。

基本的なメール送信

以下のサンプルプログラムを作成しました。
コマンドライン(CUI)からの実行を考えていたので、送信先メールアドレスを引数($argv[1])にとっています *1
SwiftMailerライブラリを使うにはオートロード(vendor/autoload.php)をrequireしてあげます。
namespaceは無くても良いです。

<?php
// src/swiftmailer_sample_1.php

namespace BlogSample\SwiftMailerSample1;

require_once __DIR__ . '/../vendor/autoload.php';

// 宛先メールアドレスの取得
if (empty($argv[1])) {
    echo 'Please input mailaddress.' . PHP_EOL;
    exit;
}

$toMailAddress= $argv[1];

// SMTPトランスポートを使用
// SMTPサーバはlocalhost(Poftfix)を使用
// 他サーバにある場合は、そのホスト名orIPアドレスを指定する
$transport = \Swift_SmtpTransport::newInstance('localhost', 25);

// メーラークラスのインスタンスを作成
$mailer = \Swift_Mailer::newInstance($transport);

// メッセージ作成
$message = \Swift_Message::newInstance()
    ->setSubject('テストメール')
    ->setTo($toMailAddress)
    // 宛先を表示 array('foo@foo.com' => 'Mr.FooBar')と同じ
    ->setFrom(['foo@foo.com' => 'Mr.FooBar'])
    ->setBody('これはテストメールです。');

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

echo $result;

exit;

プログラムを実行してみます。

$ php ./src/swiftmailer_sample_1.php bar@bar.com
1

正常に終了すると以下のようなメールが送信されます。

From:  Mr.FooBar <foo@foo.com>
To:  bar@bar.com
Subject:  テストメール
Body:
これはテストメールです。

画像ファイルを添付してメール送信

今度はメールに画像を添付します。以下のような画像をimgディレクトリ以下に配置しました。 サンプル画像 *2

.
├── composer.json
├── composer.lock
└── src
    └── img
    │   └── twitter_icon_sample.php
    └── swiftmailer_sample_1.php
└── vendor
    ├── autoload.php
    ├── composer
…

サンプルプログラムです。 先ほどのプログラムと異なるのは \Swift_Attachment::fromPathで画像ファイルを指定し、 \Swift_Message::newInstance()attach($attachment) で指定した画像をアタッチしている点です。

<?php
// src/swiftmailer_sample_2.php

namespace BlogSample\SwiftMailerSample2;

require_once __DIR__ . '/../vendor/autoload.php';

// 宛先メールアドレスの取得
if (empty($argv[1])) {
    echo 'Please input mailaddress.' . PHP_EOL;
    exit;
}

$toMailAddress= $argv[1];

// SMTPトランスポートを使用
$transport = \Swift_SmtpTransport::newInstance('localhost', 25);

// メーラークラスのインスタンスを作成
$mailer = \Swift_Mailer::newInstance($transport);

// 添付ファイル
// hogehoge.jpegにリネームした画像ファイルを添付する
$attachment = \Swift_Attachment::fromPath(__DIR__ . '/img/twitter_icon_sample.jpg')
    // ファイル名をリネームする。指定しなければ画像ファイル名になる
    ->setFilename('hogehoge.jpeg')
    // ContentTypeを指定する。今回はJPEGファイルなので image/jpegとする
    ->setContentType('image/jpeg');

// メッセージ作成
$message = \Swift_Message::newInstance()
    // 画像ファイル添付
    ->attach($attachment)
    ->setSubject('テストメール')
    ->setTo($toMailAddress)
    // 宛先を表示 array('foo@foo.com' => 'Mr.FooBar')と同じ
    ->setFrom(['foo@foo.com' => 'Mr.FooBar'])
    ->setBody('これはテストメールです。');

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

echo $result;

exit;

プログラムを実行すると、メールの内容は1つ目のプログラムと同じですが、画像ファイルが添付されます。

$ php ./src/swiftmailer_sample_2.php bar@bar.com
1

HTMLメールを送信

\Swift_Message::newInstance()->setBody() にはプレーンテキストだけではなく、HTMLタグを埋め込むことでHTMLメールを送信することができます。
先ほどの画像を<img> タグで埋め込んだHTMLメールを送信してみます。

<?php
// src/swiftmailer_sample_3.php

namespace BlogSample\SwiftMailerSample2;

require_once __DIR__ . '/../vendor/autoload.php';

// 宛先メールアドレスの取得
if (empty($argv[1])) {
    echo 'Please input mailaddress.' . PHP_EOL;
    exit;
}

$toMailAddress= $argv[1];

// SMTPトランスポートを使用
$transport = \Swift_SmtpTransport::newInstance('localhost', 25);

// メーラークラスのインスタンスを作成
$mailer = \Swift_Mailer::newInstance($transport);

// メッセージ作成
$message = \Swift_Message::newInstance()
    ->setSubject('テストメール')
    ->setTo($toMailAddress)
    // 宛先を表示 array('foo@foo.com' => 'Mr.FooBar')と同じ
    ->setFrom(['foo@foo.com' => 'Mr.FooBar']);

$embedImage = $message->embed(\Swift_Image::fromPath(__DIR__ . '/img/twitter_icon_sample.jpg'));

// ボディ部分を作成
// HTMLメールを作成
$message->setBody(
    '<html>' .
    ' <head></head>' .
    ' <body>' .
    '  画像はここにあります-> <img src="' . $embedImage . '" alt="Image" /><br />' .
    '  テストメールです。' .
    ' </body>' .
    '</html>',
    'text/html'
);

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

echo $result;

exit;

プログラムを実行すると、以下のようなメールが送信されます。

$ php ./src/swiftmailer_sample_3.php bar@bar.com
1
From:  Mr.FooBar <foo@foo.com>
To:  bar@bar.com
Subject:  テストメール
Body:
画像はここにあります-> [画像ファイル]
テストメールです。

最後に

モダンなメールライブラリであるSwiftMailerを使ってメール送信してみました。 ドキュメントを見ると他にも便利な使い方があるのでぜひ使ってみてください。 また、今回のサンプルプログラムをGitHubにありますのでgit cloneしてcomposer installして試してみてください。 https://github.com/ohsawa0515/blog_sample_source_code

参考URL

*1:メールアドレスのバリデーションは今回除外しています

*2:僕のtwitterアイコンです