我正在从两个不同的.txt文件中读取文本并将它们连接在一起。然后使用webbrowser
将其添加到电子邮件正文中。
一个文本文件是英文字符(ascii),另一个是日文(UTF-8)。如果我将文本写入文本文件,文本将显示正常。但是,如果我使用webbrowser
将文本插入电子邮件正文,则日文文本将显示为问号。
我尝试在多台具有不同邮件客户端作为默认值的计算机上运行该脚本。最初我认为这可能是问题,但似乎并非如此。 Thunderbird和Mail(MacOSX)显示问号。
Hello. Today is 2014-05-09
????????????????2014-05-09????
我在SO上看过类似的问题,但他们还没有解决问题。
有没有办法在python中使用webbrowser
创建的电子邮件正文中显示日语(UTF-8)?我可以使用email
功能,但要求是脚本需要打开默认邮件客户端并插入所有信息。
我正在使用的代码和文本文件如下。我简化了它以专注于这个问题。
电子邮件-template.txt
Hello. Today is {{date}}
电子邮件模板jp.txt
こんにちは。今日は {{date}} です。
Python脚本
#
# -*- coding: utf-8 -*-
#
import sys
import re
import os
import glob
import webbrowser
import codecs,sys
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
# vars
date_range = sys.argv[1:][0]
email_template_en = "email-template.txt"
email_template_jp = "email-template-jp.txt"
email_to_send = "email-to-send.txt" # finished email is saved here
# Default values for the composed email that will be opened
mail_list = "test@test.com"
cc_list = "test1@test.com, test2@test.com"
subject = "Email Subject"
# Open email templates and insert the date from the parameters sent in
try:
f_en = open(email_template_en, "r")
f_jp = codecs.open(email_template_jp, "r", "UTF-8")
try:
email_content_en = f_en.read()
email_content_jp = f_jp.read()
email_en = re.sub(r'{{date}}', date_range, email_content_en)
email_jp = re.sub(r'{{date}}', date_range, email_content_jp).encode("UTF-8")
# this throws an error
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 26: ordinal not in range(128)
# email_en_jp = (email_en + email_jp).encode("UTF-8")
email_en_jp = (email_en + email_jp)
finally:
f_en.close()
f_jp.close()
pass
except Exception, e:
raise e
# Open the default mail client and fill in all the information
try:
f = open(email_to_send, "w")
try:
f.write(email_en_jp)
# Does not send Japanese text to the mail client. But will write to the .txt file fine. Unsure why.
webbrowser.open("mailto:%s?subject=%s&cc=%s&body=%s" %(mail_list, subject, cc_list, email_en_jp), new=1) # open mail client with prefilled info
finally:
f.close()
pass
except Exception, e:
raise e
编辑:忘记添加我正在使用Python 2.7.1
答案 0 :(得分:3)
编辑2 :毕竟找到了一个可行的解决方案。
用此替换 webbrowser 电话。
import subprocess
[... other code ...]
arg = "mailto:%s?subject=%s&cc=%s&body=%s" % (mail_list, subject, cc_list, email_en_jp)
subprocess.call(["open", arg])
这将在MacOS上打开您的默认电子邮件客户端。对于其他操作系统,请更换"打开"在具有适当可执行文件的子进程行中。
编辑:我对此进行了一些调查,上面的Mark评论让我读了RFC (2368)的mailto URL方案。
特殊的hname" body"表示关联的左值是
信息的主体。 "身体" hname应包含
的内容 消息的第一个text / plain正文部分。 mailto URL是
主要用于生成中的短文本消息 实际上是自动处理的内容(例如"订阅"
邮件列表的消息),而不是一般的MIME主体。
再往下一点:
禁止使用mailto URL中的8位字符。 MIME编码的单词(如 在[RFC2047]中定义的,在标题值中是允许的,但不适用于任何标题值 身体的一部分" 。hname"
所以看起来根据RFC这是不可能的,尽管这让我怀疑为什么naota提供的JSFiddle中的JavaScript解决方案完全适用。
我留下我之前的答案,如下所示,虽然它不起作用。
我在Python 2.7.x中遇到过相同的问题,现在每次都有不同的解决方案。
所以这里有一些建议可能会或可能不会起作用,因为我还没有对它们进行过测试。
a)强制unicode字符串:
webbrowser.open(u"mailto:%s?subject=%s&cc=%s&body=%s" % (mail_list, subject, cc_list, email_en_jp), new=1)
在开幕后(和#34;。
之前)注意小ub)强制正则表达式使用unicode:
email_jp = re.sub(ur'{{date}}', date_range, email_content_jp).encode("UTF-8")
# or maybe
email_jp = re.sub(ur'{{date}}', date_range, email_content_jp)
c)关于正则表达式的另一个想法,在应用之前先尝试用re.UNICODE标志编译它。
pattern = re.compile(ur'{{date}}', re.UNICODE)
d)没有直接关联,但我注意到您通过正常的打开方法编写组合文本。也可以尝试使用 codecs.open 。
f = codecs.open(email_to_send, "w", "UTF-8")
希望这有帮助。