EC2インスタンスで実行されているpostfixサーバーがあります。 SESを介してすべての電子メールを私の個人用メールボックスに転送したいと思います。
問題:AWSはAWSコンソールで確認されたFROMアドレスのみを許可し、この例のFROMアドレスはtwitter.comなどの任意のアドレスにすることができます。私のサーバーのIPをホワイトリストに追加し、「送信者に関係なく、この場所からのすべての電子メールを受け入れます」と言うことはできません(とにかく悪い考えです)。
そのため、確認されたアドレスに電子メールを転送する方法を見つける必要がありますが、元の送信者のアドレスを失うことはありません。
これを行う方法はありますか?
ベストアンサー1
チャットで説明した内容に基づいて、「送信者」アドレスを意図したとおりに変更し、元の宛先に出荷しますが、「返信」ヘッダーを追加するハッキングされたカスタムソリューションを提供します。
これは非常にハッキング的なアプローチですが、しなければならない実際にPostFixを介して行くべき場所にメッセージを送信する前に、意図したとおりにメッセージを操作してください。
まず、PostFixポートを変更する必要があります。。25
設定するPython SMTPハンドラがそのポートで機能するように、Postfix SMTPポートを別のポートに変更する必要があります。
編集する/etc/postfix/master.cf
。次の行を探します。
smtp inet n - y - - smtpd
この行をコメントアウトし、その下に次を使用します。
10025 inet n - y - - smtpd
これは、Postfixが標準のSMTPポートでリッスンしたくないことを示しています。この手順を完了したら、postfixサービスを再起動してください。
次に、Python SMTPハンドラ上記で言及しました。その後、着信メッセージを処理して操作し、システムのPostFixに戻します。もちろん、これはすべてのメールがローカルでもポート25に送信されると仮定します。
このコードは次にあります。GitHubのGISTこれは私がどこかで見つけた一般的なPython SMTPサーバーコードの例に基づいています(しかし、どこから来たのか覚えていません!)これに取り組んでいました。
コードもここにあります。気になる場合は、Python 3で書かれており、ターゲットPythonのバージョンとしてPython 3を使用して書かれています。
#!/usr/bin/env python3
# Libraries
import smtplib
import smtpd
import asyncore
import email
import sys
from datetime import datetime
print('Starting custom mail handling server...')
# We need to know where the SMTP server is heh.
SMTP_OUTBOUND = 'localhost'
# We also need to know what we want the "FROM" address to be
FROM_ADDR = "[email protected]"
DESTINATION_ADDRESS = "[email protected]"
#############
#############
# SMTP SERVER
#############
#############
# noinspection PyMissingTypeHints,PyBroadException
class AutoForwardHandlerSMTP(smtpd.SMTPServer):
def process_message(self, peer, mailfrom, rcpttos, data, **kwargs):
print('MESSAGE RECEIVED - [%s]' % datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
print('Receiving message from:', peer)
print('Message addressed from:', mailfrom)
print('Message addressed to :', rcpttos)
print('Message length :', len(data))
print(data)
# Flush the output buffered (handy with the nohup launch)
sys.stdout.flush()
# Analyze and extract data headers
msg = email.message_from_string(data)
orig_from = ''
try:
orig_from = msg['From']
msg['Reply-To'] = orig_from
# We have to use 'replace header' methods to overwrite existing headers.
msg.replace_header("From", FROM_ADDR)
except:
print("Error manipulating headers:", sys.exc_info()[0])
conn = smtplib.SMTP(SMTP_OUTBOUND, 10025)
conn.sendmail(FROM_ADDR, msg["To"], msg.as_string())
# Flush the output buffered (handy with the nohup launch)
print("\n\n")
sys.stdout.flush()
return
# Listen to port 25 ( 0.0.0.0 can be replaced by the ip of your server but that will work with 0.0.0.0 )
server = AutoForwardHandlerSMTP(('0.0.0.0', 25), None)
# Wait for incoming emails
asyncore.loop()
/opt/PythonAutoForwarderSMTP.py
または必要に応じて保存してください。まず、次のコマンドをrootとして実行して(ユーザープロンプトsudo
またはユーザープロンプトとしてroot
)期待どおりに機能していることを確認します。
python3 /opt/PythonAutoForwarderSMTP.py
実行を確認したら、サーバーを介して電子メールを送信します。これを選択して、メッセージが受信され処理されたことを示すスクリプトのログデータを提供する必要があります。その後、Postfixログにも接続が表示され、接続がPostfixの後にどこかにルーティングされていることがわかります。これらすべてが大丈夫に見え、電子メールを正しく処理しており、電子メールが終わる別の「送信者」アドレスに電子メールを表示している場合は、自動起動できるようになります。 (続行する前にCtrl+を押してPythonプロセスを閉じることができますC)。
起動時に起動したいと仮定して設定する必要があります。
としてroot
実行し、crontabcrontab -e
に以下を追加します。root
@reboot /usr/bin/python3 /opt/PythonAutoForwarderSMTP.py 2>&1 >> /var/log/PythonSMTP.log &
crontabファイルを保存します。サーバーを再起動したくない場合は、追加したコマンドライン(該当する@reboot
ものを除く)を実行してPython SMTPハンドラを実行してください。
実行するかどうかにかかわらず、cron
Pythonをロードするプロセスは最終的にバックグラウンドに分岐し、追加モード/var/log/PythonSMTP.log
ですべてのデータ出力(Pythonコンソールまたはその他のエラー)をログファイルに入れます。これにより、必要に応じてログを取得できます。
すべてが期待どおりに機能すると、Reply-Toヘッダーが正しく追加され、メッセージの「From」ヘッダーが期待どおりに調整されます。 メッセージが署名されている場合、これがSPFおよびDKIMチェックに対して正しく機能することを保証することはできませんが、Postfixを使用してメッセージを他の場所に転送する前にメッセージを適切に「前処理する」と言うことができます。
必須のセキュリティ問題と機能変更通知:
- 送信者DKIMの確認が失敗する可能性があります。署名付きメッセージが操作されるたびに、DKIM署名の確認は失敗します。これは、送信者のDKIM署名が破損している可能性があることを意味します。これは何か意味があります。可能署名の検証に失敗したため、スパムと見なされます。このスクリプトは「ただ動作する」ようにカスタマイズできますが、DKIM / SPFチェック用には作成しませんでした。
- このPython SMTPサーバーを実行する必要があります。
root
。これは、デフォルトではLinuxでスーパーユーザーでない限り、1024未満のポートにバインドできないために必要です。これがPostfixがデフォルトの「root」が所有するプロセスを持ち、実行がrootとして実行されない理由です。非常に長いサブプロセス(ポートバインディングのみ)。- ポート25のすべてのメールは最終的にこのPython SMTPサーバーを通過します。。 Postfixが外部から内部へのメールも処理する場合、Python SMTPサーバーはその場所に代わるものになります。これにはいくつかの欠点があるかもしれませんが、最終的に欲しいものを達成します。
- これは脆弱な解決策です。他のソリューションほど脆弱ではありませんが、Pythonプロセスが終了すると自動的には回復されないため、ケースバイケースでエラーを処理する必要があり、時にはエラーが発生した場合はPythonプロセスを再度有効にする必要があります。発生します。完全に消えます。
- 持つStartTLS または SSL/TLS ハンドラーはありません。。したがって、すべてがプレーンテキストです(安全ではありません!)。
いつものように、自分が何をしているのかわからない場合は、rootとして何も実行しないでください。この場合、私のようにセキュリティ中心で編集可能な人なら、スクリプトが何をしているのか、そしてrootとして実行するのかを自分で識別できるように、このコードを一般的なビューとして提供しました。 ITセキュリティの専門家はもちろん、システム管理者の皆さんも必ずお読みください。)