ドキュメント
リリースカレンダー
リンク
SourceForge.jp SourceForge.JPへ
php.net PHP公式サイトへ

メール

 ここでは、メール送信/受信ライブラリの使用方法を説明します。

1. メール送信概要

 SyLメール送信ライブラリは、PHP標準のmail関数をラップしたタイプと ソケットによりメールサーバーに直接接続して送信するタイプの2パターンあります。
(詳細には sendmail コマンドで直接送信する方法もありますが、mail関数方式と大差ありません。)

これは送信方法を提供するクラスで、送信データとなるメッセージはメールメッセージクラスで管理され、 メッセージを送信方法に送信する流れになります。

・添付ファイルを含めることも可能です。(Base64エンコード)
・現状はテキストメールのみですが、将来的にHTMLメールにも対応予定です。

2. メール送信例

メールを送信する簡単なコードを示します。

(1) PHP標準のmail関数をラップしたタイプ

// ライブラリをインクルード
SyL_Loader::lib('Mail');
// SyLフレームワークを使用しない場合は直接インクルード
// include_once SYL_INCLUDE_DIR . '/lib/SyL_Mail.php';

// メール送信オブジェクトを作成
$mail =& SyL_Mail::factorySend();
// メールメッセージオブジェクトを作成
$message =& $mail->createMessage();
$message->setSubject('サンプルメールの件名');
$message->setFrom('k.watanabe@syl.jp', 'サンプルメールの差出人');
$message->addTo('k.watanabe@syl.jp');
$message->setBody('サンプルメールの本文');
// 送信実行
$mail->send($message);

 メールクラスをインクルードしてインスタンスを取得した後、 メールの内容を格納するメールメッセージオブジェクトを作成し、 宛先/件名/本文などをセットして、sendメソッドにより送信する流れです。

 宛先(addTo)、CC(addCc)、BCC(addBcc)は、複数回実行することにより、複数人に送信することができます。

 注意点としては、PHPのメール送信関数(mail)でメールが送信できる環境かどうか、 事前に確認してください(コマンドライン上でmail(sendmail)コマンドから確認してもOK)。 送信できない場合は、ネットワークやメールサーバーの設定が 関係している場合が多いので、最初に正常にメールが送れるか確認してください。

 また、sendmail コマンド方式を使用する場合は、

// メール送信オブジェクトを作成
$mail =& SyL_Mail::factorySend('sendmail');
// Sendmailパスをセット(デフォルト: /usr/lib/sendmail)
$mail->setSendmailPath('/path/to/sendmail');
...

のようにして、インスタンスを作成し、Sendmailパスをセットします。 メールメッセージオブジェクトを取得した後の流れは、mail関数を使用する場合と同様です。

(2) メールサーバーに直接接続して送信するタイプ

下記例では、メールサーバー「example.com」の「25」番ポートに接続して送信を行います。

// ライブラリをインクルード
SyL_Loader::lib('Mail');
// SyLフレームワークを使用しない場合は直接インクルード
// include_once SYL_INCLUDE_DIR . '/lib/SyL_Mail.php';

// メール送信オブジェクトを作成
$mail =& SyL_Mail::factorySend('smtp');
// メールサーバーホスト名セット(デフォルト: localhost)
$mail->setHost('example.com');
// メールサーバーポート番号セット(デフォルト: 25)
$mail->setPort('25');
// メールメッセージオブジェクトを作成
$message =& $mail->createMessage();
$message->setSubject('サンプルメールの件名');
$message->setFrom('k.watanabe@syl.jp', 'サンプルメールの差出人');
$message->addTo('k.watanabe@syl.jp');
$message->setBody('サンプルメールの本文');
// 送信実行
$mail->send($message);

 基本的な流れは、「PHP標準のmail関数をラップしたタイプ」と同じですが、 メールクラスのインスタンスを取得するパラメータとホスト/ポート番号をセットするところが異なります。

 メールサーバーに直接接続して送信するタイプでは、SMTP AUTH に対応しています。 SMTP AUTH を使用する場合、下記のようにアカウント名とパスワードをセットしてから送信します。

...
$mail->setUser('{アカウント名}', '{パスワード}');
...

 こちらの注意点も同様で、プログラムを実行するサーバーから指定したメールサーバーにネットワークが繋がり、 かつメール送信が許可されていることを確認してください。 (telnetコマンドでメールサーバーのポートに接続して送信してみるのが確実です)

3. 添付ファイル

 メールにファイルを添付する場合は、サーバー上にあるファイルを添付します。 send メソッドを実行する前に、事前にメールメッセージオブジェクトの addFile メソッドで添付ファイルに取り込みます。

$message->addFile('/path/to/attachfile');

複数回実行することにより、複数ファイルを添付することができます。
また、2つめの引数には、コンテンツタイプを指定可能です。(デフォルト: application/octet-stream)

添付ファイルを送信する場合のコンテンツタイプ(Content-Type)は、「multipart/mixed」となります。

4. 連続送信

 「PHP標準のmail関数をラップしたタイプ」での送信処理は、1回の送信でメールサーバーに接続と切断を行いますが、 「メールサーバーに直接接続して送信するタイプ」は、メールサーバーに接続したまま続けて送信することができるので、 連続してメールを送信する際は、前者より処理速度と効率の面で優れています。

// ライブラリをインクルード
SyL_Loader::lib('Mail');
// SyLフレームワークを使用しない場合は直接インクルード
// include_once SYL_INCLUDE_DIR . '/lib/SyL_Mail.php';

// 連続送信メールアドレス
$senders = array();
$senders[] = 'k.watanabe@syl.jp';
$senders[] = 'k.watanabe1@syl.jp';
...

// メール送信オブジェクトを作成
$mail =& SyL_Mail::factorySend('smtp');
// メールサーバーホスト名セット(デフォルト: localhost)
$mail->setHost('example.com');
// メールサーバーポート番号セット(デフォルト: 25)
$mail->setPort('25');
// メールサーバーに接続
$mail->connect();

foreach ($senders as $sender) {
    // メールメッセージオブジェクトを作成
    $message =& $mail->createMessage();
    $message->setSubject('サンプルメールの件名');
    $message->setFrom('k.watanabe@syl.jp', 'サンプルメールの差出人');
    $message->addTo($sender);
    $message->setBody('サンプルメールの本文');
    // 送信実行
    $mail->send($message);
}
// メールサーバーから切断
$mail->quit();

5. メール受信概要

 SyLメール受信ライブラリは、ソケットによりメールサーバーに直接接続して受信を行います。 受信したメッセージは、メールメッセージクラスに格納され、 そこから受信データ(宛先/件名/本文など)を取得する流れになります。

・受信には、アカウント名とパスワード(認証情報)をセットする必要があります。
・添付ファイルの取得もできます。(Base64エンコード)
・HTMLメール内容の取得可能。

6. メール受信例

メールを受信する簡単なコードを示します。

// ライブラリをインクルード
SyL_Loader::lib('Mail');
// SyLフレームワークを使用しない場合は直接インクルード
// include_once SYL_INCLUDE_DIR . '/lib/SyL_Mail.php';

// メール受信オブジェクトを作成
$mail =& SyL_Mail::factoryReceive();
// メールサーバーホストをセット(デフォルト: localhost)
$mail->setHost('example.com');
// ポート番号をセット(デフォルト: 110)
$mail->setPort('110');
// 認証情報をセット
$mail->setUser('account_name', 'password');
// 接続開始
$mail->connect();

echo "メールボックス総数: " . $mail->getTotalNums() . "\n";
echo "メールボックス総バイト数: " . $mail->getTotalBytes() . "\n";

// メールボックスから全メッセージタイトルを表示
foreach ($mail->getList() as $num => $bytes) {
    $message =& $mail->receive($num);
    echo $num . " - " . $message->getSubject() . "\n";
}

// 接続終了
$mail->quit();

 メールクラスをインクルードしてインスタンスを取得した後、メールサーバーの情報をセットし、接続します。 接続後 getList メソッドにより、メールボックス内にあるメールのメッセージ番号を取得してから、 メッセージ番号に対して、receive メソッドにより受信します。

受信したメッセージは、メールメッセージクラスとして返され、そのプロパティから受信データ(宛先/件名/本文など)を取得します。

7. メールメッセージクラス

 メールメッセージクラスは、メールの送受信時のメールの内容を保持するクラスです。 送信時はデータをセットし、受信時はデータを取得します。

下記はメールメッセージクラスのインターフェイスです。

データ名 メソッド 引数/戻り値
送信元 setFrom string
string
メールアドレス
メールアドレス別名(オプション)
getFrom array 例) array('test@example.com', 'test')
宛先 addTo string
string
メールアドレス
メールアドレス別名(オプション)
getTo array 例) array([0] => array('test@example.com', 'test'))
CC addCc string
string
メールアドレス
メールアドレス別名(オプション)
getCc array 例) array([0] => array('test@example.com', 'test'))
BCC addBcc string
string
メールアドレス
メールアドレス別名(オプション)
getBcc array 例) array([0] => array('test@example.com', 'test'))
件名 setSubject string 件名
getSubject string 件名
本文 setBody string 本文
getBody array 例) array(
[body] => 'テストメール',
[type] => 'text/plain; charset="ISO-2022-JP"',
[transfer_encoding] => '7bit',
[name] => null,
[file] => null
);
添付ファイル addFile string
string
添付ファイルのパス
コンテンツタイプ(オプション)
getBody array 例) array(
[body] => null,
[type] => 'image/jpeg',
[transfer_encoding] => 'base64',
[name] => 'example.jpg',
[file] => {添付内容}
);
※添付内容は、バイナリの場合もあります。
その他ヘッダ addHeader string
string
ヘッダのキー
ヘッダの値
getHeader string
string
ヘッダのキー(引数)
ヘッダの値

8. 文字コード/言語について

 本メールライブラリは、日本語環境での使用を前提に作成されていますので、 デフォルトでメールメッセージの文字コードは「ISO-2022-JP」、パラメータ文字コードはカレントの mbstring.internal_encoding です。

 ただし、これらは変更可能です。変更する場合はメールオブジェクトをインスタンス化した直後に、文字コードをセットします。

...
// セット/取得するパラメータ文字コードを変更
$mail->setInternalEncode('EUC-JP');
// メールメッセージ文字コードを変更
$mail->setMailEncode('UTF-8');
...

また、言語設定のデフォルトは、カレントの mbstring.language です。 ただし、設定されていない場合は、「ja」となります。

...
// 言語設定を変更
$mail->setLanguage('en');
...