電子メールを受信した後にスクリプトを実行する

電子メールを受信した後にスクリプトを実行する

私は個人的な目的でPostfix / Dovecotメールサーバーを運営しています。実際のメールボックスはほんの一握りで、基本的に[email protected]はと[email protected]

私はしばしばこのvirtualファイルを使用してに渡す仮想メールボックスを作成します[email protected]。オンラインショップでワンタイム購入をする場合、スパムの心配なくしてみたいオンラインゲームなど、ワンタイムアカウントが多いです。これを行うには、SSHを介して次のコマンドを実行します。

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # [email protected]      [email protected]
sudo postmap virtual
sudo service postfix restart

私はプロセスをある程度自動化したいので、これを頻繁に行います。単に、仮想メールボックスと実際のメールボックスをパラメータとして使用して、シェルスクリプトを作成して直接変更することを検討しましたが、それ以上を望んでいました。

[email protected]サーバー上の他のメールボックスから仮想メールボックス名をメッセージ本文として使用して、メッセージ本文に電子メールを送信できるようにしたいです。問題は通話中ですが、sudoこの問題を処理する責任を負う新しいユーザーを作成できます。このユーザーはこの問題を処理する必要があります。

主な質問は、電子メールでトリガーされるイベントをどのように生成しますか?これを実行できるサービスはどこにありますか?この電子メールを受信し、このイベントに対してコマンドを実行するようにPostfixまたはDovecotを設定できますか?

答え1

電子メールメッセージを受信した後、スクリプト(私はシェルスクリプトを使用)を実行する正しい手順は次のとおりです。それは修正を含むサフィックス構成ファイル、基本構成ファイル(私のDebianでは、次の場所にあります。/etc/サフィックス)次の行を追加して:

 my_shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/shell/script ${sender} ${size} ${recipient}

これを表しますサフィックス特定のイベントが発生したときにスクリプトを実行します(実行可能にする必要があります)。

スクリプトの実行時期を指定するには、次のようにします。[Eメール保護]メッセージを受信しました。次の行を配置します

 [email protected] FILTER my_shell_script:dummy

ファイル内部/etc/postfix/address.txt;適切なデータベースを作成する必要があります。サフィックスこのファイルを使用すると、次のことができます。

  postmap /etc/postfix/address.txt

出力として名前付きファイルを生成します。/etc/postfix/address.db。今再び/etc/postfix/main.cfファイルを作成し、次の行を追加します。

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination

今再起動サフィックス

  postfix reload

行ってもいいです。

答え2

私は2つの確実な解決策を見ることができます。

使用する場合MDAによるprocmailあなたのサーバーでまたはそれを使用するように変換したい場合は、|procmailの(パイプライン)レシピ操作を使用して、任意の電子メールに対して任意のスクリプトを実行できます。ルートで起動しないことを願っていますが、必要な魔法を実行するスクリプトを簡単に作成できる必要があり、関連するユーザーはパスワードなしでルートでスクリプトを呼び出すことができるはずです。スクリプトの出力は再度フィードバックされることがあります。同じレシピをフィルタ操作として設定し、後で電子メールと電子メールを送信します。

別のオプション(手動メンテナンスが不要)は次のとおりです。単一メールボックスの作成と Postfix の構成$recipient_delimiter.たとえば、通常はその目的には使用されません-。 receive_delimeter はサーバー全体の設定です。メールボックスを設定し[email protected]て設定したと仮定すると、そのローカルメールボックスに送信$recipient_delimeter = .できます。これらのいずれかを無効にするには、拒否アクションを使用して対応する受信者テーブルに追加します。欠点は、プレフィックスに対する包括的なメールボックスになるため、プレフィックスを偶然または事前攻撃として見つけるのが難しくすることです。良い点は、一般的な状況(発信者があなたの医者を尊重し、あなたの電子メールアドレスを再販しない)では、このアプローチはメンテナンスがまったく必要なく、いつでもプレフィックスを変更して進行方法を明確に説明できることです。です。メールを受け取ることです。dummy.<anything>@example.com[email protected]dummy.<whatever>@example.com

答え3

仮に備えて協会それはすべてです。要約は次のとおりです。

master.cfまず、次の行を追加して「myhook」スクリプトを登録します。

myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/script.sh ${sender} ${size} ${recipient}

さらに、SMTP転送を介して到着するすべてのメールに対してフィルタを実行するようにPostfixに指示するようにsmtp行を編集します。

smtp inet n - - - - smtpd -o content_filter=myhook:dummy

「sendmail」コマンドを使用してメールを送信すると、フィルタは実行されません。その場合は、「ピックアップ」配送方法の後にオプションを追加してください。

pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy

サフィックスの再起動:postfix reload

誰でもスクリプトを読んで実行できるようにします。chmod +rx script.sh

着信メールがある場合、スクリプトがトリガーされます。正確な住所を指定するには、@MariusMatutiaeの回答をご覧ください。

答え4

私はDovecotを設定することがPostfix設定に比べてよりエレガントなソリューションだと思います。次のように進んでください。

  1. ディレクトリ(たとえばmail_processor.py)にスクリプトを作成します/usr/lib/dovecot/sieve-execute/

    #!/usr/bin/python3
    from sys import stdin
    with open('/var/log/mail_processor.log', 'a') as logfile:
        for line in stdin:
            print(line.rstrip(), file=logfile)
    
    • スクリプトとターゲットファイルに正しい権限があることを確認してください。

      $ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py
      $ chmod 0777 /var/log/mail_processor.log
      
  2. プラグインの有効化sieve_extprograms:

    • 以下を使用して変更された\etc\dovecot\conf.d\90-sieve.confプラグインセクション:

      sieve_extensions = +vnd.dovecot.execute
      sieve_plugins = sieve_extprograms
      sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
      
    • 鳩を再ロードしてください:

      $ service dovecot restart
      
  3. シーブフィルタを作成します(例: Roundcube で goto settings-> filters-> actions-> edit filter set)。

    require ["vnd.dovecot.execute"];
    # rule:[mail processing]
    if true
    {
        execute :pipe "mail_processor.py";
    }
    

これで、シーブフィルタを使用して、このメールボックスに配信されたすべてのメッセージがパイプされますmail_processor.py

Pigeonhole Sieve: Extprograms プラグイン参照文書

関連情報