81

SMTP ではなく sendmail 経由でメールを送信したい場合、このプロセスをカプセル化する Python 用のライブラリはありますか?

さらに良いことに、「sendmail -vs-smtp」の選択全体を抽象化する優れたライブラリはありますか?

このスクリプトを多数の UNIX ホストで実行しますが、そのうちの一部のみが localhost:25 でリッスンしています。これらのいくつかは組み込みシステムの一部であり、SMTP を受け入れるように設定することはできません。

グッド プラクティスの一環として、ヘッダー インジェクションの脆弱性自体をライブラリに処理してもらいpopen('/usr/bin/sendmail', 'w')たいと思っています。

答えが「ライブラリを書きに行く」である場合は、それで構いません;-)

4

8 に答える 8

129

ヘッダー インジェクションは、メールの送信方法の要因ではなく、メールの作成方法の要因です。電子メールパッケージを確認し、それを使用してメールを作成し、シリアル化し、サブプロセスモジュールを/usr/sbin/sendmail使用して送信します。

import sys
from email.mime.text import MIMEText
from subprocess import Popen, PIPE


msg = MIMEText("Here is the body of my message")
msg["From"] = "me@example.com"
msg["To"] = "you@example.com"
msg["Subject"] = "This is the subject."
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
# Both Python 2.X and 3.X
p.communicate(msg.as_bytes() if sys.version_info >= (3,0) else msg.as_string()) 

# Python 2.X
p.communicate(msg.as_string())

# Python 3.X
p.communicate(msg.as_bytes())
于 2008-09-16T16:12:37.547 に答える
37

これは、UNIX の sendmail を使用してメールを配信する単純な Python 関数です。

def sendMail():
    sendmail_location = "/usr/sbin/sendmail" # sendmail location
    p = os.popen("%s -t" % sendmail_location, "w")
    p.write("From: %s\n" % "from@somewhere.com")
    p.write("To: %s\n" % "to@somewhereelse.com")
    p.write("Subject: thesubject\n")
    p.write("\n") # blank line separating headers from body
    p.write("body of the mail")
    status = p.close()
    if status != 0:
           print "Sendmail exit status", status
于 2008-09-16T15:51:40.937 に答える
12

ジムの答えは、Python 3.4 ではうまくいきませんでした。universal_newlines=True追加の引数を追加する必要がありましたsubrocess.Popen()

from email.mime.text import MIMEText
from subprocess import Popen, PIPE

msg = MIMEText("Here is the body of my message")
msg["From"] = "me@example.com"
msg["To"] = "you@example.com"
msg["Subject"] = "This is the subject."
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE, universal_newlines=True)
p.communicate(msg.as_string())

universal_newlines=True私が得ることなく

TypeError: 'str' does not support the buffer interface
于 2015-09-19T21:38:31.163 に答える
5

この質問は非常に古いものですが、このメッセージが尋ねられる前から利用可能だったMarrow Mailer (以前の TurboMail)と呼ばれるメッセージ作成および電子メール配信システムがあることに注意することは価値があります。

現在、Python 3 をサポートするように移植されており、Marrowスイートの一部として更新されています。

于 2011-04-04T23:24:04.023 に答える
3

os.popen を使用して Python から sendmail コマンドを使用することは非常に一般的です。

個人的には、私が自分で書いていないスクリプトについては、SMTP プロトコルを使用する方が良いと思います。Windows で実行するために sendmail クローンなどをインストールする必要がないからです。

https://docs.python.org/library/smtplib.html

于 2008-09-16T15:49:06.027 に答える
-7

最も簡単な答えは smtplib です。ここでドキュメントを見つけることができます。

必要なことは、localhost からの接続を受け入れるようにローカルの sendmail を構成することだけです。これは、おそらくデフォルトで既に行われています。確かに、転送にはまだ SMTP を使用していますが、それはローカルの sendmail であり、コマンドライン ツールを使用する場合と基本的に同じです。

于 2008-09-16T15:49:21.953 に答える