[macOS General] MailCatcher: ダミーSMTPサーバをつかってメール送信

ローカルのMac環境からメール送信をするための方法を調べました。 Zend
Server 環境から Zend_Mail (PHP)を使ってメール送信するまで。

[markdown]

まず、Gmailやプロバイダなどの外部SMTPサーバをつかう設定がありました。

> – [自分のための日記: Mac OS X で mail コマンドでメールを送る](http://yasuwagon.blogspot.jp/2011/05/mac-os-x-mail.html)
> – [Mac OS X Snow LeopardでPHPのmail()関数を使うには – Awaresoft](http://www.awaresoft.jp/mac/item/75-mac-os-x-snow-leopard%E3%81%A7php%E3%81%AEmail%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AB%E3%81%AF.html)
> – [The Strange Storage: PHPで日本語メールを送信するまでの足跡](http://strange-storage-5084.blogspot.jp/2012/01/php.html)

運用を考えると、設置予定のサーバのSMTPをつかうのが良いのでしょうか?

## MailCatcher のインストール

以前にMOONGIFTさんで「メール送信を誤ると大変な失敗。慎重に開発すべし。」のような内容とともにダミーSMTPサーバの紹介がされていたことを思い出したので、試してみることにしました。
ダミーSMTPサーバ MailCatcher をインストールします。

“`
$ gem install mailcatcher
“`

mailcatcher でサーバが起動します。
停止するには http://localhost:1080/ でアクセスできるインターフェースのquitボタンを押します。

“`
$ mailcatcher
Starting MailCatcher
==> smtp://127.0.0.1:1025
==> http://127.0.0.1:1080
*** MailCatcher runs as a daemon by default. Go to the web interface to quit.
“`

サーバを起動すると以下の機能が使えるようになります。

– http://localhost:1080/ から送信したメール内容をメールアプリのようなUIで確認できる。
– smtp://localhost:1025/ をSMTPサーバとして利用できる。

## Zend_Mail からSMTPを使ってみる

Rails と PHP の設定例が公式サイトにありました。
Zend Server で試してみます。
php.ini の sendmail_path を設定します。

“`
$ sudo vim /usr/local/zend/etc/php.ini
“`

“`php:/usr/local/zend/etc/php.ini
// sendmail_path を下記のように設定
sendmail_path = /usr/bin/env catchmail
“`

Zend_Mailをつかった下記のようなActionを用意して試してみました。
port 1025 を指定します。

“`php
public function sendmailAction() {
$mail = new Zend_Mail();
$mail->addTo(‘foo@gmail.com’, ‘Some Recipient’);
$mail->setFrom(‘bar@gmail.com’, ‘Some Sender’);
$mail->setSubject(‘TestSubject’);
$mail->setBodyText(‘This is the text of the mail.’);
$config = array(‘port’ => 1025);
$smtp = new Zend_Mail_Transport_Smtp(‘127.0.0.1’, $config);
try {
$mail->send($smtp);
echo ‘送信しました’;
} catch (Zend_Exception $e) {
echo “エラー: ” . $e->getMessage();
}
}
“`

このような形でMailCatcherしていました。
From, To とも実在のアドレスですが、そこにはメールは届いていません。
(メールアドレスが壊れていても、送信されたように扱われました。)

[![MailCatcher 2013-05-22-15-36-07](https://www.d-wood.com/wpmt/wp-content/uploads/2013/05/MailCatcher-2013-05-22-15-36-07.png)](https://www.d-wood.com/wpmt/wp-content/uploads/2013/05/MailCatcher-2013-05-22-15-36-07.png)

MOONGIFTさんでは、画像表示と日本語件名の文字化けの不具合があったそうなので、後日確かめてみます。

## 画像、日本語表示まわりの確認

画像の表示と日本語件名の文字化けについて、可能な範囲で確かめてみました。
現在のバージョンで試した限りでは、画像の表示は可能で、適切にISO-2022-JPエンコーディングすれば文字化けもなさそうでした。
ただしメールまわりの仕様を含め理解し切れてないので、詳しい方がいたら教えて下さい。

[Zend公式](http://framework.zend.com/manual/1.12/ja/zend.mail.html)を見ながら、下記のようなスクリプトで試してみました。

“`php
public function sendmailAction() {
function mbCnv($string) {
return mb_convert_encoding($string, ‘ISO-2022-JP’, ‘UTF-8’);
}
$subject = ‘日本語のサブジェクト’;
$body = ‘日本語の本文。テスト。’;
$html = ‘

HTMLメールの本文

‘;
$mail = new Zend_Mail(‘ISO-2022-JP’);
$mail->setBodyText(
mbCnv($body),
null,
Zend_Mime::ENCODING_7BIT
);
$mail->setBodyHtml(
mbCnv($html),
null,
Zend_Mime::ENCODING_7BIT
);
$mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
$mail->addTo(‘foo@gmail.com’);
$mail->setFrom(‘bar@gmail.com’);
$mail->setSubject(mbCnv($subject));
$atImage = ‘http://hoge.com/images/logo.png’;
$at = new Zend_Mime_Part(file_get_contents($atImage));
$at->type = ‘image/png’;
$at->disposition = Zend_Mime::DISPOSITION_INLINE;
$at->encoding = Zend_Mime::ENCODING_BASE64;
$at->filename = mbCnv(‘test.png’);
$mail->addAttachment($at);
$config = array(‘port’ => 1025);
$smtp = new Zend_Mail_Transport_Smtp(‘127.0.0.1’, $config);
try {
$mail->send($smtp);
echo ‘送信しました’;
} catch (Zend_Exception $e) {
echo “エラー: ” . $e->getMessage();
}
}
“`

画像を適当なURLから取ってきて、HTMLメールも表示できました。
画像を添付してみましたが、Attachmentsとして添付されています。

[![MailCatcher 2013-05-22-22-54-56](https://www.d-wood.com/wpmt/wp-content/uploads/2013/05/MailCatcher-2013-05-22-22-54-56.png)](https://www.d-wood.com/wpmt/wp-content/uploads/2013/05/MailCatcher-2013-05-22-22-54-56.png)

subjectと本文を日本語で書いて見ましたが、表示はされているようです。

[![MailCatcher 2013-05-22-22-56-04](https://www.d-wood.com/wpmt/wp-content/uploads/2013/05/MailCatcher-2013-05-22-22-56-04.png)](https://www.d-wood.com/wpmt/wp-content/uploads/2013/05/MailCatcher-2013-05-22-22-56-04.png)

Sourceというタブでは、エンコーディングはディフォルトのままのようで切り替わりませんでした。

[![MailCatcher 2013-05-22-23-04-28](https://www.d-wood.com/wpmt/wp-content/uploads/2013/05/MailCatcher-2013-05-22-23-04-28.png)](https://www.d-wood.com/wpmt/wp-content/uploads/2013/05/MailCatcher-2013-05-22-23-04-28.png)

Downloadボタンで.emlファイルがダウンロードできます。
クイックルックで確認したところ、それっぽく表示されています。
(左下の?は、添付ファイルをあらわしているようです。)

[![MailCatcher 2013-05-22-23-11-16](https://www.d-wood.com/wpmt/wp-content/uploads/2013/05/MailCatcher-2013-05-22-23-11-16.png)](https://www.d-wood.com/wpmt/wp-content/uploads/2013/05/MailCatcher-2013-05-22-23-11-16.png)

Zend_Mail まわりですが、試しているうちに深い森へ足を踏み入れてしまいました。
このあたりはまた別の機会に。

[/markdown]