web-dev-qa-db-ja.com

pythonからsendmail経由でメールを送信する

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

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

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

Good Practiceの一環として、ヘッダーインジェクションの脆弱性自体をライブラリに処理してもらいたいと思っています。したがって、popen('/usr/bin/sendmail', 'w')に文字列をダンプすることは、私が望むよりも金属に少し近づいています。

答えが「ライブラリを書きに行く」のであれば、そうである;-)

70
Nate

これは、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" % "[email protected]")
    p.write("To: %s\n" % "[email protected]")
    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
34
Pieter

Jimの答えは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"] = "[email protected]"
msg["To"] = "[email protected]"
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
_
10
MEI

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

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

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

3
tovare

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

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

3
amcgregor