2012-04-24 35 views
12

Tôi đang viết một người gửi smtp đơn giản với xác thực. Đây là mã của tôiCách đặt bộ ký tự trong email bằng cách sử dụng smtplib trong Python 2.7?

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 

Nó hoạt động hoàn hảo, cho đến khi tôi cố gắng gửi các ký hiệu không phải ascii (cyrillic Nga). Làm thế nào tôi nên xác định một bảng mã trong một tin nhắn để làm cho nó hiển thị một cách thích hợp? Cảm ơn trước!

UPD. Tôi đã thay đổi mã của tôi:

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)) 

Vì vậy, lần đầu tiên tôi spectify 'text' text_subtype =, và sau đó trong tiêu đề tôi đặt một msg [ 'Content-Type'] = "text/html; charset = utf -8 "chuỗi. Nó có đúng không?

CẬP NHẬT Cuối cùng, tôi đã giải quyết vấn đề thông điệp của tôi Bạn nên viết smth như msg = MIMEText (content.encode ('utf-8'), 'đơn giản', 'UTF-8')

Trả lời

19
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) 

này sẽ cho bạn mã hóa thích hợp cho cả văn bản và tiêu đề cho dù văn bản của bạn chứa phi ASCII nhân vật hay không. Nó cũng có nghĩa là bạn sẽ không tự động sử dụng mã hóa base64 không cần thiết.

+0

Xin chào Lorcan! Làm thế nào về 'To' và 'From' nếu tôi sẽ chỉ định chúng trong msg của tôi (như msg ['From'] = '[email protected]')? Tôi nên mã hóa nó quá hay không? –

1

bạn có thể phải sử dụng tiêu đề SMTP để đạt được gửi bảng mã khác nhau, hãy thử thêm này -

msg['Content-Type'] = "text/html; charset=us-ascii"

(Thay đổi charset theo nhu cầu của bạn)

+0

Vâng, điều đó đã hiệu quả đối với tôi - chủ đề được hiển thị một cách thích hợp, mặc dù mã hóa văn bản tin nhắn vẫn không đáng lo ngại. – f1nn

+0

Tôi đã cập nhật bài đăng của mình. Xin vui lòng, bạn có thể xem một cái mới – f1nn

Các vấn đề liên quan