2011-05-06 16 views
29

कृपया utf8 ई-मेल कैसे भेजें?पायथन - यूटीएफ -8 ई-मेल कैसे भेजें?

import sys 
import smtplib 
import email 
import re 

from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 

def sendmail(firm, fromEmail, to, template, subject, date): 
    with open(template, encoding="utf-8") as template_file: 
     message = template_file.read() 

    message = re.sub(r"{{\s*firm\s*}}", firm, message) 
    message = re.sub(r"{{\s*date\s*}}", date, message) 
    message = re.sub(r"{{\s*from\s*}}", fromEmail, message) 
    message = re.sub(r"{{\s*to\s*}}", to, message) 
    message = re.sub(r"{{\s*subject\s*}}", subject, message) 

    msg = MIMEMultipart("alternative") 
    msg.set_charset("utf-8") 

    msg["Subject"] = subject 
    msg["From"] = fromEmail 
    msg["To"] = to 

    #Read from template 
    html = message[message.find("html:") + len("html:"):message.find("text:")].strip() 
    text = message[message.find("text:") + len("text:"):].strip() 

    part1 = MIMEText(html, "html") 
    part2 = MIMEText(text, "plain") 

    msg.attach(part1)  
    msg.attach(part2) 

    try: 
     server = smtplib.SMTP("10.0.0.5") 
     server.sendmail(fromEmail, [to], msg.as_string()) 
     return 0 
    except Exception as ex: 
     #log error 
     #return -1 
     #debug 
     raise ex 
    finally: 
     server.quit() 

if __name__ == "__main__": 
    #debug 
    sys.argv.append("Moje") 
    sys.argv.append("[email protected]") 
    sys.argv.append("[email protected]") 
    sys.argv.append("may2011.template") 
    sys.argv.append("This is subject") 
    sys.argv.append("This is date") 


    if len(sys.argv) != 7: 
     exit(-2) 

    firm = sys.argv[1] 
    fromEmail = sys.argv[2] 
    to = sys.argv[3] 
    template = sys.argv[4] 
    subject = sys.argv[5] 
    date = sys.argv[6] 

    exit(sendmail(firm, fromEmail, to, template, subject, date)) 

आउटपुट

> Traceback (most recent call last): 
> File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py", 
> line 69, in <module> 
>  exit(sendmail(firm, fromEmail, to, template, subject, date)) 
> 
> File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py", 
> line 45, in sendmail 
>  raise ex 
> 
> File "C:\Documents and Settings\Administrator\Plocha\Newsletter-build-desktop\sendmail.py", 
> line 39, in sendmail 
>  server.sendmail(fromEmail, [to], msg.as_string()) 
> 
> File "C:\Python32\lib\smtplib.py", 
> line 716, in sendmail 
>  msg = _fix_eols(msg).encode('ascii') UnicodeEncodeError: 'ascii' codec 
> 
> can't encode character '\u011b' in 
> position 385: ordinal not in 
> range(128) 
+1

हम याद कर रहे हैं लाइन नंबर तो हम त्रुटि की सटीक लाइन ढूँढ सकते हैं। – orlp

+0

त्रुटि शायद 'message.as_string() 'में है। आपको अधिक प्रदान करने की आवश्यकता है, या हम आपकी मदद करने में सक्षम नहीं होंगे। – blubb

+0

पूर्ण ट्रेसबैक कृपया –

उत्तर

63

आप बस अपनी MIMEText कॉल (यह 'us-ascii' डिफ़ॉल्ट रूप से मान लिया गया है) करने के लिए 'utf-8' तर्क जोड़ना चाहिए।

उदाहरण के लिए:

# -*- encoding: utf-8 -*- 

from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 

msg = MIMEMultipart("alternative") 
msg["Subject"] = u'テストメール' 
part1 = MIMEText(u'\u3053\u3093\u306b\u3061\u306f\u3001\u4e16\u754c\uff01\n', 
       "plain", "utf-8") 
msg.attach(part1) 

print msg.as_string().encode('ascii') 
+0

इस पुरानी पोस्ट के लिए खेद है और मैं नीचे एक नया प्रश्न लिखता हूं लेकिन मुझे ... माना जाता है कि एक व्यक्ति को 'u \ 3035 \ u3093 ????? आपके पास कुछ जापानी शब्द सही है? आप इन कोडों के साथ कैसे आते हैं? मैंने जो ट्यूटोरियल पढ़े हैं, मैंने हमेशा यह संख्याएं देखी हैं (जबकि मैं समझता हूं कि अक्षरों के लिए कोड हैं, मुझे नहीं पता कि इस कोड या इसी तरह के इनपुट में इनपुट कैसे किया जाता है ...) – hephestos

+2

ये कोड केवल चित्रण के लिए हैं प्रयोजनों। आप अपने पायथन स्रोत इनपुट एन्कोडिंग को utf-8 पर सेट कर सकते हैं और यूनिकोड स्थिरांक सीधे टाइप कर सकते हैं। यदि आपको कुछ वर्णों के लिए उन '\ u ...' कोड प्राप्त करने की आवश्यकता है, तो आप कुछ ऐसा कर सकते हैं जैसे 'प्रिंट repr (u' テ ス ト メ ー ル ') '' – abbot

+1

सबसे पहले त्वरित उत्तर के लिए धन्यवाद ... इसे जांचें बाहर (इस प्रश्न के साथ मेरी समस्या को समझने के लिए) मैंने यह परीक्षण किया: मैंने एक चर में एक utf-8 शब्द (ग्रीक अक्षर) डाला और एक शब्दकोश 'ΤΕΣΤ' = X में संग्रहीत किया। जब मैं प्रिंट सूची करता हूं तो "तत्काल विंडो" में Ofutfs मुझे कुछ कोड बताता है! (mysql से मैंने ΤΕΣΤ पुनर्प्राप्त किया था)। तो मैं कहता हूं ठीक है मुझे सूची के रूप में वापस मूल्य दें ['ΤΕΣΤ'], यह मुझे जवाब देता है KeyError: '\ xce \ xa6 \ xce \ xa1 \ xce \ x9b \ xce \ x9a' !!!!!!!!! !!!!!!! – hephestos

संबंधित मुद्दे