こんにちは、T田です。
今回は、PHPでお手軽に外部サーバからメールを送信する方法をお伝えします。
目次
1.はじめに
PHPでメールを送信するとなると、mail()
関数やmb_send_mail()
関数があります。
しかし、これらの関数を使用するにはsendmailモジュールをインストールしたり、php.iniの設定をしたりと前準備が大変です。
そこで、PEAR::Mailの出番です。
これを使用すれば、ライブラリをインストールするだけで外部サーバからメールを送信できるようになります。
2.PEAR::Mailのインストール
まずは、PEAR::Mail
がインストールされているかを以下のコマンドで確認します。
sudo pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Mail 1.3.0 stable
「Package」の列に「Mail」が表示されていればインストールされています。
表示されていない場合は、以下のコマンドでインストールします。
sudo pear install -a Mail
-aオプションを付けて、依存するライブラリもインストールしておきます。
3.外部サーバからメール送信
大まかな処理の流れは以下のようになります。
イ.SMTPサーバ接続情報の準備
ロ.メールの送信先, 送信元, 件名, 本文の準備
ハ.PEAR::Mail
オブジェクトの生成
ニ.メール送信
今回は例として、Gmailのサーバを使用して送信します。
まず、ソースコード全体を見てみましょう。
※文字セット周りやユーザ名などは環境に合わせて適宜変更してください。
<?php
require_once "Mail.php";
// メールの文字セット
define( "MAIL_CHARSET", "ISO-2022-JP" );
// smtpサーバ接続情報
$param = array(
"host" => "smtp.gmail.com"
, "port" => 587
, "auth" => true
, "username" => "ユーザ名"
, "password" => "パスワード"
, "timeout" => 20
);
// 送信先情報
$to = array( "メールアドレス1" );
$cc = array( "メールアドレス2", "メールアドレス3" );
$bcc = array( "メールアドレス4" );
// 送信元&件名&本文を用意し、エンコード
$from = "de2p株式会社";
$from = mb_encode_mimeheader( $from, MAIL_CHARSET );
$subject = "メール送信test";
$subject = mb_encode_mimeheader( $subject, MAIL_CHARSET );
$body = "本文1行目。\n本文2行目!!\n本文3行目!";
$body = mb_convert_encoding( $body, MAIL_CHARSET, "UTF-8" );
// メールヘッダ
$header = array(
"From" => $from
, "To" => implode( ",", $to )
, "Cc" => implode( ",", $cc )
, "Bcc" => implode( ",", $bcc )
, "Subject" => $subject
, "Content-Type" => "text/plain; charset=" . MAIL_CHARSET
);
// PEAR::Mailオブジェクト取得
$obj =& Mail::factory( "smtp", $param );
// メール送信
$recipients = array_merge( $to, $cc, $bcc );
$ret = $obj->send( $recipients, $header, $body );
if ( PEAR::isError( $ret ) ) {
echo "Code[" . $ret->getCode() . "], Msg[" . $ret->getMessage() . "]\n";
} else {
echo "メールを送信しました。\n";
}
?>
では順番に説明していきます。
イ.SMTPサーバ接続情報の準備
これは、9~16行目で生成している連想配列で指定しています。
この連想配列は、「ハ.PEAR::Mailオブジェクトの生成」時のパラメタとして使用します。
// smtpサーバ接続情報
$param = array(
"host" => "smtp.gmail.com"
, "port" => 587
, "auth" => true
, "username" => "ユーザ名"
, "password" => "パスワード"
, "timeout" => 20
);
“auth” は、SMTP-AUTHの認証を行うためにtrue
を指定します(デフォルトはfalse
)。
“timeout” は、SMTPサーバへの接続タイムアウト時間を秒単位で指定します(デフォルトはNULL
= タイムアウトなし)。
ロ.メールの送信先, 送信元, 件名, 本文の準備
送信先アドレス
// 送信先情報
$to = array( "メールアドレス1" );
$cc = array( "メールアドレス2", "メールアドレス3" );
$bcc = array( "メールアドレス4" );
To, Cc, Bccに分けて配列で準備します。
送信元, 件名, 本文
// 送信元&件名&本文を用意し、エンコード
$from = "de2p株式会社";
$from = mb_encode_mimeheader( $from, MAIL_CHARSET );
$subject = "メール送信test";
$subject = mb_encode_mimeheader( $subject, MAIL_CHARSET );
$body = "本文1行目。\n本文2行目!!\n本文3行目!";
$body = mb_convert_encoding( $body, MAIL_CHARSET, "UTF-8" );
日本語が含まれているので、それぞれエンコード処理を行います。
送信元情報と件名はメールヘッダに含ませるのでmb_encode_mimeheader()
関数を、本文はmb_convert_encoding()
関数を使用します。
メールヘッダ
// メールヘッダ
$header = array(
"From" => $from
, "To" => implode( ",", $to )
, "Cc" => implode( ",", $cc )
, "Bcc" => implode( ",", $bcc )
, "Subject" => $subject
, "Content-Type" => "text/plain; charset=" . MAIL_CHARSET
);
準備したものを連想配列でメールヘッダとしてまとめます。
“To”, “Cc”, “Bcc” は複数ある場合はカンマ区切りで指定する必要があるので、implode()
関数で配列の要素を連結します。
また、メールの形式と文字セットを明示するために “Content-Type” も指定しました。
ハ.PEAR::Mailオブジェクトの生成
これは42行目の1行だけで完了です。
// PEAR::Mailオブジェクト取得
$obj =& Mail::factory( "smtp", $param );
Mail::factory()
メソッドでオブジェクトを取得します。
第1パラメタは、外部SMTPサーバを使用するので"smtp"
を指定します。
第2パラメタは、「イ.SMTPサーバ接続情報の準備」で生成した連想配列を指定します。
ニ.メール送信
ここまで準備できたら、あとは送信するだけです。
// メール送信
$recipients = array_merge( $to, $cc, $bcc );
$ret = $obj->send( $recipients, $header, $body );
if ( PEAR::isError( $ret ) ) {
echo "Code[" . $ret->getCode() . "], Msg[" . $ret->getMessage() . "]\n";
} else {
echo "メールを送信しました。\n";
}
まず、送信先のアドレス(To, Cc, Bcc)をarray_merge()
関数で変数$recipients
にマージします。
次に、Mail::factory()
メソッドで取得したオブジェクトを使用し、Mail::send()
メソッドに送信先, メールヘッダ, 本文を指定してメールを送信します。
Mail::send()
メソッドが失敗した場合はPEAR_Error
オブジェクトを返すので、戻り値をPEAR::isError()
メソッドでチェックしています。
4.おわりに
今回は、PHPでお手軽に外部サーバからメールを送信する方法についてお伝えしましたがいかがでしたでしょうか。
PEAR::Mail
ライブラリを使用することにより、簡単に外部サーバからメールを送信できることが分かりました。
ではまた次のブログでお会いしましょう!
<スポンサーリンク>