![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
よろしくお願いいたします。
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);
?>
A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
こんばんは。
>Object id #2
>が
>$structure = $decoder->decode($params);
>の答えですが、これで標準入力を受けているということで
>よろしいでしょうか。
うーん・・・、一応idが割り振られているので、存在はしていると思います。
$structureをくっつけるより、$structure->headers['from']とかって付けてみた方がいいかと・・・。
まぁ大丈夫だと思いますが、どっちみちこのままじゃぁ、返信はできないので。
ご回答ありがとうございます。
長い間アドバイス本当にありがとうございます。
以下のコードで、無事に空メールを送信した自分に
返信が正常に届きました。
ご親切なアドバイスがなければ、ここまでたどり着く
ことができませんでした。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で合ってますか?
それでも動かない場合は・・・、ちょっとわかりません・・・。
ご回答本当に、ありがとうございます。
お礼が遅れて申し訳ありません。
アドバイスいただいた事項を参考に試行錯誤しておりました。
やっと、空メールに対してスクリプトが動作するようになりました。
行ったことを参考とて記させていただきます。
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"
とか・・・。
ご返答、アドバイス本当にありがとうございます。
アドバイスいただいたようにして実験してみました。
それでも動作していないので、下記のように標準入力を
コメントアウトしてみました。
この状態でも、動作しませんでした。
ちなみに、ブラウザから
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からどのようにキックしてるんですか?
多分そこの書き方がおかしいので、標準入力に渡ってきてないような・・・?
ご回答ありがとうございます。
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に渡しているところが問題のような気がしますが・・・?
ご回答ありがとうございました。
ご呈示いただいた、コードを参考に
$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");
があるから動かないんじゃなくて、値が入ってきていないから動かないのでは???
ご回答ありがとうございます。
標準入力に(php://stdin)値があるかの
確認はできるのでしょうか。
空メールにはFromはあると思うのですが。
よろしくお願いいたします。
No.2
- 回答日時:
とりあえず、文脈が分かりづらいというのは俺も思いました。
一言で言うと、「$sss=file_get_contents("php://stdin"); 」の部分でコケてるっぽい。って事でしょうか?
この書き方は極めて一般的な書き方で、問題はないはずです。
実際、俺も これで動かしています。
このソースであるなら、本来 「if(!$source) {」 の部分は、「if(!$sss) {」と するべき所なんでしょうが、今回の問題とは関係ないようなので、置いておきます。
思いつきで書いてるので、アテにはなりませんが、file_get_contents() を file() に置き換えた場合、どうなるでしょう?
関数がダメでコケてるのか、標準入力から取ろうとしている事がダメでコケてるのか分かりませんが、エラーログリポート出してみては如何でしょうか?
この回答への補足
補足させて頂きます。
$sss=file_get_contents("php://stdin");
を
$sss = file('php://stdin');
に変更してみましたが
結果は同じでした。
よろしくお願いいたします。
ご返答ありがとうございます。
$sss=file_get_contents("php://stdin");
を
$sss=fopen('php://stdin', 'r');
で試してみましたが、同じでした。
/var/log/httpd/error_logを
viでみましたが該当するログがありませんでした。
ほかにあるのでしょうか?
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP php 完了画面の送信メールのコードを書いているのですが・・・ 2 2023/06/02 12:01
- Gmail 【お助け!】サーバーからのメール送信でGmailに送信されない問題について 1 2023/06/20 22:03
- 迷惑メール・スパム ヘルスケア テクノロジーズ 1 2023/02/13 08:23
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- その他(プログラミング・Web制作) python fbprophetについて 1 2022/09/29 19:44
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- その他(メールソフト・メールサービス) 大阪市プレミアム付き商品券のweb申し込みで楽天モバイルのEメールだと返信メールが届かない 2 2022/09/19 17:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP(.php)及びJavascrpit(.j...
-
phpのソースコードが、そのまま...
-
include先でのinclude元の変数...
-
パスワード等が記述されているp...
-
シェルスクリプトからphpファイ...
-
PHPから別なPHPへ移動(?)する方法
-
別ファイルの変数を呼び出した...
-
空メールからの標準入力が受け...
-
関数内の配列$list[0]~$list[2...
-
phpinfo.phpを開くとファイルの...
-
AJAXとPHPの全角文字の受け渡し
-
このたびpostgresql初めて使用...
-
他人にphpファイルをダウンロー...
-
フォントの色を変えるには?
-
onedrive にexcelファイルをア...
-
パースエラーとは?
-
PHPでネットワークドライブのop...
-
CFileDialogの最初のディレクト...
-
[php初心者]サイトを見てデータ...
-
PHP session_destroyとsession...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別ファイルの変数を呼び出した...
-
別PHPファイルに変数を渡す
-
シェルスクリプトからphpファイ...
-
include先でのinclude元の変数...
-
phpinfo.phpを開くとファイルの...
-
phpのソースコードが、そのまま...
-
Javascriptで解凍のコマンドは...
-
phpのプログラムエラー
-
codeigniterでcron実行したい
-
1行目の#! "C:\\xampp\\php\\p...
-
拡張子をphpではなくcgi...
-
Fatal errorについて教えてくだ...
-
CGIタイプのPHPとは・・・?
-
テンプレート化したphpのmenu.p...
-
FPDFでPDFファイルが表示されない
-
ローカルでは動くがサーバーで...
-
cronで外部ファイルへアクセス
-
PHP(.php)及びJavascrpit(.j...
-
このたびpostgresql初めて使用...
-
プログラミング初心者です 先程...
おすすめ情報