私は認証付きの単純なSMTP送信者を書いています。これが私のコードです
SMTPserver, sender, destination = 'smtp.googlemail.com', '[email protected]', ['[email protected]']
USERNAME, PASSWORD = "user", "password"
# typical values for text_subtype are plain, html, xml
text_subtype = 'plain'
content="""
Hello, world!
"""
subject="Message Subject"
from smtplib import SMTP_SSL as SMTP # this invokes the secure SMTP protocol (port 465, uses SSL)
# from smtplib import SMTP # use this for standard SMTP protocol (port 25, no encryption)
from email.MIMEText import MIMEText
try:
msg = MIMEText(content, text_subtype)
msg['Subject']= subject
msg['From'] = sender # some SMTP servers will do this automatically, not all
conn = SMTP(SMTPserver)
conn.set_debuglevel(False)
conn.login(USERNAME, PASSWORD)
try:
conn.sendmail(sender, destination, msg.as_string())
finally:
conn.close()
except Exception, exc:
sys.exit( "mail failed; %s" % str(exc) ) # give a error message
非アスキー記号(ロシア語のキリル文字)を送信しようとするまでは、完璧に機能します。メッセージに文字セットを定義して、適切な方法で表示するにはどうすればよいですか?前もって感謝します!
UPD。コードを変更しました:
text_subtype = 'text'
content="<p>Текст письма</p>"
msg = MIMEText(content, text_subtype)
msg['From']=sender # some SMTP servers will do this automatically, not all
msg['MIME-Version']="1.0"
msg['Subject']="=?UTF-8?Q?Тема письма?="
msg['Content-Type'] = "text/html; charset=utf-8"
msg['Content-Transfer-Encoding'] = "quoted-printable"
…
conn.sendmail(sender, destination, str(msg))
したがって、最初にtext_subtype = 'text'を指定し、次にヘッダーにmsg ['Content-Type'] = "text/html; charset = utf-8"文字列を配置します。それが正しいか?
[〜#〜] update [〜#〜]最後に、メッセージの問題を解決しましたmsg = MIMEText(content.encode( 'utf-8')、 'plain' 、 'UTF-8')
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
def contains_non_ascii_characters(str):
return not all(ord(c) < 128 for c in str)
def add_header(message, header_name, header_value):
if contains_non_ascii_characters(header_value):
h = Header(header_value, 'utf-8')
message[header_name] = h
else:
message[header_name] = header_value
return message
............
msg = MIMEMultipart('alternative')
msg = add_header(msg, 'Subject', subject)
if contains_non_ascii_characters(html):
html_text = MIMEText(html.encode('utf-8'), 'html','utf-8')
else:
html_text = MIMEText(html, 'html')
if(contains_non_ascii_characters(plain)):
plain_text = MIMEText(plain.encode('utf-8'),'plain','utf-8')
else:
plain_text = MIMEText(plain,'plain')
msg.attach(plain_text)
msg.attach(html_text)
これにより、テキストに非ASCII文字が含まれているかどうかに関係なく、テキストとヘッダーの両方に適切なエンコーディングが提供されます。また、base64エンコーディングを不必要に自動的に使用しないことも意味します。
メッセージテキストをUTF-8でエンコードする必要があります
msg = MIMEText(content.encode('utf-8'), text_subtype).
詳細はこちら: http://radix.twistedmatrix.com/2010/07/how-to-send-good-unicode-email-with.html
さまざまな文字セットを送信するには、SMTPヘッダーを使用する必要がある場合があります。これを追加してみてください-
msg['Content-Type'] = "text/html; charset=us-ascii"
(必要に応じて文字セットを変更します)