1

ちょっとしたサイドプロジェクトのウェブアプリに取り組んでいます...

ユーザーが特定のアカウントに電子メールを送信すると、電子メールを読み取り、重要な情報を引き出してデータベースに書き込む PHP スクリプトを開始できるように設定したいと考えています。

これを行う最善の方法は何ですか?新しい電子メールをチェックするcronジョブ?

このアプリは MediaTemple の「Dedicated-Virtual」サーバーで実行されているため、適切なレベルの制御が可能であり、さまざまなオプションが提供されるはずです。

私はロープ(PHP、MySQL、サーバーの構成/管理)を非常にゆっくりと学んでいるので、あなたのアドバイスと洞察は大歓迎です.

乾杯、マット・ステューラー

4

5 に答える 5

4

Procmail は私のやり方です。これは、電子メール内のテキストを実際に処理して、MySQL データベースにアーカイブする例です。

:0:  
* ^(From).*test@example.com
{   
  :0 c
  | php /var/www/app/process_email.php

}
于 2008-08-29T03:46:01.983 に答える
1

私は最近、この必要があるプロジェクトに取り組みました。メール アカウントのホーム ディレクトリで .forward ファイルを使用すると、大きな成功を収めました。たとえば、アドレス foo@bar.com に対してこれを実行しようとしており、使用しているサーバーが bar.com のメール サーバーであるとします。最初に、このアカウントの .forward ファイルを作成する必要があります。私が取り組んだサーバーでは、これは次のようになります。

/home/email/foo@bar.com/.forward

そのファイルの内容は次のとおりです。

"|/path/to/script.php"

また、.forward ファイルの所有者は foo@bar.com であり、600 に chmod されました (読み取り/書き込みは所有者のみ)。

次に、メールをパイプするスクリプト (上記の /path/to/script.php) をセットアップする必要があります。最初に、そのスクリプトは実行可能 (+x) である必要があります。残りは単純に STDIN を読み取り、必要に応じて処理します。メッセージ全体を読み取り、変数 $email に保存するサンプル スクリプトを次に示します。

#!/usr/local/bin/php
<?php
$fd = fopen("php://stdin","r");
$email = '';
while($feof($fd)){
    $email .= fread($fd, 1024);
}
fclose($fd);
?>

うまくいけば、それはあなたの助けになりました。

于 2009-04-30T00:38:09.220 に答える
1

.forwards または同様の構成可能な配信オプション (qmail、postfix、および sendmail はすべて) を許可するように構成可能なメール転送エージェントを制御できる場合は、スクリプトを .forward、.procmailrc、またはその他に設定するだけです。同様のプログラム可能な配信メカニズム。これを行うとき、アドレスにたまたま出くわした他の人ができるようにしたくない場合は、メールでいくつかの深刻な入力検証を行う必要があります (送信者があなたが期待していた人であること、受信した行が一致していること、データが正常であることを確認してください)。あなたのシステムをいじくり回します。

また、悪意のあるデータからの sql インジェクションなどを回避するために、php が使用する入力サニタイザーを使用することもできます。私たちは皆、小さなボビーテーブルの教訓を振り返ることができます:

xkcd.com/327/

于 2008-08-28T21:49:55.570 に答える
0

Cronjob は、このようなタスクに対する一般的なソリューションです。PHP で新しいメールをチェックするのは問題ありません。qmail サーバーを実行している場合 (他のサーバーでも実行できるのではないでしょうか?) 、「受信したメール」ごとにスクリプトを起動して、php スクリプトをトリガーすることができます。

于 2008-08-28T21:45:52.473 に答える
0

.forwardファイルを使用できます。

パイプ記号の後に、PHP スクリプトのフル パスをファイルに配置するだけです。

|/full/path/to/script.php
于 2008-08-28T21:53:14.360 に答える