postfixで受け取ったメール内容をphpで解析し、mysqlでDBへ登録をする開発を進めています。


1.メールを受け取る

2.phpで解析実行。pearのmimedecodeを利用。
/var/aliasesで下記のphpを実行する
test: "| /usr/bin/php -f /var/www/html/app/mail/mail.php >> /tmp/mail_log.txt"

3.メールアドレスからサービスのメンバーIDなどにクエリをかけて特定作業をする
 mail.php内にrequireしているMDB2を利用

4.とってきたユーザー情報とメールの解析内容をでDB登録したい。

現在2までは開発が完了しているのですが、3でmysqlを利用してDBへアクセスすることができないでおります。

おそらくpostfixユーザーとしてDBにアクセスできていないからだと思うのですが原因が特定できておりません。

su postfix
でログインできるようにし、
bash-3.2$
とした状態でmysqlを利用しようとすると接続は可能なのですが。。。

利用しているファイルの権限はすべてchmod755としてあります。

少し調べたところ、postfixはmysqlに対応していない?ような文章をみかけましてやはりこのような対応をしないといけないのでしょうか?

ご知見のある方教えていただけますと幸いです。

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2011/12/06 16:50:05
  • 終了:2011/12/06 18:32:15

回答(1件)

id:kodairabase No.1

kodairabase回答回数661ベストアンサー獲得回数802011/12/06 17:09:10

>おそらくpostfixユーザーとしてDBにアクセスできていないからだと思うのですが原因が特定できておりません。

DSNの書き方が間違っているのではありませんか?
DSNでpostfixユーザーとしてログインする必要はありませんよ。

  • id:kuso47
    調べたサイト

    メールサーバ構築のまとめ(複数のバーチャルドメイン+Postfix+MySQL+Dovecot+procmail+Clam AntiVirus+spamassassin+postfixadmin)
    http://bit.ly/mRdTvG

    Postfix を MySQL とメールクォータに対応させてビルドする
    http://bit.ly/t6zfWt
  • id:tdoi
    前回の質問(http://q.hatena.ne.jp/1323004008)からは一歩進んだと思っていいですか?
    それだとすると、どう動かないかを書いてもらうか、ソースを出してもらわないと答えようがないです。

    前回の問題(MDB2の解決は問題なくなった)とすれば、postfixとかユーザの問題は関係ないです。
    MDB2.phpにアクセスするために、OSのユーザの権限は関係しますが、
    mysqlサーバに接続するのは、OSのユーザは関係しません。あくまで、mysqlのユーザ権限の問題になります。

    現状どのような位置にいるかもう少し詳しく情報をもらえますか?

  • id:kuso47
    お返事ありがとうございます。

    もしかしたらMDB2でDBへアクセスできているかも怪しいかもしれません。。。

    mail.phpでは
    require_once("/usr/share/pear/Mail/mimeDecode.php");
    require_once("/usr/share/pear/MDB2.php");
    require_once("/var/www/html/app/macros/db_connect.php");
    という形にしてありまして、ここまでは多分問題がないと思います。
    多分というのが少しあやしく、
    php内で処理ができれば、送信者のテキストを入れたまま返信するよう組んであるのですが、そこまでは返ってくるようになっています。

    ただ、試しに
    $sql = "select * from xxx";
    $result =& $mdb2->query($sql);
    $row = $result->fetchRow();
    と適当なsqlを入れるとメールが返ってこなくなります。。。

    ですので、MDB2でのアクセスまではできているかなと思ったのですが。。。

    db_connect.phpは
    $dsn = 'mysql://root:pass@アドレス/DB名';

    // 第2パラメータのオプションは指定せず(デフォルト)
    $mdb2 =& MDB2::connect( $dsn, array() );
    if( PEAR :: isError( $mdb2 ) ){
    $error = die($mdb2->getMessage());
    }
    のみ書いてあります。
  • id:JULY
    /etc/aliases の行を、

    test: "| /usr/bin/php -f /var/www/html/app/mail/mail.php >> /tmp/mail_log.txt 2>/tmp/test_error"

    とすると、/tmp/test_error に php が標準エラーに出力した内容が保存されるはずです。その内容から何か分かる可能性はあります。

    postfix のユーザ権限云々に関しては、kodairabase さんや tdoi さんの言うとおり、本質的な問題では無いと思います。
  • id:kuso47
    ありがとうございます、さっそく入れてみたところ以下のエラーがでてきました。。

    PHP Notice: Undefined property: MDB2_BufferedResult_mysql::$ctype_primary in /var/www/html/app/mail/mail.php on line 41
    PHP Notice: Undefined property: MDB2_BufferedResult_mysql::$ctype_primary in /var/www/html/app/mail/mail.php on line 73
    PHP Notice: Undefined property: MDB2_BufferedResult_mysql::$ctype_primary in /var/www/html/app/mail/mail.php on line 78
    PHP Notice: Undefined property: MDB2_BufferedResult_mysql::$headers in /var/www/html/app/mail/mail.php on line 114
    PHP Notice: Undefined variable: send_subject in /var/www/html/app/mail/mail.php on line 122
    PHP Notice: Undefined variable: text in /var/www/html/app/mail/mail.php on line 122
    sendmail: fatal: No recipient addresses found in message header
  • id:tdoi
    可能性はいくつかありますが、まずは、手動でコマンド叩いて動作するようにするのが手っ取り早いかと。

    require_once("/var/www/html/app/macros/db_connect.php");
    $sql = "select * from xxx";
    $result =& $mdb2->query($sql);
    $row = $result->fetchRow();
    print_r ($row);

    のようなシンプルなスクリプトから原因を特定してはどうですか?
    手動でmysqlへの接続は確認されてるようですが、こういったことはしてないですよね?
  • id:kuso47
    お返事ありがとうございます。

    コマンドで
    rootユーザで
    php -q test.php
    とした際

    Array
    (
    [0] => 64
    [1] => てすと
    [2] => 2011-11-28 16:43:55
    )

    と返ってきます。

    ソースは

    <?
    require_once("/usr/share/pear/MDB2.php");
    require_once("/var/www/html/app/macros/db_connect.php");

    $sql = "select * from tag";
    $result =& $mdb2->query($sql);
    $row = $result->fetchRow();
    print_r ($row);

    ?>

    と単純にしておりました。

    su postfix
    bash-3.2$php -q test.php

    としても同様の結果を得ることができました。。
  • id:tdoi
    とすると、もうDBの問題ではないです。
    DBに接続できていないことを、メールがかえって来ないことを理由にしておられましたが、これがそもそもの間違いです。

    このエラーがメールがかえってこないことの理由です。

    sendmail: fatal: No recipient addresses found in message header

    想像でしかないですが、sqlの生成か何かでメールアドレスの変数を書き潰していたりしないですか?
  • id:tdoi
    あとは、メールから実行した際のバッファを適当なファイルにでも書き出しておけば、コマンドラインから

    php XXX.php < mail.txt

    のような感じでコマンドラインから実行してテストができるので、いろいろ試せると思います。
  • id:kuso47
    申し訳ないです。

    ご指摘の通り、sqlの生成で$resultを利用していまして、これがメール解析の$resultをつぶしていました。。。

    sqlの変数を変更したところ正常にアクセスすることができました。

    初歩的なミスでお時間頂いてしまいすいません。。。

    ご返答内容はかなり勉強になりましたので忘れないようメモして保管しておきます。

    ありがとうございました。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません