4

2 つの異なる .txt ファイルからテキストを読み取り、それらを連結しています。次に、 を使用して、それをメールの本文に追加しwebbrowserます。

1 つのテキスト ファイルは英字 (ascii) で、もう 1 つは日本語 (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

EDIT 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 でデフォルトのメール クライアントが開きます。他の OS の場合は、subprocess 行の「open」を適切な実行可能ファイルに置き換えてください。


編集: もう少し調べてみたところ、上記のマークのコメントにより、mailto URL スキームのRFC (2368)を読むことができました。

特別な hname "body" は、関連する hvalue が
メッセージの本文であることを示します。「本文」の 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)

冒頭の ( の直後と ".

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 に答える