2009-04-30 6 views
3

私はPythonで新しいです。 実際には、私はpythonで特集された電子メールを送信しようとしています:html本文、テキスト代替本文、および添付ファイル。phpMailer phpクラスはPythonと同じですか?

だから、私はこのtutorialを見つけ、Gmailの認証(チュートリアルがhereを見つけた)

私は気圧持っているコードでそれを適応してきた、それは次のようになります。

def createhtmlmail (html, text, subject): 
"""Create a mime-message that will render HTML in popular 
    MUAs, text in better ones""" 
import MimeWriter 
import mimetools 
import cStringIO 
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEBase import MIMEBase 
from email.MIMEText import MIMEText 
from email.Utils import COMMASPACE, formatdate 
from email import Encoders 
import os 

out = cStringIO.StringIO() # output buffer for our message 
htmlin = cStringIO.StringIO(html) 
txtin = cStringIO.StringIO(text) 

writer = MimeWriter.MimeWriter(out) 
# 
# set up some basic headers... we put subject here 
# because smtplib.sendmail expects it to be in the 
# message body 
# 
writer.addheader("Subject", subject) 
writer.addheader("MIME-Version", "1.0") 
# 
# start the multipart section of the message 
# multipart/alternative seems to work better 
# on some MUAs than multipart/mixed 
# 
writer.startmultipartbody("alternative") 
writer.flushheaders() 
# 
# the plain text section 
# 
subpart = writer.nextpart() 
subpart.addheader("Content-Transfer-Encoding", "quoted-printable") 
pout = subpart.startbody("text/plain", [("charset", 'us-ascii')]) 
mimetools.encode(txtin, pout, 'quoted-printable') 
txtin.close() 
# 
# start the html subpart of the message 
# 
subpart = writer.nextpart() 
subpart.addheader("Content-Transfer-Encoding", "quoted-printable") 
# 
# returns us a file-ish object we can write to 
# 
pout = subpart.startbody("text/html", [("charset", 'us-ascii')]) 
mimetools.encode(htmlin, pout, 'quoted-printable') 
htmlin.close() 


# 
# Now that we're done, close our writer and 
# return the message body 
# 
writer.lastpart() 
msg = out.getvalue() 
out.close() 
return msg 

import smtplib 
f = open("/path/to/html/version.html", 'r') 
html = f.read() 
f.close() 
f = open("/path/to/txt/version.txt", 'r') 
text = f.read() 
subject = "Prova email html da python, con allegato!" 
message = createhtmlmail(html, text, subject) 
gmail_user = "[email protected]" 
gmail_pwd = "thegmailpassword" 
server = smtplib.SMTP("smtp.gmail.com", 587) 
server.ehlo() 
server.starttls() 
server.ehlo() 
server.login(gmail_user, gmail_pwd) 
server.sendmail(gmail_user, "[email protected]", message) 
server.close() 

、それが動作します..今 そして添付ファイルを追加できません(this投稿から)

なぜ、phpMailer for PHPのようなpythonクラスがないのですか? 中規模のpythonプログラマーが添付ファイルとaltテキスト本文を持つhtml電子メールを送信するのはとても簡単なので、クラスは不要ですか? 私はそれを見つけられなかったからですか?

もし私がそのようなクラスを書くことができるのであれば、私は十分にPythonでうまくいくでしょう、それは誰かにとって有益でしょうか?

答えて

5

を、私は送信作ることmailer moduleを書きましたかなりシンプルなPythonのメール。 Python smtplibや電子メールライブラリ以外の依存関係はありません。ここで

は、添付ファイル付きの電子メールを送信するための簡単な例です:

from mailer import Mailer 
from mailer import Message 

message = Message(From="[email protected]", 
        To=["[email protected]", "[email protected]"]) 
message.Subject = "Kitty with dynamite" 
message.Body = """Kitty go boom!""" 
message.attach("kitty.jpg") 

sender = Mailer('smtp.example.com') 
sender.login("username", "password") 
sender.send(message) 

編集:ここでは代替テキストをHTML形式の電子メールを送信する例を示します。 :)

from mailer import Mailer 
from mailer import Message 

message = Message(From="[email protected]", 
        To="[email protected]", 
        charset="utf-8") 
message.Subject = "An HTML Email" 
message.Html = """This email uses <strong>HTML</strong>!""" 
message.Body = """This is alternate text.""" 

sender = Mailer('smtp.example.com') 
sender.send(message) 

編集2:コメントのおかげで、私はあなたのメーラークラスでポートを指定することができますは、PyPIにメーラの新しいバージョンを追加しました。

+0

add in exampleあなたは勝者を持っています! – YHVH

+0

うわー、それは素晴らしいです! あなたのモジュールはGmailのSMTP経由でメール送信を許可していますか? どこでsmtpポートを指定する必要がありますか(smtplibでserver = smtplib.SMTP( "smtp.gmail.com"、587)など) – Strae

+0

@DaNiel: 非常に良い点、ありがとうございます。 Mailerクラス( 'sender = Mailer( 'localhost'、port = 587) ')でポートを指定できる更新版を追加しました http://pypi.python.org/pypi/mailer/0.4 –

0

私はSMTP rfcを読むことをお勧めします。 Googleの検索結果によると、これは簡単にインポートできるMimeMultipartクラスを使って行うことができます。 Pythonのドキュメンテーションサイトにはsome examplesがあります。

+0

はい、私は読んでいただければ幸いです。 電子メールクラスがまだ存在しないという質問はどうですか? Pythonプログラマーが「手続き型アプローチを使用する」とすれば、誰かにとってリットルの血液を吐き出したり、誰かにとって役に立ちそうな人はいないでしょうか? (私はちょうどああを推測して) – Strae

+0

これはあなたのためにこれを提供するDjangoのようなものを使用したいと思うかもしれません。 –

2

Djangoはあなたがコアに必要なクラス、私は私の設定でdocs here

from django.core.mail import EmailMultiAlternatives 

subject, from_email, to = 'hello', '[email protected]', '[email protected]' 
text_content = 'This is an important message.' 
html_content = '<p>This is an <strong>important</strong> message.</p>' 
msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) 
msg.attach_alternative(html_content, "text/html") 
msg.attach_file('/path/to/file.jpg') 
msg.send() 

含まれています。あなたには、いくつかの露骨な自己宣伝を言い訳することができた場合は

#GMAIL STUFF 
EMAIL_USE_TLS = True 
EMAIL_HOST = 'smtp.gmail.com' 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'password' 
EMAIL_PORT = 587 
+0

それは私が探していたものです!ありがとうございます。 最後のもの:django、obvisiulyをダウンロードしてインストールする必要があるクラスを使用する... Coldはdjangoフレームワークなしで実行されますが、クラスファイル(および自然なPythonモジュール)を実行するだけです) – Strae

1

たぶん、あなたはそれがより簡単で便利ですturbomail python-turbomail.org

で試すことができます:)

import turbomail 

# ... 

message = turbomail.Message("[email protected]", "[email protected]", subject) 
message.plain = "Hello world!" 

turbomail.enqueue(message) 
2

はちょうど私がとき、私を探していたものだったLamson Projectを指すようにしたいですこのスレッドを発見しました。もう少し調べて見つけました。それは:

Lamson's goal is to put an end to the hell that is "e-mail application development". Rather than stay stuck in the 1970s, Lamson adopts modern web application framework design and uses a proven scripting language (Python).

これはDjangoとうまく統合されています。しかし、電子メールベースのアプリケーションのために作られています。しかし、純粋な愛のように見えます。

+0

私は試してみましょう;) – Strae

関連する問題