我正在从两个不同的 .txt 文件中读取文本并将它们连接在一起。然后通过使用将其添加到电子邮件正文中webbrowser
。
一个文本文件是英文字符 (ascii),另一个是日文 (UTF-8)。如果我将其写入文本文件,文本将正常显示。但是,如果我使用webbrowser
将文本插入电子邮件正文,日文文本将显示为问号。
我尝试在多台机器上运行脚本,这些机器具有不同的邮件客户端作为默认值。最初我认为这可能是问题所在,但似乎并非如此。Thunderbird 和 Mail (MacOSX) 显示问号。
Hello. Today is 2014-05-09
????????????????2014-05-09????
我已经在 SO 上查看了类似的问题,但他们没有解决这个问题。
- UnicodeEncodeError:“ascii”编解码器无法在位置 20 编码字符 u'\xa0':序数不在范围内(128)
- python函数中的日语
- 打印出日文(中文)字符
- python utf-8 日语
有没有办法在用webbrowser
python 创建的电子邮件正文中显示日语(UTF-8)?我可以使用该email
功能,但要求是脚本需要打开默认邮件客户端并插入所有信息。
我正在使用的代码和文本文件如下。我已经简化它以专注于这个问题。
电子邮件模板.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