hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

PEAR::MailでSMTPサーバーからのメール送信(サンプルコード編)

前回のPEAR::MailでSMTPサーバーからのメール送信(PEARインストール編) の続きです。
今回は実際にPEAR::Mailを使って、SMTPサーバー経由でメールを送信するPHPコードを作成してみます。

PEAR::Mailのオブジェクトを作成する

PEAR::Mailでメール送信を行う場合、PEAR::Mailのオブジェクトを作成する必要があります。
PEAR::Mailのオブジェクト作成には「factory」メソッドを使用します。

バックエンド(メール送信手段)の指定

「factory」メソッドを使用する場合、バックエンドと呼ばれるメール送信手段を指定する必要があります。
バックエンドとして指定出来る内容は、以下の3つがあります。

バックエンド名 内容
mail PHP組込のmail()関数を使用して送信
sendmail sendmailで送信
smtp SMTPサーバにから送信

今回は、SMTPサーバー経由でのメール送信を行うので、一番下の「smtp」を指定します。
バックエンドは「factory」メソッドの第1パラメタとして指定します。

SMTPサーバー情報の指定

バックエンドとして「smtp」を指定する場合、SMTPサーバー情報を指定する必要があります。
SMTPサーバー情報は、パラメータ名をキーとした連想配列に値をセットし、「factory」メソッドの第2パラメタとして指定します。

パラメータ名 設定値 デフォルト値
host SMTPサーバ名 localhost smtp-server
port ポート番号 25 532
auth SMTP認証の使用有無 false true
username SMTP認証のユーザ名 無し username
username SMTP認証のパスワード 無し password
timeout SMTP接続のタイムアウト NULL(タイムアウト無し) 30

上記を踏まえた上で、PEAR::Mailのオブジェクトを作成するコードは以下のような形になります。

<?php
// SMTPサーバーの情報を連想配列にセット
$params = array(
  "host" => "smtp-server",   // SMTPサーバー名
  "port" => 25,              // ポート番号
  "auth" => true,            // SMTP認証を使用する
  "username" => "username",  // SMTPのユーザー名
  "password" => "password"   // SMTPのパスワード
);

// PEAR::Mailのオブジェクトを作成
// ※バックエンドとしてSMTPを指定
$mailObject = Mail::factory("smtp", $params);

PEAR::Mailからメールを送信する

PEAR::Mailからのメール送信には「send」メソッドを使用します。
「send」メソッドには、

  • 送信先のメールアドレス
  • メールヘッダの連想配列
  • メール本文

の3つのパラメタを指定します。

送信先メールアドレスの指定

「send」メソッドの第1パラメタとして、メール送信先のアドレスを指定します。
送信先のメールアドレスは、カンマ(,)区切りで複数指定することも可能です。

<?php
// 送信先のメールアドレス
$recipients = "send-to-address01@exsample.com,send-to-address02@exsample.com";
メールヘッダの指定

「send」メソッドの第2パラメタとして、メールヘッダ情報がセットされた連想配列を指定します。
ココでの注意点としては、ヘッダ情報として送信先アドレス(To)をセットしても、メールの送信先としては、第1パラメタで指定したアドレスになります。
なので、ヘッダ情報の送信先アドレス(To)にセットしたメールアドレスにはメールは送信されない形になります。

また、メール件名として日本語を使用する場合、「mb_encode_mimeheader」でエンコードする必要があります。

<?php
// メールヘッダ情報を連想配列としてセット
$headers = array(
  "To" => "send-to-address@exsample.com",         // →ここで指定したアドレスには送信されない
  "From" => "send-from-address@exsample.com",
  "Subject" => mb_encode_mimeheader("メール件名") // 日本語の件名を指定する場合、mb_encode_mimeheaderでエンコード
);
メール本文の指定

「send」メソッドの第3パラメタとして、メール本文を指定します。
メール本文は文字列で指定します。
メール件名と同様に、日本語を使用する場合はエンコードが必要となります。

<?php
// メール本文
$body = "日本語メールの本文。";

// 日本語なのでエンコード
$body = mb_convert_encoding($body, "ISO-2022-JP", "auto");

サンプルコード(全体)

以上を踏まえた、全体のサンプルコードは以下のような形になります。
※例外とかを無視した、単純なコードになっているので実際に使用する場合には色々と考慮が必要だと思います。

<?php
//PEAR::Mailのインクルード
require_once("Mail.php");

//日本語メールを送る際に必要
mb_language("Japanese");
mb_internal_encoding("UTF-8");

// SMTPサーバーの情報を連想配列にセット
$params = array(
  "host" => "smtp-server",   // SMTPサーバー名
  "port" => 25,              // ポート番号
  "auth" => true,            // SMTP認証を使用する
  "username" => "username",  // SMTPのユーザー名
  "password" => "password"   // SMTPのパスワード
);

// PEAR::Mailのオブジェクトを作成
// ※バックエンドとしてSMTPを指定
$mailObject = Mail::factory("smtp", $params);

// 送信先のメールアドレス
$recipients = "send-to-address01@exsample.com,send-to-address02@exsample.com";

// メールヘッダ情報を連想配列としてセット
$headers = array(
  "To" => "send-to-address@exsample.com",         // →ここで指定したアドレスには送信されない
  "From" => "send-from-address@exsample.com",
  "Subject" => mb_encode_mimeheader("メール件名") // 日本語の件名を指定する場合、mb_encode_mimeheaderでエンコード
);

// メール本文
$body = "日本語メールの本文。";

// 日本語なのでエンコード
$body = mb_convert_encoding($body, "ISO-2022-JP", "UTF-8");

// sendメソッドでメールを送信
$mailObject->send($recipients, $headers, $body);

補足 - GmailからSMTPでメールを送る場合

動作確認する際にGmailを使ってSMTPでメール送信してみました。
SMTPサーバーの設定情報は以下のようになります。
Gmailを使用す場合の設定について、詳しくはGmailヘルプを確認してください。

<?php
// GmailSMTPサーバーの情報を連想配列にセット
$params = array(
  "host" => "smtp.gmail.com",   // SMTPサーバー名
  "port" => 587,              // ポート番号
  "auth" => true,            // SMTP認証を使用する
  "username" => "Gmailのメールアドレス",  // SMTPのユーザー名
  "password" => "Gmailのパスワード"   // SMTPのパスワード
);

今回参考にしたページ

メール送信(PEAR Mail) - PEAR入門
http://www.phpbook.jp/pear/pear_mail/

Andante PEAR Mail、日本語メールの送信
http://andante0727.blog81.fc2.com/blog-entry-241.html

PEAR Mail を使ってみる - SystemGathering
http://www.sysgathe.com/2009/01/pear-mail.html

その他のメール クライアントの設定 - Gmail ヘルプ
http://mail.google.com/support/bin/answer.py?hl=jp&answer=13287