こんにちは。
使用環境
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
どちらの場合もワンタイムパスは返信されてきますし、今まで動いていたことからも権限の問題はないと思われます。
何が原因なのか、またどうすれば解消するのかご存知の方がいらっしゃいましたらご教授お願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
ガラケーのメールアドレスがRFCに準拠していないものだからではないでしょうか?
http://www.ecc.kumagaku.ac.jp/file/tech/RFC-prob …
PHP側のセキュリティアップデートなんかで、準拠しないアドレスへの処理が出来なくなったのでは?
とエスパーしてみる。
ありがとうございます。
この問題のせいだとしたら、ガラケーだから、というわけでなく個人のアドレスの問題だということですよね…。
PHPのアップデートなどは行っていないのですが、dkim-milterとdk-milterのアップデートはしました。
これが関係あるのでしょうか…?
また、処理自体は実行されているので、このエラーメールだけ止まれば問題はないのですが^^;
No.2
- 回答日時:
function is_valid_email ($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
でメールアドレスが(PHPから見て)有効かどうか簡単にチェックできるので試してみてください。IPv6で表記されたものを除けば、このfilter_var関数に使われている正規表現は99.9%正しくRFC準拠判定が出来ます。
ありがとうございます。
頂いた関数を実行してみたところ、エラーメールの返るアドレスもそうでないアドレスも1を返してきました。
と、いうことは該当メールアドレスは有効だ、という理解でいいでしょうか?
だとすると、メールアドレスそのものの問題ではないのでしょうか?
No.3
- 回答日時:
>> 該当メールアドレスは有効だ、という理解でいいでしょうか?
そういうことですね。
FILTER_VALIDATE_EMAILについての調査結果です、IPv6以外は正しく動いていることが分かります↓
http://qiita.com/mpyw/items/257eabe0b43b1e02e6f7
PHP自体がクラッシュするということは言語本体のバグを疑ってもいいかもしれません。ダメ元ですが最新バージョンのPHP5.5にアップデートされてみてはどうでしょうか?5.2はもう何年も前のかなり古いものなので。
ありがとうございます。
言語自体のバグ、ですか…。
PHPのアップデートは前々からやったほうがいいんだろうな、とは思っているのですが、
自社に詳しい人間がおらず、グループサイトや売上管理等、自社サーバ内のすべてが関わってくるので怖くてスルーしてきてますw
とはいえ、今後のことも考えるとどこかで必要になってくる作業ですよね…。
ローカル環境でテストしまくるしかありませんかね^^;
(PGという肩書があるのは未経験採用された私のみで、採用時にいた上司は私が入社して4ヶ月ほどで辞めてしまったので以降すべて独学ですorz)
No.4
- 回答日時:
> この問題のせいだとしたら、ガラケーだから、というわけでなく個人のアドレスの問題だということですよね…。
はい、そうなりますが、ガラケーというか昔からの契約者のメールアドレスで問題になる事があります。
> PHPのアップデートなどは行っていないのですが、dkim-milterとdk-milterのアップデートはしました。
> これが関係あるのでしょうか…?
大いにあるような気がします。それ以外のセキュリティアップデートは行っていないのでしょうか?
> また、処理自体は実行されているので、このエラーメールだけ止まれば問題はないのですが^^;
#2さんの回答で問題ないとすると、元のソースで利用している何かに問題があるのでしょうが、ソースが見えないので。
エラーコードからすると、何らかのメモリリークを起こしているのではないでしょうか。
http://pentan.info/php/zend_mm_heap.html
この回答への補足
以下が問題の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
?>
よろしくお願いいたします
度々ありがとうございます。
>大いにあるような気がします。それ以外のセキュリティアップデートは行っていないのでしょうか?
それ以外ではアップデートは行っていません。
自サーバから発行するメルマガがGmailから弾かれてしまうのでspam認定をされないようにごにょごにょやっているのですが、SPFの設定などはこちらからの送信用設定なので受信をトリガーにしたプログラムには関係ないと思ったのですが、影響があるのでしょうか…
> #2さんの回答で問題ないとすると、元のソースで利用している何かに問題があるのでしょうが、ソースが見えないので。
申し訳ありません。
ソースを提示するべきですよね。ソースを捕捉に改めて提示させていただきますので、お時間が許せば何かアドバイスいただけると助かります。
>エラーコードからすると、何らかのメモリリークを起こしているのではないでしょうか。
サイトのご提示までありがとうございます。このサイトは拝見したのですが、php.iniを安易に触るとほかに影響が出てしまいそうで怖くて、二の足を踏んでいます。また、メモリリークの関係ならどのアドレスからもエラーメールが返ってくるのでは?と思ったりもしています。
No.5
- 回答日時:
> このプラグラムも私が作ったものではないので漠然としか理解できていないと思います^^;
作った人に聞くのが筋だと思いますが。
こちらもPHPは素人ですが、DBへの問い合わせと更新を行っているようですね。
それぞれ、正常になされているのか、確認できますか?
> //メール解析用インスタンス
> $structure = Mail_mimeDecode::decode($params);
ここも怪しいかもしれません。このソースではデコード処理対応が適切にされているか、でこの後の処理が変わってくると思います。
これの戻りに対して、正常かどうかの判定がありませんので、ガラケーだけ、というのも関連しているかもしれません。
あとは、一般的な方法として、デバッグ文などを入れてみて、どこまで処理がいっているか確認するしか無いでしょう。
----
ソースをすべて乗っけても、デバック出来るわけではありませんので、悪しからず。
ありがとうございます。
作った人、に尋ねられたら一番いいのですが、作った人は既に辞めてしまっているので尋ねることができません;
>DBへの問い合わせと更新を行っているようですね。
>それぞれ、正常になされているのか、確認できますか?
これに関しては、DBそのものはワンタイムが書き直されてメールで送られてくるものと一致しているので大丈夫だと思います。
教えていただいた部分を重点的に一つずつ確かめてみます。
お時間をとらせてしまい申し訳ありませんでした。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Gmail 【お助け!】サーバーからのメール送信でGmailに送信されない問題について 1 2023/06/20 22:03
- その他(メールソフト・メールサービス) メールが送信できない 発信側でできる対策 3 2023/05/11 10:22
- Outlook(アウトルック) OCN WEBメールについて 1 2022/05/18 23:33
- WordPress(ワードプレス) Contact Form7?でお問い合わせを送信できません 2 2023/02/02 13:24
- ガラケー・PHS SMSメールの受信遅延原因はガラケー自体の欠陥では 8 2022/08/06 11:46
- Outlook(アウトルック) outlookの送信エラーについて 1 2022/05/13 12:04
- ガラケー・PHS 私はiPhoneで、相手はガラケーなんっすが、ショートメールの返事が来ません。 前の会社の時代に一緒 1 2022/06/27 20:15
- Gmail OCNメールでGmail使用者にメール受信してもらう方法 5 2023/08/22 12:21
- 求人情報・採用情報 タウンワークで数日前に求人にWeb応募し、今日メールで返信が来ていたのですが、面接日時が12月26日 1 2022/12/30 22:27
- その他(メールソフト・メールサービス) Thunderbird メール受信 できない時にエラーが欲しい 1 2023/05/26 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ワードプレスサイト PHP8.0.25...
-
パースエラーとは?
-
phpでクラスのメソッドで同名の...
-
phpでPEAR::DBを使っているので...
-
ローカルでは正常に動くのにサ...
-
PHPのHttpRequestモジュールに...
-
fgetcsv_regについてのご質問
-
フォントの色を変えるには?
-
preg_replace() で、 urlencode()
-
centOSにcakePHPを入れた際のエ...
-
awsにApacheとPHPを入れて、何...
-
php pear mdb2に質問です。
-
phpの imap_search で漢字コード
-
onedrive にexcelファイルをア...
-
こちらはただの直列処理ですか?
-
ワードプレス、Contact Form 7...
-
拡張子php画像をjpg画像等に変...
-
PHPとCSVで簡易データベースな...
-
include先でのinclude元の変数...
-
リダイレクト元のURLの取得方法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォントの色を変えるには?
-
PHP8を使うと、大量のWarningが...
-
awsにApacheとPHPを入れて、何...
-
phpでPEAR::DBを使っているので...
-
ワードプレスサイト PHP8.0.25...
-
パースエラーとは?
-
phpでクラスのメソッドで同名の...
-
PHPで、エラーがない場合のみ画...
-
トランザクションが原因?DBに...
-
「@$変数」の「@の意味は?」
-
PHPでfatal errorが出ても無視...
-
PHPで特定のURLにジャンプす...
-
正規表現での最後尾のバックス...
-
PHPでネットワークドライブのop...
-
bindValueエラー
-
error_reporting(0);にも関わら...
-
これは例外処理でしょうか?
-
ある条件に当てはまったときに...
-
php5.6でsimplexml_load_string...
-
PHPでSMTPを使ってメール送信で...
おすすめ情報