サクラサーバでPHPを使ってメール受信。PHPソースコード編
受け取ったメールの
・送信元のメールアドレス
・件名
・本文
を取得するプログラム。
また、取得した各内容を本文に記載し、転送してみる。
mail.php
#!/usr/local/bin/php
<?php
require_once("/home/アカウント名/pear/PEAR/Mail/mimeDecode.php");
//メールソースを標準入力から読み込み
$source = file_get_contents("php://stdin");
if(!$source) {
exit(); // 読み込み失敗
}
//メール解析
$params['include_bodies'] = true;
$params['decode_bodies'] = true;
$params['decode_headers'] = true;
$decoder = new Mail_mimeDecode($source);
$structure = $decoder->decode($params);
//送信者のメールアドレスを抽出
$mail = $structure->headers['from'];
$mail = addslashes($mail);
$mail = str_replace('"','',$mail);
//署名付きの場合の処理を追加
preg_match("/<.*>/",$mail,$str);
if($str[0]!=""){
$str=substr($str[0],1,strlen($str[0])-2);
$mail = $str;
}
// 件名を取得
$diary_subject = $structure->headers['subject'];
//本文取得(添付ファイルがあった場合にも対応)
switch(strtolower($structure->ctype_primary)){
case "text": // シングルパート(テキストのみ)
$diary_body = $structure->body;
break;
case "multipart": // マルチパート(画像付き)
foreach($structure->parts as $part){
switch(strtolower($part->ctype_primary)){
case "text": // テキスト
$diary_body = $part->body;
break;
}
}
}
//エラーで帰って来たメールの対処
//件名にエラーの文字列があると転送
if(mb_ereg('Returned mail: see transcript for details',$diary_subject)){
//本文からメールアドレスのみを抜き出す
$address = explode("<" , $diary_body);
$address = explode(">" , $address[1]);
//メール転送
$to = 'taihi@sakura.ne.jp'
;
$title = "送信先エラー";
$body = "送信先アドレス:" . $address[0];
$from = "From: info@isakura.ne.jp
";
}else{
//エラーがない場合のメール返信先作成
$to = $mail;
$title = "テスト返信";
$body = "送信元アドレス:" . $mail . "\n件名:" . $diary_subject . "\n本文:\n" . $diary_body;
$from = "From: info@sakura.ne.jp
";
}
//メール送信
mb_internal_encoding("SJIS");
mb_language("japanese");
mb_send_mail($to, $title, $body, $from);
?>
サクラメール送信でエラーが返ってきた時、添付ファイルが付いているのと、送信したアドレスが本文についているので上記のような書き方になった感じ…。
・・・本文を取得する際、添付ファイルがある時と無い時で、取得方法が異なるってことに気付くまで苦労した。