4

我正在从两个不同的 .txt 文件中读取文本并将它们连接在一起。然后通过使用将其添加到电子邮件正文中webbrowser

一个文本文件是英文字符 (ascii),另一个是日文 (UTF-8)。如果我将其写入文本文件,文本将正常显示。但是,如果我使用webbrowser将文本插入电子邮件正文,日文文本将显示为问号。

我尝试在多台机器上运行脚本,这些机器具有不同的邮件客户端作为默认值。最初我认为这可能是问题所在,但似乎并非如此。Thunderbird 和 Mail (MacOSX) 显示问号。

Hello. Today is 2014-05-09

????????????????2014-05-09????

我已经在 SO 上查看了类似的问题,但他们没有解决这个问题。

有没有办法在用webbrowserpython 创建的电子邮件正文中显示日语(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

4

1 回答 1

3

编辑 2:毕竟找到了一个可行的解决方案。

用这个替换你的网络浏览器调用。

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 上打开您的默认电子邮件客户端。对于其他操作系统,请将子进程行中的“open”替换为正确的可执行文件。


编辑:我对它进行了更多研究,上面的 Mark 评论让我阅读了mailto URL 方案的RFC (2368) 。

特殊的 hname “body”表示关联的 hvalue 是
消息的正文。“body” hname 应包含
消息的第一个文本/纯正文部分的内容。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)

注意小 u 在开头之后(和之前)。

b) 强制正则表达式使用 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")

希望这可以帮助。

于 2014-05-09T03:48:03.550 回答