PEARのMail_mimeDecodeでメールを受信してDBに格納しようと思っています

このQ&Aのポイント
  • 下記スクリプトにてメールを受信してDBに格納しようと思っています。
  • DBに格納後、メールサーバからメールを消すための処理を教えて頂けないでしょうか?
  • メールデータの取得、From、Subject、本文の取得の処理も含まれています。
回答を見る
  • ベストアンサー

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=""; }

noname#227352
noname#227352
  • PHP
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>メールボックスを空にするためにの処理 メールを送るのはPEAR::Mailですが受け取るのはPEAR::Net_pop3ですね http://pear.php.net/manual/ja/package.networking.net-pop3.php deleteMsg() で削除ができます

その他の回答 (1)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>$params['input'] = file_get_contents("php://stdin"); //標準入力 メールフィルタか何かの設定で、到着したメールをphpスクリプトに引き渡すようになっているのですよね?もしこの部分を活かすならメールフィルタ側で削除するのがスジです。 #現状のままではどうやっても(phpスクリプトからは)削除は出来ません。 どうしても「処理後に削除したい」ということなら、メールフィルタはスクリプト起動だけに利用して(php://stdinは利用しないで)自前でPOP3サーバに繋いでメールを取得してください。最初にUIDL(Unique ID Listing)を取得して各々のIDのメールを取得・処理することになりますが、どうせPOP3サーバからメールを削除するにはメールID(UniqueID)が必要ですから。

関連するQ&A

  • PEARのmimeDecodeについて

    お世話になります 下記スクリプトにてメールをPHPで受け取ることは出来ているのですが、 画像データの処理について教えて頂けないでしょうか? $FromAddress,$Subject,$MailBodyとそれぞれの変数で取得したデータはデータベースに格納出来ています。 しかし、添付されている画像データを取り出してデータベースに格納する所でつまずいています。 // ファイルを保存 $fp = fopen("/tmp/". time() . $type, "w"); $length = strlen($part->body); fwrite($fp,$part->body,$length); fclose($fp); 上記部分で画像データは取得出来ていると思われるのですが、データベースに格納出来るデータに変更するための処理をアドバイス願います。 宜しくお願いします ちなみにPHP4です #PHPファイル########################### /////////////////////////////////// //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
  • PEARのmimeDecodeについて

    お世話になっております 受信メールの解析にチャレンジしているのですが、デコメールの処理でつまずいています 下記の記述でメールの本文は取得出来ているのですがデコメール場合は、どのような処理をすればいいのでしょうか? あちこちのサイトを参考にしてみてはいるのですが、自力で答えが導きだせません お手数おかけ致しますが、アドバイスお願い致します 宜しくお願い致します #-- 本文の取得#################################################### 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
  • 自動返信での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
  • 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
  • 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
  • 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
  • [PEAR] Mail_mime_Decomail

    PEARの ・mime ・mimePart ・Mail_mime_Decomail を使用してHTMLメールマガジン送信機能を実装しています。 送信先のアドレスをループさせてアドレスを取得⇒送信を行っています。 送信自体に問題はありませんが、ヘッダー情報の[To:]部分が最初に送信したアドレスが入ってしまい 各アドレスが代入されません。 ループ前にインスタンス化しているせいだとは思うのですが、何百通も送信するので毎回インスタンス化はメモリ消費を考えると避けたいです。 毎回ヘッダーの[To:]部分だけを初期化する手段があれば、どなたか教えていただけませんでしょうか? よろしくお願いします。 ----------------------------------- $params = array( "host" => "******", "port" => 25, "auth" => false, "persist" => true ); $mailObject = Mail::factory("smtp", $params); $mimeObject = new Mail_mime_Decomail(); $headers['From'] = "*****"; $headers['Return-Path'] = "****"; $headers['Subject'] = mb_encode_mimeheader("テスト","ISO-2022-JP"); // 送信先ループ for($i=0; $i<=$count; $i++) { $headers['To'] = ''; // $bodyは受信者の名前など送信先によって内容が異なる $mailBody = mb_convert_encoding($mailBody, "ISO-2022-JP", "EUC-JP"); $mimeObject->setTXTBody($mailBody); $mimeObject->setHTMLBody($mailBody); $buid_params = array( 'head_charset' => 'ISO-2022-JP', 'text_charset' => 'ISO-2022-JP', 'html_charset' => 'ISO-2022-JP' ); $body = $mimeObject->get($buid_params); $headers['To'] = "送信先アドレス"; $header = $mimeObject -> headers($headers); $mailObject -> send("送信先アドレス", $header, $body); } -----------------------------------

    • ベストアンサー
    • PHP
  • pearのMailライブラリがうまくいきません

    自分で解決できなかったので、申し訳ないですが他力本願させていただきます。 空メール登録のシステムを作っています。 スクリプト以前に、メールを送ると 「Fw:Returned mail: see transcript for details」のタイトルで 以下のような文章でかえってきます。 rom: Mail Delivery Subsystem <MAILER-DAEMON@www.abc.com> Date: Fri, 23 Jan 2009 19:15:27 +0900 To: <hoge@ezweb.ne.jp> Subject: Returned mail: see transcript for details The original message was received at Fri, 23 Jan 2009 19:15:27 +0900 from xxxxxxxxxx.ezweb.ne.jp [11.111.11.123] ----- The following addresses had permanent fatal errors ----- "|php /var/www/hoge-html/hogehoge/empty_mail.php" (reason: Service unavailable) (expanded from: <hohogege@hoge.jp>) ----- Transcript of session follows ----- smrsh: "empty_mail.php" not available for sendmail programs (stat failed) 554 5.0.0 Service unavailable aliasesの設定には以下のようにしています。パスはあっています。 hohogege:"|php /var/www/hoge-html/hogehoge/empty_mail.phpp" sendmail, postfixはインストールされています。 ちなみにスクリプトは以下のように書きました。 //PEAR::Mailライブラリ require_once 'Mail.php'; //PEAR::Mail_mimeライブラリ require_once '/usr/share/pear/Mail/mimeDecode.php'; //メールソースを読み込む $source = file_get_contents("php://stdin"); if(!souce){ exit(); } //メールを解析する。 $decoder = new Mail_mimeDecode($source); $structure = $decoder->decode($params); //送信元を取得する。 $form = $structure->headers['from']; $form = mb_decode_mimeheader($from); $form = mb_convert_encoding($form, mb_internal_encoding(), 'auto'); if(preg_match( '/<(.*?)>$/', $from, $match)){ $from = $match[1]; } $from = trim($from); $from = strtolower($from); //送信データを設定する $recipients = $from; $new_from = 'hogehoge@abc.jp'; $subject = 'empty mail ok'; $body = 'http://www.hogehoge.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);

    • ベストアンサー
    • PHP
  • PHPから携帯へメール送信

    いつもお世話になっております。 PHPから携帯電話へ"絵文字付き"でメールを送るプログラムを作成している のですが、『base64_encode』等を使用して絵文字の表示までは行う事がで きました。 ですが、本文が途中で途切れてしまうのです・・・。 PHP側は、 $to = mb_convert_encoding(mb_decode_mimeheader($structure->headers['from']), 'SJIS', 'ISO-2022-JP'); $subject = mb_convert_encoding(mb_decode_mimeheader($structure->headers['subject']), 'SJIS', 'ISO-2022-JP'); (省略)  ・  ・ $body = $structure->body; $body = preg_replace('/\s*>\s.*/', '', $body); $body = mb_convert_encoding($body, 'SJIS', 'ISO-2022-JP'); //---------------------------------- // base64_encode //---------------------------------- $subject = "=?shift_jis?B?" . base64_encode($subject) . "?="; $body = base64_encode($body); //---------------------------------- // ヘッダを作成 //---------------------------------- $headers = "From: test@mail.com\n"; $headers .= "MIME-Version: 1.0\n"; $headers .= "Content-Type: text/plain; charset=Shift-JIS\n"; $headers .= "Content-Transfer-Encoding: base64"; //---------------------------------- // メール送信 //---------------------------------- $res = mail($to, $subject, $body, $headers);  ・  ・ (省略) 上記のように記述しています。 メールは送れます。絵文字も表示されます。ですが、本文が途中で途切れ てしまいます。 どなたかご教授をお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう