• 締切済み

空メールでの自動返信:ガラケーだけエラーメール

こんにちは。 使用環境 OS:Turbolinux Appliance Server 3.0 Postfix:2.4.5 PHP:5.2.4 とあるサイトで空メールを受信すると自動でPHPを動かし、ワンタイムパスワードを返信するプログラムを利用しています。 今まで問題なく利用できていたのですが、最近ガラケーから空メールを送信した時だけワンタイムパスのみでなくエラーメールを返すようになりました。 PCやiPhoneからのメールにはエラーを返しません。 エラーメッセージは以下のような感じです Command died with status 1: "/usr/bin/php -q /home/.sites/xxx/yyy/web/onetime.php". Command output: zend_mm_heap corrupted どちらの場合もワンタイムパスは返信されてきますし、今まで動いていたことからも権限の問題はないと思われます。 何が原因なのか、またどうすれば解消するのかご存知の方がいらっしゃいましたらご教授お願いします。

みんなの回答

noname#189141
noname#189141
回答No.5

> このプラグラムも私が作ったものではないので漠然としか理解できていないと思います^^; 作った人に聞くのが筋だと思いますが。 こちらもPHPは素人ですが、DBへの問い合わせと更新を行っているようですね。 それぞれ、正常になされているのか、確認できますか? > //メール解析用インスタンス > $structure = Mail_mimeDecode::decode($params); ここも怪しいかもしれません。このソースではデコード処理対応が適切にされているか、でこの後の処理が変わってくると思います。 これの戻りに対して、正常かどうかの判定がありませんので、ガラケーだけ、というのも関連しているかもしれません。 あとは、一般的な方法として、デバッグ文などを入れてみて、どこまで処理がいっているか確認するしか無いでしょう。 ---- ソースをすべて乗っけても、デバック出来るわけではありませんので、悪しからず。

hiyokophper
質問者

お礼

ありがとうございます。 作った人、に尋ねられたら一番いいのですが、作った人は既に辞めてしまっているので尋ねることができません; >DBへの問い合わせと更新を行っているようですね。 >それぞれ、正常になされているのか、確認できますか? これに関しては、DBそのものはワンタイムが書き直されてメールで送られてくるものと一致しているので大丈夫だと思います。 教えていただいた部分を重点的に一つずつ確かめてみます。 お時間をとらせてしまい申し訳ありませんでした。 ありがとうございました。

noname#189141
noname#189141
回答No.4

> この問題のせいだとしたら、ガラケーだから、というわけでなく個人のアドレスの問題だということですよね…。 はい、そうなりますが、ガラケーというか昔からの契約者のメールアドレスで問題になる事があります。 > PHPのアップデートなどは行っていないのですが、dkim-milterとdk-milterのアップデートはしました。 > これが関係あるのでしょうか…? 大いにあるような気がします。それ以外のセキュリティアップデートは行っていないのでしょうか? > また、処理自体は実行されているので、このエラーメールだけ止まれば問題はないのですが^^; #2さんの回答で問題ないとすると、元のソースで利用している何かに問題があるのでしょうが、ソースが見えないので。 エラーコードからすると、何らかのメモリリークを起こしているのではないでしょうか。 http://pentan.info/php/zend_mm_heap.html

hiyokophper
質問者

お礼

度々ありがとうございます。 >大いにあるような気がします。それ以外のセキュリティアップデートは行っていないのでしょうか? それ以外ではアップデートは行っていません。 自サーバから発行するメルマガがGmailから弾かれてしまうのでspam認定をされないようにごにょごにょやっているのですが、SPFの設定などはこちらからの送信用設定なので受信をトリガーにしたプログラムには関係ないと思ったのですが、影響があるのでしょうか… > #2さんの回答で問題ないとすると、元のソースで利用している何かに問題があるのでしょうが、ソースが見えないので。 申し訳ありません。 ソースを提示するべきですよね。ソースを捕捉に改めて提示させていただきますので、お時間が許せば何かアドバイスいただけると助かります。 >エラーコードからすると、何らかのメモリリークを起こしているのではないでしょうか。 サイトのご提示までありがとうございます。このサイトは拝見したのですが、php.iniを安易に触るとほかに影響が出てしまいそうで怖くて、二の足を踏んでいます。また、メモリリークの関係ならどのアドレスからもエラーメールが返ってくるのでは?と思ったりもしています。

hiyokophper
質問者

補足

以下が問題のphpです。 このプラグラムも私が作ったものではないので漠然としか理解できていないと思います^^; <? include "constant.php"; ini_set('include_path', INCPATH); //PEARのライブラリ読み込み $pear = "/usr/share/pear/"; require_once("{$pear}Mail.php"); require_once("{$pear}Mail/mime.php"); require_once("{$pear}Mail/mimeDecode.php"); require_once("{$pear}MDB2.php"); require_once("{$htdocs}class/dbclass.php");//DB接続クラス //FOR TEST $testStr = ""; //DBに接続 $conDB = new MySQLDB(); // メールデータ取得設定 $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; //メールソースを標準入力から読み込み $params['input'] = file_get_contents("php://stdin"); $params['crlf'] = "\r\n"; $source = $params['input']; //メール解析用インスタンス $structure = Mail_mimeDecode::decode($params); //登録先 $from_mail = $structure->headers['to']; //送信者のメールアドレス $sender = $structure->headers['from']; $pos1 = strpos($sender,"<"); $pos2 = strrpos($sender,">"); if($pos1){ $sender = substr($sender,($pos1+1),($pos2-$pos1-1)); } //送信者の情報取得 $sql = "SELECT * FROM admin WHERE admin_mail = ? AND admin_validity <> 1"; $senderSplited = str_replace(array("<",">"),"",$sender); $res = $conDB->preparedSql($sql,array($senderSplited),1);//***************************************************** if(count($res)>0){ //署名付きの場合の処理を追加 preg_match("/<.*>/",$to_mail,$str); if($str[0]!=""){ $str=substr($str[0],1,strlen($str[0])-2); $to_mail = $str; } $params = array( "host" => "localhost", "port" => 25, "auth" => false, "username" => "user", "password" => "pass" ); $mailObject = Mail::factory("smtp", $params); $mailTitle2 = mb_convert_encoding("【ワンタイムパスワード】","ISO-2022-JP","UTF-8"); $headers = array( "To" => $sender, "From" => "onetime@example.com", "Subject" => $mailTitle2 ); //ワンタイム設定 $onetime = rand(100,99999); $sql = "UPDATE admin SET admin_onetime = ?, admin_note = ? WHERE admin_id = ?"; $arr = array($onetime,date("Y-m-d H:i:s"),$res[0]["admin_id"]); $otp = $conDB->preparedSql($sql,$arr,2); $bodyArranged = mb_convert_encoding("ワンタイムパスワード: {$onetime}","ISO-2022-JP","UTF-8"); //スタッフへメール送信 $mailObject->send($sender, $headers, $bodyArranged); } //AND admin_validity = 0 ?> よろしくお願いいたします

noname#244856
noname#244856
回答No.3

>> 該当メールアドレスは有効だ、という理解でいいでしょうか? そういうことですね。 FILTER_VALIDATE_EMAILについての調査結果です、IPv6以外は正しく動いていることが分かります↓ http://qiita.com/mpyw/items/257eabe0b43b1e02e6f7 PHP自体がクラッシュするということは言語本体のバグを疑ってもいいかもしれません。ダメ元ですが最新バージョンのPHP5.5にアップデートされてみてはどうでしょうか?5.2はもう何年も前のかなり古いものなので。

hiyokophper
質問者

お礼

ありがとうございます。 言語自体のバグ、ですか…。 PHPのアップデートは前々からやったほうがいいんだろうな、とは思っているのですが、 自社に詳しい人間がおらず、グループサイトや売上管理等、自社サーバ内のすべてが関わってくるので怖くてスルーしてきてますw とはいえ、今後のことも考えるとどこかで必要になってくる作業ですよね…。 ローカル環境でテストしまくるしかありませんかね^^; (PGという肩書があるのは未経験採用された私のみで、採用時にいた上司は私が入社して4ヶ月ほどで辞めてしまったので以降すべて独学ですorz)

noname#244856
noname#244856
回答No.2

function is_valid_email ($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; } でメールアドレスが(PHPから見て)有効かどうか簡単にチェックできるので試してみてください。IPv6で表記されたものを除けば、このfilter_var関数に使われている正規表現は99.9%正しくRFC準拠判定が出来ます。

hiyokophper
質問者

お礼

ありがとうございます。 頂いた関数を実行してみたところ、エラーメールの返るアドレスもそうでないアドレスも1を返してきました。 と、いうことは該当メールアドレスは有効だ、という理解でいいでしょうか? だとすると、メールアドレスそのものの問題ではないのでしょうか?

noname#189141
noname#189141
回答No.1

ガラケーのメールアドレスがRFCに準拠していないものだからではないでしょうか? http://www.ecc.kumagaku.ac.jp/file/tech/RFC-probrem.pdf PHP側のセキュリティアップデートなんかで、準拠しないアドレスへの処理が出来なくなったのでは? とエスパーしてみる。

hiyokophper
質問者

お礼

ありがとうございます。 この問題のせいだとしたら、ガラケーだから、というわけでなく個人のアドレスの問題だということですよね…。 PHPのアップデートなどは行っていないのですが、dkim-milterとdk-milterのアップデートはしました。 これが関係あるのでしょうか…? また、処理自体は実行されているので、このエラーメールだけ止まれば問題はないのですが^^;

関連するQ&A