【最大10000ポイント】当たる!!質問投稿キャンペーン!

よろしくお願いいたします。

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);
?>

このQ&Aに関連する最新のQ&A

A 回答 (8件)

こんばんは。



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

ご回答ありがとうございます。

長い間アドバイス本当にありがとうございます。
以下のコードで、無事に空メールを送信した自分に
返信が正常に届きました。

ご親切なアドバイスがなければ、ここまでたどり着く
ことができませんでした。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));
}






?>

お礼日時:2010/12/05 22:26

こんにちは。



>それでも動作していないので、
うーん・・・。
/etc/aliasesを編集した後、更新かけてますよね?
それでだめならpostfixをリロードしてみるとか・・・。

>いろいろ、調べてみましたが、etc/aliasesに
>touroku: "| /usr/bin/php /var/www/vhosts/url**.com/httpdocs/regist/simp.php"
>のように、書くだけで動作するようですので
phpのパスは、あくまでもサーバーに合わせてください。
本当に/usr/bin/phpで合ってますか?

それでも動かない場合は・・・、ちょっとわかりません・・・。
    • good
    • 0
この回答へのお礼

ご回答本当に、ありがとうございます。
お礼が遅れて申し訳ありません。

アドバイスいただいた事項を参考に試行錯誤しておりました。

やっと、空メールに対してスクリプトが動作するようになりました。
行ったことを参考とて記させていただきます。
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);
の答えですが、これで標準入力を受けているということで
よろしいでしょうか。

お礼日時:2010/12/05 17:33

こんにちは。



>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"
とか・・・。
    • good
    • 0
この回答へのお礼

ご返答、アドバイス本当にありがとうございます。
アドバイスいただいたようにして実験してみました。
それでも動作していないので、下記のように標準入力を
コメントアウトしてみました。
この状態でも、動作しませんでした。
ちなみに、ブラウザから
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);
?>

お礼日時:2010/12/04 00:09

こんにちは。



そもそも、postfixからどのようにキックしてるんですか?
多分そこの書き方がおかしいので、標準入力に渡ってきてないような・・・?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
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としなければいけない
のでしょうか。

アドバイスよろしくお願いいたします。

お礼日時:2010/12/03 00:09

こんにちは。



>標準入力に(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に渡しているところが問題のような気がしますが・・・?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
ご呈示いただいた、コードを参考に

$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の内部設定でしょうか。

お礼日時:2010/11/30 15:15

こんばんは。



file_get_contents("php://stdin");
この使い方は正しいです。

$sss=file_get_contents("php://stdin");
そもそも、$sssに値が入ってないんじゃないですか?
file_get_contents("php://stdin");
があるから動かないんじゃなくて、値が入ってきていないから動かないのでは???
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/11/30 07:26

とりあえず、文脈が分かりづらいというのは俺も思いました。



一言で言うと、「$sss=file_get_contents("php://stdin"); 」の部分でコケてるっぽい。って事でしょうか?

この書き方は極めて一般的な書き方で、問題はないはずです。
実際、俺も これで動かしています。

このソースであるなら、本来 「if(!$source) {」 の部分は、「if(!$sss) {」と するべき所なんでしょうが、今回の問題とは関係ないようなので、置いておきます。

思いつきで書いてるので、アテにはなりませんが、file_get_contents() を file() に置き換えた場合、どうなるでしょう?

関数がダメでコケてるのか、標準入力から取ろうとしている事がダメでコケてるのか分かりませんが、エラーログリポート出してみては如何でしょうか?

この回答への補足

補足させて頂きます。

$sss=file_get_contents("php://stdin");

$sss = file('php://stdin');
に変更してみましたが
結果は同じでした。

よろしくお願いいたします。

補足日時:2010/11/29 18:58
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
$sss=file_get_contents("php://stdin");

$sss=fopen('php://stdin', 'r');
で試してみましたが、同じでした。
/var/log/httpd/error_logを
viでみましたが該当するログがありませんでした。
ほかにあるのでしょうか?

よろしくお願いいたします。

お礼日時:2010/11/29 17:38

こんにちは。



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

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

お礼日時:2010/11/29 14:51

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QPHPで空メールの自動返信を作りたい

携帯サイトを作製中なのですがユーザビリティを考え従来のフォーム形式ではなく
空メール形式で自動返信させようかと考えています。

空メールについて検索した所、多くの参考サイトが見つかりました。

ですがどれを試してみても旨く行かず困っております。

どなたか、「より詳しく書いてある参考サイト」もしくは、「特定の場所を書き換えるだけで実装できるサンプル」など
ありましたらご紹介頂ければと思います。

取り急ぎ以上ですが宜しくお願い致します。

Aベストアンサー

メールサーバは管理権限あるんですよね?
たとえば entry@domain.dom で自動返信したい場合は、
entryというユーザがあるなら /home/entry/.qmail ですが、
設定によって場所が変わります。で
| /usr/local/bin/php /var/www/anatano/entry_script.php
のように書いておくと、メールを受けた時に entry_script.php が実行されます。

Mail_mimeDecode はPEARなので、サーバの共有ライブラリ的な所に入れれるなら、CLから
# pear install mail_mimedecode
でインストールするか、自分のサイトディレクトリに設置するなら
define('PEAR_DIR', '/home/www/anatano/lib');
ini_set('include_path', ini_get('include_path' . PATH_SEPARATOR . PEAR_DIR));
みたいにして、include できるようにする必要があります。

あと Mail_mimeDecode の中で PEAR.php を読み込むのでそれも必要です。
/home/www/anatano/lib/PEAR.php
/home/www/anatano/lib/Mail/mimeDecode.php (?

http://pear.php.net/package/PEAR/download
http://pear.php.net/package/Mail_mimeDecode/download

で、WEBでアクセスしているわけではないので
開発するなら状況をログに書き出したりしないと不便かもしれませぬ。

メールサーバは管理権限あるんですよね?
たとえば entry@domain.dom で自動返信したい場合は、
entryというユーザがあるなら /home/entry/.qmail ですが、
設定によって場所が変わります。で
| /usr/local/bin/php /var/www/anatano/entry_script.php
のように書いておくと、メールを受けた時に entry_script.php が実行されます。

Mail_mimeDecode はPEARなので、サーバの共有ライブラリ的な所に入れれるなら、CLから
# pear install mail_mimedecode
でインストールするか、自分のサイトディレクトリ...続きを読む

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

お世話になります
下記スクリプトにてメールを受信して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...続きを読む

Aベストアンサー

>メールボックスを空にするためにの処理

メールを送るのはPEAR::Mailですが受け取るのはPEAR::Net_pop3ですね

http://pear.php.net/manual/ja/package.networking.net-pop3.php

deleteMsg() で削除ができます

QリダイレクトでPOST

教えてください。

リダイレクトの際、POSTで次のページにデータを渡すことは可能でしょうか?

GETだと
header("Location: "a.php?no=".$no);
と、問題なくできるのですが、
できれば、パラメータを隠したいと思います。

以上ですが、よろしくお願いします。

Aベストアンサー

多分できないです。
それに、結局クライアント側に情報を送信しているのだから、POSTにしたところでパラメータを隠した事にはならないですし。
本当に隠すならサーバ側でセッション情報を引き継ぐような形にしないとダメでしょう。

AJAXのかたちにして、ページ遷移を見えなくするというのが手っ取り早いかも。


人気Q&Aランキング