2008-09-16 19 views
58

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

「sendmail -versus-smtp」全体の選択肢を抽象化する良いライブラリがありますか?

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

グッドプラクティスの一環として、ライブラリにヘッダーインジェクションの脆弱性を配慮させたいと思っています。文字列をpopen('/usr/bin/sendmail', 'w')にダンプするだけで、私は望むよりも金属に少し近づいています。

答えがある場合は「図書館を書く行く、」それは;-)

答えて

97

ヘッダーインジェクションは、メールの送信方法の要素ではなく、メールの作成方法の要素です。 emailパッケージをチェックし、それとのメールを構築し、それをシリアル化し、subprocessモジュールを使用して/usr/sbin/sendmailに送信:

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) 
p.communicate(msg.as_string()) 
+0

パーフェクト。私の概念上の問題は、電子メールの作成と送信を分離することでした。ありがとう! – Nate

+3

良い、それは答えの5年後、今日私を助けました:) – Peter

+10

また、 '-oi'パラメータをsendmailに使うべきです。これはあなたのメッセージの単一の '.'を電子メールを途中で終了させないようにします。 –

3

もそれはちょうど私がdidnのスクリプトのために、個人的にos.popen

を使ってPythonからsendmailコマンドを使用することは非常に一般的です自分自身を書くつもりはない、私はSMTPプロトコルを使用するほうが良いと思う。なぜなら、Windows上でsendmailクローンを実行するようにインストールする必要がないからだ。

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

+0

SMTPが[DMA](HTTPSのようなものを使用して〜nixのボックスに動作しません取得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引数を追加する必要がありました。 COM/corecode/DMA)、sendmailのを提供していますが、ポート25でリッスンしません... –

-6

最も簡単な答えは、あなたがそれhere上のドキュメントを見つけることができる、したりするsmtplibです。

ローカルのsendmailがlocalhostからの接続を受け入れるように設定するだけで済みます。これはおそらく既定で既に行われています。もちろん、転送にはまだSMTPを使用していますが、ローカルのsendmailです(コマンドラインツールと基本的に同じです)。

+7

質問は言う、「私がいないSMTP経由ではなく、sendmailを経由してメールを送信したい場合は...」 – S19N

+1

プログラムでは、ケースに遅れることになりますSMTPサーバーへの接続や遅延はありません。 sendmailを使用すると、MTAにメッセージを渡すと、プログラムは続行されます。 –

30

これは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 
+0

本当に素敵なPythonの機能! – aphex

+0

+1 - 私が探しているもの! –

+0

優秀な、簡単な例+1 –

3

この質問は非常に古いですが、それは、メッセージの構築とEがあることに注意することは価値がありますこのメッセージが表示される前から利用可能だったMarrow Mailer(以前のTurboMail)というメール配信システムを使用していました。

これは、Python 3をサポートするように移植され、Marrowスイートの一部としてアップデートされました。

+0

turboMailリンクは一切行くではありません、一年後 – TankorSmash

+2

それは今marrow.mailerと呼ばれています' .as_bytesを使用する必要があります。 https://github.com/marrow/marrow.mailer – amcgregor

+0

+1骨髄メーラー。私はそれを試してみました。そしてsmpt、sendmailなどを通してメールを送るのがとても簡単になりました。また、非常に良い検証を提供します。 Marrow Mailerは "sendmail -versus-smtpの選択肢全体を抽象化する良いライブラリ"なので、これは元の質問に最もよく答えると感じます。 – tjklemz

-3

私はちょうど同じことのために周りを検索し、Pythonのウェブサイト上で良い例がわかった。これはあなたがsendmailの/ mailxのを持っている必要があること

# Import smtplib for the actual sending function 
import smtplib 

# Import the email modules we'll need 
from email.mime.text import MIMEText 

# Open a plain text file for reading. For this example, assume that 
# the text file contains only ASCII characters. 
fp = open(textfile, 'rb') 
# Create a text/plain message 
msg = MIMEText(fp.read()) 
fp.close() 

# me == the sender's email address 
# you == the recipient's email address 
msg['Subject'] = 'The contents of %s' % textfile 
msg['From'] = me 
msg['To'] = you 

# Send the message via our own SMTP server, but don't include the 
# envelope header. 
s = smtplib.SMTP('localhost') 
s.sendmail(me, [you], msg.as_string()) 
s.quit() 

注:http://docs.python.org/2/library/email-examples.html

サイトからの言及を"localhost"で接続を受け付けるように正しく設定してください。これは私のMac、Ubuntu、Redhatのサーバではデフォルトで動作しますが、問題が発生した場合は再度確認してください。

+0

これはまだSMTPプロトコル経由で 'localhost'を使用しています。また、一部のユーザーはポート21を開こうとしません。ローカルホストだけではありません。 – mbirth

6

ジムの答えはPython 3.4ではうまくいきませんでした。// githubの:私は

TypeError: 'str' does not support the buffer interface 
関連する問題