• 締切済み

空メールからの標準入力が受け取れません。

よろしくお願いいたします。 CentOS5.2 & PHP5(お名前.COMのVPSディフォルトです。) お名前.COMのVPSで空メールでのユーザー認識したいと思って います。説明いただいているサイトを参考に、以下のコードを動かして います。 空メールを送ってみると、 $sss=file_get_contents("php://stdin"); をコメントアウトしない場合は、 テストで作らせているテキストファイルもでき、返信メールが帰ります。 しかし、上記文を入れるとテストで作らせているテキストファイルも 返信もありません。 アドバイスいただければ助かります。 pearは Mail_Mime 1.8.0 stable Mail_mimeDecode 1.5.4 stable でインストールしてあります。 <?php //PEARのライブラリ読み込み require_once("/usr/share/pear/Mail/mimeDecode.php"); //メールソースを標準入力から読み込み $sss=file_get_contents("php://stdin"); $frm="AAAAAA"; if(!$source) { exit(); // 読み込み失敗 } //メール解析 $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $decoder = new Mail_mimeDecode($sss); $structure = $decoder->decode($params); $from = mb_convert_encoding(mb_decode_mimeheader($structure->headers['from']), mb_internal_encoding(), "auto"); $gdata="ddddddd".$sss.$frm; $ffp2="ggg.txt"; $fh=fopen($ffp2,"w"); fwrite($fh,$gdata); fclose($fh); $from="xxxxx@hhhhh.com"; //メール返信 $to = $from; $title = "空メールの返信(例)"; $body = "登録が完了しました。\n(実際は何も登録していません。)\n※このメールは配信専用です。\n返信されても対応は出来ませんので、ご了承下さい。"; $from = "From: support@XXXXXXXXX"; mb_internal_encoding("SJIS"); mb_language("japanese"); mb_send_mail($to, $title, $body, $from); ?>

  • PHP
  • 回答数8
  • ありがとう数9

みんなの回答

回答No.8

こんばんは。 >Object id #2 >が >$structure = $decoder->decode($params); >の答えですが、これで標準入力を受けているということで >よろしいでしょうか。 うーん・・・、一応idが割り振られているので、存在はしていると思います。 $structureをくっつけるより、$structure->headers['from']とかって付けてみた方がいいかと・・・。 まぁ大丈夫だと思いますが、どっちみちこのままじゃぁ、返信はできないので。

oozora-s
質問者

お礼

ご回答ありがとうございます。 長い間アドバイス本当にありがとうございます。 以下のコードで、無事に空メールを送信した自分に 返信が正常に届きました。 ご親切なアドバイスがなければ、ここまでたどり着く ことができませんでした。VPSの業者はサポート範囲外 ということで、的確な返答がなく taka451213様のアドバイスで、くじけずに進めました。 ここまできて感じますが、VPSの設定でPostfixでありながら sendmailのsmrshが有効になっているような気がしています。 本当にありがとうございました。 #!/usr/bin/php -q <?php //メールソースを標準入力から読み込み $source =fopen("php://stdin", "r"); $email = ""; while ($line = fgets($source)) { $line = trim($line); // メールヘッダ部が終了したらループ終了 if (!$line || $email){ break; } // 送信元メールアドレスの取得 if (eregi("^from:", $line)){ $email = getEmail($line); } } //メール返信 $to=$email; $title = "空メールの返信(テスト例)"; $body = "登録が完了しました。\n(実際は何も登録していません。)\n※このメールは配信専用です。\n返信されても対応は出来ませんので、ご了承下さい。\n"; $from = "From:info-xxx@url**.com"; mb_internal_encoding("SJIS"); mb_language("japanese"); mb_send_mail($to, $title, $body, $from); function getEmail($line) { if (eregi("(.*)\<(.*)\>", $line, $tmp)){ $fromx = $tmp[2]; } return strtolower(trim($fromx)); } ?>

回答No.7

こんにちは。 >それでも動作していないので、 うーん・・・。 /etc/aliasesを編集した後、更新かけてますよね? それでだめならpostfixをリロードしてみるとか・・・。 >いろいろ、調べてみましたが、etc/aliasesに >touroku: "| /usr/bin/php /var/www/vhosts/url**.com/httpdocs/regist/simp.php" >のように、書くだけで動作するようですので phpのパスは、あくまでもサーバーに合わせてください。 本当に/usr/bin/phpで合ってますか? それでも動かない場合は・・・、ちょっとわかりません・・・。

oozora-s
質問者

お礼

ご回答本当に、ありがとうございます。 お礼が遅れて申し訳ありません。 アドバイスいただいた事項を参考に試行錯誤しておりました。 やっと、空メールに対してスクリプトが動作するようになりました。 行ったことを参考とて記させていただきます。 virtual_alias_maps に #vi /etc/postfix/virtual_alias_maps として touroku@url***.com regist_xx を書き加え aliases に #vi /etc/aliases で regist_xx: “|php /var/www/vhosts/url**.com/httpdocs/regist/regi.php" を書き加え # newaliases #/usr/sbin/postmap /etc/postfix/virtual_alias_maps # etc/rc.d/init.d/postfix restart として スクリプトのコードを以下のように書きました。 #!/usr/bin/php -q <?php //PEARのライブラリ読み込み require_once("/usr/share/pear/Mail/mimeDecode.php"); //メールソースを標準入力から読み込み $source =fopen("php://stdin", "r"); //メール解析 $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $decoder = new Mail_mimeDecode($source); $structure = $decoder->decode($params); //メール返信 $to = "jibun@url**.com"; $title = "空メールの返信(例だよ)"; $body = "登録が完了しました。\n(実際は何も登録していません。)\n※このメールは配信専用です。\n返信されても対応は出来ませんので、ご了承下さい。\n".$structure; $from = "From: ccc.com"; mb_internal_encoding("SJIS"); mb_language("japanese"); mb_send_mail($to, $title, $body, $from); ?> これで空メールを送ると ------------------------------------------- 登録が完了しました。 (実際は何も登録していません。) ※このメールは配信専用です。 返信されても対応は出来ませんので、ご了承下さい。 Object id #2 -------------------------------------------- にメールが自分に返るようになりました。 試行錯誤で、main.cf の default_privs=apache などを変更しても .forwardを “|php /var/www/vhosts/url**.com/httpdocs/regist/regi.php" として tourokuのMaildirに 行ってもだめでしたが、上記でやっとスクリプトが実行 されたようです。 Object id #2 が $structure = $decoder->decode($params); の答えですが、これで標準入力を受けているということで よろしいでしょうか。

回答No.6

こんにちは。 >touroku: "| /var/www/vhosts/url**.com/httpdocs/regist/simp.php" これじゃぁ駄目です・・・。 PHPのパスが書いてないので、ただファイルが呼ばれてるだけ・・・。 パスが通っている場合は、 touroku: "| php /var/www/vhosts/url**.com/httpdocs/regist/simp.php" とか。 phpだけで認識しない場合は、 touroku: "| /usr/bin/php /var/www/vhosts/url**.com/httpdocs/regist/simp.php" とか・・・。

oozora-s
質問者

お礼

ご返答、アドバイス本当にありがとうございます。 アドバイスいただいたようにして実験してみました。 それでも動作していないので、下記のように標準入力を コメントアウトしてみました。 この状態でも、動作しませんでした。 ちなみに、ブラウザから http://url**.com/regist/simp.php とすると動作しました。 やはりpostfixからキックしていないのでしょうか。 いろいろ、調べてみましたが、etc/aliasesに touroku: "| /usr/bin/php /var/www/vhosts/url**.com/httpdocs/regist/simp.php" のように、書くだけで動作するようですので、VPSサーバの何かの問題なのでしょうか。 <? php //PEARのライブラリ読み込み //require_once("/usr/share/pear/Mail/mimeDecode.php"); //メールソースを標準入力から読み込み //$source = file_get_contents("php://stdin"); //if(!$source) { // exit(); // 読み込み失敗 //} $gdata="ddddddd".$sss.$frm; $ffp2="ggg.txt"; $fh=fopen($ffp2,"w"); fwrite($fh,$gdata); fclose($fh); //メール返信 $to = "oozora@url**.com"; $title = "空メールの返信(例)"; $body = "登録が完了しました。"; $from = "From: ccc.com"; mb_internal_encoding("SJIS"); mb_language("japanese"); mb_send_mail($to, $title, $body, $from); ?>

回答No.5

こんにちは。 そもそも、postfixからどのようにキックしてるんですか? 多分そこの書き方がおかしいので、標準入力に渡ってきてないような・・・?

oozora-s
質問者

お礼

ご回答ありがとうございます。 postfixには、VPSのサーバナビというツールで メールユーザーの登録をしています。 touroku@url**.com として登録しています。 /etc/aliasesには touroku: "| /var/www/vhosts/url**.com/httpdocs/regist/simp.php" と書いています。url**はドメインです。 OSのユーザにはtourokuというユーザはありません。 以前使用していたサーバ(CentOS5.1+php5.1.6+sendmail)ではユーザー登録をすると メールユーザーになって、/home/ユーザーのように なっていたのですが、現在のVPSではユーザー作成ではメールユーザー にはなりません。この違いでしょうか。 また、aliasesにtourokudではなくtouroku@url***.comとしなければいけない のでしょうか。 アドバイスよろしくお願いいたします。

回答No.4

こんにちは。 >標準入力に(php://stdin)値があるかの >確認はできるのでしょうか。 空メールの受信でキックされるので、デバッグは難しいですね・・・。 ただ、file_get_contents("php://stdin"); に値が入っているかどうかを確認するために、 $stdin = file_get_contents("php://stdin"); $output = "STDIN={$stdin}"; $file = fopen("適当な出力ファイル", "w"); fwrite($file, $output); fclose($file); だけを記述してみて、適当な出力ファイルの中を見てみてはいかがでしょうか? MTAが何か分かりませんが、メールからPHPに渡しているところが問題のような気がしますが・・・?

oozora-s
質問者

お礼

ご回答ありがとうございました。 ご呈示いただいた、コードを参考に $stdin = file_get_contents("php://stdin"); $output = "STDIN={$stdin}"; $file = fopen("ggg.txt", "w"); fwrite($file, $output); fclose($file); として、実験しましたが、ggg.txtは生成されて いませんでした。 MTAはpostfixとdovecotです。 VPSの内部設定でしょうか。

回答No.3

こんばんは。 file_get_contents("php://stdin"); この使い方は正しいです。 $sss=file_get_contents("php://stdin"); そもそも、$sssに値が入ってないんじゃないですか? file_get_contents("php://stdin"); があるから動かないんじゃなくて、値が入ってきていないから動かないのでは???

oozora-s
質問者

お礼

ご回答ありがとうございます。 標準入力に(php://stdin)値があるかの 確認はできるのでしょうか。 空メールにはFromはあると思うのですが。 よろしくお願いいたします。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

とりあえず、文脈が分かりづらいというのは俺も思いました。 一言で言うと、「$sss=file_get_contents("php://stdin"); 」の部分でコケてるっぽい。って事でしょうか? この書き方は極めて一般的な書き方で、問題はないはずです。 実際、俺も これで動かしています。 このソースであるなら、本来 「if(!$source) {」 の部分は、「if(!$sss) {」と するべき所なんでしょうが、今回の問題とは関係ないようなので、置いておきます。 思いつきで書いてるので、アテにはなりませんが、file_get_contents() を file() に置き換えた場合、どうなるでしょう? 関数がダメでコケてるのか、標準入力から取ろうとしている事がダメでコケてるのか分かりませんが、エラーログリポート出してみては如何でしょうか?

oozora-s
質問者

お礼

ご返答ありがとうございます。 $sss=file_get_contents("php://stdin"); を $sss=fopen('php://stdin', 'r'); で試してみましたが、同じでした。 /var/log/httpd/error_logを viでみましたが該当するログがありませんでした。 ほかにあるのでしょうか? よろしくお願いいたします。

oozora-s
質問者

補足

補足させて頂きます。 $sss=file_get_contents("php://stdin"); を $sss = file('php://stdin'); に変更してみましたが 結果は同じでした。 よろしくお願いいたします。

回答No.1

こんにちは。 ちょっと質問の文脈がわかり難いですね・・・。 if(!$source) { exit(); // 読み込み失敗 } で必ずexit()になりそうですが・・・?

oozora-s
質問者

お礼

ご返答ありがとうございます。 ご指摘の部分をコメントアウトしても動作しません。 間違えて次の質問で出してしまいましたが、標準入力 を受ける $sss=file_get_contents("php://stdin"); があると、動作しないようです。 アドバイスいただければ助かります。

関連するQ&A

  • 空メール受信時 php8 さくらインターネット 

    phpを8.0にバージョンアップしたら空メール受信時のphp起動が稼働しなくなりました。 稼働しなくなった理由や原因など教えていただきたいです。 よろしくお願いします。 過去のバージョン時に参考にしたサイトは以下の通りのものです http://www.aiwake.co.jp/modules/bulletin/index.php?page=article&storyid=3 -------------reply.php------------------------ #!/usr/local/bin/php -q <?php // PEARのパスを設定 $path = '/home/{さくらアカウント名}/pear/PEAR/'; set_include_path(get_include_path() . PATH_SEPARATOR . $path); require_once 'Mail/mimeDecode.php'; // 受信メールから読み込み $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $params['input'] = file_get_contents("php://stdin"); $params['crlf'] = "\r\n"; if (!$params['input']) { // 読み込み失敗 exit(); } $structure = Mail_mimeDecode::decode($params); // Fromフィールド(会員のアドレス)の取得 $fromField = $structure->headers['from']; $fromField = addslashes($fromField); $fromField = str_replace('"','',$fromField); $fromField = preg_replace('/(^.*<|>$)/', '', $fromField); // 会員のアドレスを暗号化 $addr = base64_encode($fromField); // Subjectフィールド(広告コード)の取得 $subjectField = $structure->headers['subject']; $subjectField = mb_convert_encoding($subjectField,"UTF-8","JIS"); $ad = $subjectField; // メール作成 $to = $fromField; $fromAddr = "{メールアドレス}"; $from = "From: $fromAddr"; $subject = "{メールタイトル}"; $body = "{メール内容}"; // メール送信 if (mb_send_mail($to, $subject, $body, $from)) { exit(); } else { echo "メールの送信に失敗しました。\n"; exit(1); // エラーコード 1 を返す } ?> -------------reply.php------------------------   to "| /usr/local/bin/php -q /home/gayhiroba/MailBox/{さくらアカウント名}/reply.php" exit

  • PEARのmimeDecodeでメール解析をしたい

    レンタルサーバにPEARをインストールし、 mimeDecode.phpを使って、メールを解析したいのですが、 上手くいきません。 下記のサイトを参考にしましたが、やはりできませんでした。 http://d.hatena.ne.jp/makotoworld/20071106/1194309820 http://www.abe-tatsuya.com/web_prog/php/mail2php.php メールを分解するファイル(.php)では、 file_get_contents("php://stdin")のようなカタチで、 メール情報はキャッチできています(確認済みです)が、 それを、 $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $params['input'] = file_get_contents("php://stdin"); // 標準入力 $params['crlf'] = "\r\n"; $mail_data = Mail_mimeDecode::decode($params); #-- 本文の取得 $MailBody = $mail_data->body; $MailBody = mb_convert_encoding($MailBody,"UTF-8","JIS"); としても、取り出せないのです。 (つまり、$MailBody は空っぽのままなのです。) さらに、 #-- From フィールドの取得 $FromAddress = $mail_data->headers['from']; #-- To フィールドの取得 $ToAddress = $mail_data->headers['to']; としている部分では、error_reportingが、 Notice: Undefined index: from in~~ Notice: Undefined index: to in~~ と、エラーを吐いています。 これも謎です…。一体、どういうことになっているんでしょうね?!汗 ・パスの書き方に誤りがあり、 正常にPEARにアクセス(利用)できていない? ・そもそも、インストールが怪しい? ・上記の、参考にした2サイトでは、 mimeDecode.phpの扱い方が違うのですが、この違いとは? これは、PEARのバージョンの新旧の問題? だとすると、今となっては、 どちらか一方しか使えない、もしくは、両方とも使えない? つまり、サイトを参考にして書いたコードがそもそも古くて使い物にならない? ・ファイルのパーミッションの問題?(保存形式はEUCとしています) 以上の点が、気になっています。 この事態を打開するためには、どう切り分けながら改善していったらよろしいでしょうか。 どなたかお詳しい方、どうか教えて下さい。 なお、 FFFTPにより、PEARのファイル群が置かれていることは確認しています。 (mimeDecode.phpもあります。) コードの冒頭は、 #!/usr/local/bin/php <?php error_reporting(E_ALL); としています。 レンタルサーバは、さくらインターネットのスタンダードプランです。 PHPバージョンは、5.2.14。 PEARは、最近、http://pear.php.net/go-pear経由でインストールしました。 長くなりましたが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 携帯からの空メールの処理

    こんにちは。今、PHP5.3で、携帯からの空メールを処理するプログラムを作っています。 具体的には、空メールが携帯から送られてくると、エイリアスでPHPプログラムに渡し、送信者に自動返信するというプログラムです。 現在、以下のようなプログラムを作っていますが、うまく動きません。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー <?php require_once("/opt/lampp/lib/php/PEAR.php"); // PEAR::Mailライブラリ require_once("/opt/lampp/lib/php/Mail.php"); // PEAR::Mail_mimeライブラリ require_once("/opt/lampp/lib/php/Mail/mimeDecode.php"); $params['include_bodies'] = false; $params['decode_bodies'] = false; $params['decode_headers'] = true; $params['input'] = file_get_contents("php://stdin"); $params['crlf'] = "\r\n"; //メールを解析する $structure = Mail_mimeDecode::decode($params); print_r($structure); //送信元を取得する $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; //送信データを設定する $recipients = $mail; $new_from = 'register@7ws.jp'; $subject = 'empty mail OK!'; $body ='登録が完了しました。'; $headers = "From:".$new_from; //メールを送信する $headers = array(); $headers['From'] = $new_from; $headers['To'] = $recipients; $headers['Subject'] = $subject; $headers['Sender'] = $new_from; $mail = Mail::factory('sendmail'); $result = $mail->send($recipients, $headers, $body); ?> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 参考にしたのは、http://www.phppro.jp/phptips/archives/vol35/1 と「PHP×携帯サイト デベロッパーズバイブル」です。 プログラムを実行しても、空メールの送信者のアドレスが取得できず、 送り先を空白のまま、メールを送信していまい、エラーとなります。 正常に送信者アドレスを取る方法をご存知の方が、いらっしゃいましたら、ご教授お願いします。 なお、$structure = Mail_mimeDecode::decode($params);の下で、 print_r($structure);を実行したところ、 print_r($structure); ( [headers] => Array ( [] => ) [ctype_primary] => text [ctype_secondary] => plain ) という表示なっていました。headersがArrayなのに空っぽなところに、 問題があるのではないかと思います。以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • Xserverでの空メール実装について

    Xserverで空メールを実装しようとしています。 しかしうまく動作しません。 マニュアルを参考に「メールの振り分け設定」より 条件:あて先が ○○○○○@△△△△ を一致する 処理方法:| /○○○○/□□□□/sippai.php へ 転送する としました。 しかし、携帯電話より○○○○○@△△△△へメール送信しても、 差出人:MAILER-DAEMON@△△△.xserver.jp 件名:Undelivered Mail Returned to Sender と返信されてしまいます。 サーバー側の設定が何か必要なのでしょうか? スクリプトを以下に記載します。 使用スクリプト;PHP5、ライブラリ;PEAR <?php //PEAR::MailCu require_once '/aaaaaa/bbbb/cccc/ddddd/eeeee/fff/Mail.php'; //PEAR::Mail_mimeCu require_once '//aaaaaa/bbbb/cccc/ddddd/eeeee/ggg/mimeDecode.php'; //メールソースを読み込む $source = file_get_contents("php://stdin"); if(!$source){ exit(); } //メールを解析する $decoder = new Mail_mimeDecode($source); $structure = $decoder->decode($params); //送信元を取得する $from = $structure -> headers['from']; $from = mb_decode_mimeheader($from); $from = mb_convert_encoding($from, mb_internal_encoding(),'auto'); if(preg_match( '/<(.*?)>$/' , $from , $match)){ $from = $match[1]; } $from = trim($from); $from = strtolower($from); //送信データを設定する $recipients = $from; $new_from = '○○○○○@△△△△'; $subject = 'empty mail ok!'; $body = 'http://fmob.jp'; //メールを送信する $headers = array(); $headers['From'] = $new_from; $headers['To'] = $recipients; $headers['Subject'] = $subject; $headers['Sender'] = $new_from; $mail = Mail::factory('sendmail'); $result = $mail->send($recipients, $headers, $body); ini_set('log_errors', '1'); ini_set('error_log', 'エラーログのパス'); ?> よろしくお願いします。

    • ベストアンサー
    • PHP
  • Mail_mimeDecodeでメール本文取得

    index.php <form action="mailto:info@hoge.com" method="get" id="join"> <input type="hidden" name="body" value="<?php echo $friend;?>" /> </center></form> empty_mail.php $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $params['input'] = file_get_contents("php://stdin"); $params['crlf'] = "\r\n"; $mail_data = Mail_mimeDecode::decode($params); $MailBody = getbody($mail_data); if (!$MailBody) { print "cannot get MailBody"; // エラー処理 }// $MailBodyを使った処理 function getbody($arg) { if ($arg->ctype_primary == 'multipart') { foreach($arg->parts as $parts) { $ret = getbody($parts); if ($ret) { return $ret; } } } if ($arg->ctype_primary == 'text') { if ($arg->ctype_secondary == 'plain') { if (strtolower($arg->ctype_parameters['charset']) == 'iso-2022-jp') { return mb_convert_encoding($arg->body, "UTF-8", 'JIS'); } else { return $arg->body; } } } return false; } //メールを解析する $decoder = new Mail_mimeDecode($source); $structure = $decoder->decode($params); //送信元を取得する $mail = $structure->headers['from']; $mail = addslashes($mail); $mail = str_replace('"','',$mail); $from = $structure -> headers['from']; $from = mb_decode_mimeheader($from); $from = mb_convert_encoding($from, mb_internal_encoding(),'auto'); if(preg_match( '/<(.*?)>$/' , $from , $match)){ $from = $match[1]; } $from = trim($from); $from = strtolower($from); //送信データを設定する $recipients = $from; $new_from = 'info@hoge.com'; mb_language('ja'); mb_internal_encoding('sjis'); $subject = mb_encode_mimeheader(mb_convert_encoding("登録URL", "JIS", "auto"), "JIS"); $body = "下記のURLをクリックして登録を行ってください http://hoge/hoge.php?". $MailBody . "". session_name()."=". htmlspecialchars(session_id()); と$friendを登録フォーム画面にいくまで情報を維持したいのですが、ご教授お願いします。

    • ベストアンサー
    • PHP
  • 自動返信でのMail_mimeDecode

    //メールソースを読み込む $source = file_get_contents("php://stdin"); if(!$source){ exit(); } $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $params['input'] = file_get_contents("php://stdin"); $params['crlf'] = "\r\n"; $mail_data = Mail_mimeDecode::decode($params); $MailBody = getbody($mail_data); if (!$MailBody) { print "cannot get MailBody"; // エラー処理 }// $MailBodyを使った処理 function getbody($arg) { if ($arg->ctype_primary == 'multipart') { foreach($arg->parts as $parts) { $ret = getbody($parts); if ($ret) { return $ret; } } } if ($arg->ctype_primary == 'text') { if ($arg->ctype_secondary == 'plain') { if (strtolower($arg->ctype_parameters['charset']) == 'iso-2022-jp') { return mb_convert_encoding($arg->body, "UTF-8", 'JIS'); } else { return $arg->body; } } } return false; } //メールを解析する $decoder = new Mail_mimeDecode($source); $structure = $decoder->decode($params); //送信元を取得する $mail = $structure->headers['from']; $mail = addslashes($mail); $mail = str_replace('"','',$mail); $from = $structure -> headers['from']; $from = mb_decode_mimeheader($from); $from = mb_convert_encoding($from, mb_internal_encoding(),'auto'); if(preg_match( '/<(.*?)>$/' , $from , $match)){ $from = $match[1]; } $from = trim($from); $from = strtolower($from); //送信データを設定する $recipients = $from; $new_from = 'get@hoge.com'; mb_language('ja'); mb_internal_encoding('sjis'); $subject = mb_encode_mimeheader(mb_convert_encoding("登録URL", "JIS", "auto"), "JIS"); $body = "下記のURLをクリックして登録を行ってください http://hoge.com/regist.php?". $MailBody . "". session_name()."=". htmlspecialchars(session_id()); とメールを自分のHPに送る際に本文にデータがあるのですが、そのデータを取り出し登録URLに付加し、情報を維持させたいのですが、上記のソースですと$MailBodyに情報がはいっていません。ベテランさん!ご指導、ご教授お願い致します

    • ベストアンサー
    • PHP
  • PHP5での空メールが実行されない

    現在PHP5を利用して携帯の空メールを実装しており、3日ほどトライし続けておりますが、携帯側にエラーが返信される所で先に進めずにいます(;;)プログラムは勉強し始めて4ヶ月程度の未熟者です。どなたか是非ご教授頂ければと思います。よろしくお願いします!! ちなみに、pearは使えているのを、他のライブラリで確認しました。 【使用言語とライブラリ】 PHP5、pearの『Mail.php』『mimeDecode.php』 【参考書籍】 PHP携帯 デベロッパーズバイブル 【利用サーバー】 Xサーバー 【メールの振り分け設定】 『条件』あて先が ○○○@△△.com を一致する 『処理方法』 | /home/サーバーID/ドメイン/public_html/フォルダ名/フォルダ名/empty_mail.php へ 転送する 【PHPのソース】 #!/usr/bin/php5 <?php //PEAR::Mailライブラリ ini_set('include_path', '/home/サーバーID/ドメイン/public_html/pear/PEAR'); require_once 'Mail/Mail.php'; //PEAR::Mail_mimeライブラリ ini_set('include_path', '/home/サーバーID/ドメイン/public_html/pear/PEAR'); require_once 'Mail/mimeDecode.php'; //メールソースを読み込む $source = file_get_contents("php://stdin","r"); if(!$source){ exit("標準入力に失敗"); } //メールを解析する $decoder = new Mail_mimeDecode($source); $structure = $decoder->decode($params); //送信元を取得する $from = $structure -> headers['from']; $from = mb_decode_mimeheader($from); $from = mb_convert_encoding($from, mb_internal_encoding(),'auto'); if(preg_match( '/<(.*?)>$/' , $from , $match)){ $from = $match[1]; } $from = trim($from); $from = strtolower($from); //送信データを設定する $recipients = $from; $new_from = ○○○@△△.com'; $subject = 'empty mail ok!'; $body = '(仮)こんにちわ'; //メールを送信する $headers = array(); $headers['From'] = $new_from; $headers['To'] = $recipients; $headers['Subject'] = $subject; $headers['Sender'] = $new_from; $mail = Mail::factory('sendmail'); $result = $mail->send($recipients, $headers, $body); ini_set('log_errors', '1'); ini_set('error_log', 'エラーです'); 【エラー内容(すごく長いですが…)】 This is the Postfix program at host sv225.xserver.jp. I'm sorry to have to inform you that your message could not be delivered to one or more recipients. It's attached below. For further assistance, please send mail to <postmaster> If you do so, please include this problem report. You can delete your own text from the attached returned message. The Postfix program <○○○@△△.com>: Command died with status 255: "/usr/bin/maildrop". Command output: PHP Warning: require_once(/home/サーバーID/ドメイン名/public_html/pear/PEAR/Mail/Mail.php) [<a href='function.require-once'>function.require-once</a>]: failed to open stream: No such file or directory in /home/サーバーID/ドメイン名/public_html/mobile_search/gotempty_mail2.php on line 7 PHP Fatal error: require_once() [<a href='function.require'>function.require</a>]: Failed opening required '/home/サーバーID/ドメイン名/public_html/pear/PEAR/Mail/Mail.php' (include_path='home/サーバーID/ドメイン名/public_html/pear/PEAR') in /home/サーバーID/ドメイン名/public_html/mobile_search/gotempty_mail2.php on line 7 X-Powered-By: PHP/5.1.6_ Content-type: text/html_ _ とても煩雑でごめんなさい(;;) どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • PEAR の Mail_mimeDecodeで

    お世話になります 下記スクリプトにてメールを受信してDBに格納しようと思っています DBに格納後、メールサーバからメールを消したいのですが、メールボックスを空にするためにの処理を教えて頂けないでしょうか? 宜しくお願いいたします。 /////////////////////////////////// //PEARのパスを設定 require_once 'Mail/mimeDecode.php'; #-- メールデータの取得 $params['include_bodies'] =true; $params['decode_bodies'] =true; $params['decode_headers'] =true; $params['input'] = file_get_contents("php://stdin"); //標準入力 $params['crlf'] = "\r\n"; $mail_data = Mail_mimeDecode::decode($params); #-- From $FromAddress = $mail_data->headers['from']; $FromAddress = addslashes($FromAddress); //エスケープ処理 $FromAddress = str_replace('"','',$FromAddress); #-- 署名つきの場合 preg_match("/<.*>/",$FromAddress,$str); if($str[0]!=""){ $str=substr($str[0],1,strlen($str[0])-2); $FromAddress=$str; } #-- Subject フィールドの取得 $Subject = $mail_data->headers['subject']; $Subject = mb_convert_encoding($Subject,"UTF-8","JIS"); #-- 本文の取得 switch(strtolower($mail_data->ctype_primary)){ case "text": //テキストメール $MailBody = $mail_data->body; $MailBody = mb_convert_encoding($MailBody,"UTF-8","JIS"); break; case "multipart": //マルチパート(添付ファイル(画像前提)付) foreach($mail_data->parts as $part){ switch(strtolower($part->ctype_primary)){ case "text": $MailBody = $part->body; $MailBody = mb_convert_encoding($MailBody,"UTF-8","JIS"); break; case "image": $type = strtolower($part->ctype_secondary); // jpg,gif,png以外の画像形式は受け付けない if($type != "jpeg" and $type != "jpg" and $type != "gif" and $type != "png"){ continue; } // ファイルを保存 /* $fp = fopen("/tmp/". time() . $type, "w"); $length = strlen($part->body); fwrite($fp,$part->body,$length); fclose($fp); */ break; } } break; default: $MailBody=""; }

    • ベストアンサー
    • PHP
  • メールを受信した後、特定メールを削除

    メールフィルターで受信後にプログラムを起動し特定のメールだけ削除したいのですが可能でしょうか? メールフィルターは以下です。CCはメールボックスから削除しない。 cc "| /home/○○/○○/mailgo.php" PEARを使ってまず受信します。 $params['input'] = file_get_contents("php://stdin"); $structure = Mail_mimeDecode::decode($params); メールのファイル名などを取得し、その後、削除したいメールも特定できたのですが どうすればいいのでしょうか?

    • 締切済み
    • PHP
  • PHPのmimeDecode.php について

    Redhat Linux4 で、メールを受信した際、添付ファイルがあれば 特定のフォルダに添付ファイルを保存するPHPを作っています。 以下のメール受信時にPHPプログラムを起動すると、 添付ファイル付きメールなのに、 $structure->ctype_primary = 'multipart' となってくれず 途方にくれています。 どなたかご教授いただきたくよろしくお願いいたします。 require_once("Mail/mimeDecode.php"); $input = file_get_contents("php://stdin"); $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $decoder = new Mail_mimeDecode($input, "\r\n"); $structure = $decoder->decode($params); $GB['sMailBody']=$structure->ctype_primary; この結果、$GB['sMailBody']は、text となってしまいます。

    • 締切済み
    • PHP

専門家に質問してみよう