2

カスタムメール転送を行おうとしています。#1qmailとオプションでprocmailを使用している共有サーバーを使用しています。

私が達成しようとしているのは、スケジュールに基づいた1つのアドレスのカスタム電子メール転送です。たとえば、各平日に作業する従業員のスケジュールがあり、今日作業しているランダムな従業員の電子メールアドレスを選択するphpスクリプトがあります。

だから私はprocmailでそのスクリプトを呼び出して、結果(単一の電子メールアドレス)を転送行に出力しようとしています:

例:

#Something
LOGFILE=/usr/home/myname/procmail-log
VERBOSE=yes
EXITCODE=99
MAILDIR=/usr/boxes/myname
DEFAULT=/usr/boxes/myname/mybox
SHELL=/bin/sh
MYVAR=$(php -q /usr/home/myname/testemail/emailtester.php)

:0
! $MYVAR

これは機能していません。まったく。私も試しました:

MYVAR=`php /usr/home/myname/testemail/emailtester.php`

フォワードラインにパイプするだけでなく、次のようになります。

:0
! |php /usr/home/myname/testemail/emailtester.php

私はここで私の要素から完全に外れています...私はprocmailさえ使用しないように試みました、そして私はちょうどqmailからphpスクリプトに電子メール全体をパイプしました。通常の転送のようにヘッダーをそのままにしておく必要がありますが、これはPHPでは困難であり、私の範囲を少し超えています(無限の電子メールループを作成することができました)。

私はこれをperlでスクリプト化することを試みることができましたが、これは私が使用したことはありませんが、Webインターフェイスから、または少なくともユーザーフレンドリーな方法で管理できるスケジュールが必要です。

この時点で、助けや提案をいただければ幸いです。

編集:

コメントにコードを入れることができないので、ここで編集します。

これをログに記録します。

Folder: /usr/local/bin/php /usr/home/idnani/testemail/emailtester.ph     1679
"rocmail: Executing "/usr/local/bin/php,/usr/home/idnani/testemail/emailtester.php
Could not open input file: /usr/home/idnani/testemail/emailtester.php

:0fwで使用すると、次のようになります。

"rocmail: Executing "/usr/local/bin/php,/usr/home/idnani/testemail/emailtester.php
Could not open input file: /usr/home/idnani/testemail/emailtester.php
procmail: [69907] Thu Jun 16 14:04:17 2011
procmail: Program failure (1) of "/usr/local/bin/php"
procmail: Rescue of unfiltered data succeeded

編集:それを理解しました!

多くの試行錯誤の末、正しい方法を見つけました。

パイプをまったく使用しないでください。必要です。前方記号:

最終規則:

:0
! `/usr/local/bin/php -f $HOME/emailtest/emailtester.php`

とても単純です...私は少し怒っていますこれを理解するのに何時間もかかりました、私を正しい方向に向けるのを手伝ってくれたみんなに感謝します!

4

3 に答える 3

4

あなたはとても近かった...あなたは前方なしでそれをパイプする必要があります:!

:0
|/usr/bin/php /usr/home/myname/testemail/emailtester.php

編集$PATHprocmailが不完全な場合に備えて、PHPへのフルパスを入力しました。実際のphpパスに変更してください。

于 2011-06-16T17:45:06.970 に答える
2

電子メールのループを避けるために、私は次のようなことをしました:

PATH=/usr/local/bin:/bin:/usr/bin
MAILDIR=$HOME/Mail
DEFAULT=$HOME/Mail/inbox
LOGFILE=$HOME/procmail.`date +%Y-%m`.log
SHELL=/usr/bin/ksh

MY_XLOOP='X-Loop: emailtester.php'

:0
* ! ^$MY_XLOOP
{
    # add a header
    # 'f' = filter: continue processing results of program
    # 'w' = wait for program to return
    # 'h' = pass message headers to program
    :0fwh
    | formail -A "$MY_XLOOP"

    # then forward the message
    # 'c' = send a copy to recipient and continue processing
    :0c
    | php /usr/home/myname/testemail/emailtester.php
}

# if we get here, then the message has an X-Loop header.
# let it fall into $DEFAULT
于 2011-06-16T18:37:44.777 に答える
2

多くの試行錯誤の末、正しい方法を見つけました。

パイプをまったく使用しないでください。必要です。前方記号:

このルールは、phpスクリプトに単一の電子メールを要求し、その電子メールに転送するだけです。最終規則:

:0
! `/usr/local/bin/php -f $HOME/emailtest/emailtester.php`

とても単純です...私は少し怒っていますこれを理解するのに何時間もかかりました、私を正しい方向に向けるのを手伝ってくれたみんなに感謝します!

マイケルの答えはうまくいくはずですが、別の状況でもうまくいくのでしょうか?うまくいかなかったので、自分で答えています。

新しい編集:

注:STDINを介してphpでメール全体を取得することはできます

注:最初の行のスクリプト自体に/ usr / local / bin/phpを次のように配置できます。

#!/usr/local/bin/php
于 2011-06-28T16:07:01.027 に答える