質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

5476閲覧

Python:日本語を含む添付ファイル(CSV)をメール送信すると、アウトルックで テキストファイルとして表示されてしまう

saya24

総合スコア244

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/20 06:32

編集2020/07/02 23:30

日本語を含まない半角英数字だけの添付ファイル名であれば 受信側アウトルックで ちゃんとCSVファイルとして表示されます。

こちらの記事を参考に対処に努めたのですが、テキストファイルを送付されている事例がゆえ、自分の適用方法に問題があるのか うまくいきません(テキストファイルとして、かつ無名の添付ファイルと OUTLOOK上で表されてしまいます)

どなたか対策を ご教示頂けませんでしょうか
よろしくお願い致します。

PYTHON

1def send_Mail(self, toaddress, ccaddress, bccaddress, subject, body, filepath, parent): 2 try: 3 4 cset = 'utf-8' 5 msg = MIMEMultipart() 6 msg["Subject"] = subject 7 msg["From"] = self.mlsrv_fraddress 8 msg["To"] = toaddress 9 msg["Cc"] = ccaddress 10 msg["Bcc"] = bccaddress 11 msg["Date"] = formatdate() 12 body = MIMEText(body.encode(cset), 'plain', cset) 13 msg.attach(body) 14 15 16 if not (filepath == ""): 17 18 filename = os.path.basename(filepath) 19 with open(filepath, 'rt', encoding='Shift-JIS') as f: 20 content = f.read() 21 attachment = MIMEText(content, 'plain', 'Shift-JIS') 22 attachment.set_param('name', filename) #アウトルックのための対応 23 attachment.add_header('Content-Disposition', 'attachment', filename=('iso2022-jp', '', filename)) 24 msg.attach(attachment) 25 26 27 to_cc_bcc = [toaddress, ccaddress, bccaddress] 28 while True: 29 if ("" in to_cc_bcc): 30 delindex = to_cc_bcc.index("") 31 del to_cc_bcc[delindex] 32 else: 33 break 34 35 36 37 smtp = smtplib.SMTP(self.mlsrv, self.mlsrv_port) 38 smtp.login(self.mlsrv_id, self.mlsrv_pw) 39 40 result = smtp.sendmail(self.mlsrv_fraddress, to_cc_bcc, msg.as_string()) 41 42 except Exception as e: 43 tkmb.showerror("Abort", e, parent=parent) 44 result = 500 45 finally: 46 return result

20200628 画像差替え

決定的な違い発見

20200702 03:37AM コメントに記載した画像追加

確認

20200702 16:12PM 現況の添付ファイルに関わるコード

Python

1filename = os.path.basename(filepath) 2with open(filepath, 'rt', encoding='Shift-JIS') as f: 3 content = f.read() 4 attachment = MIMEText(content, 'plain', 'Shift-JIS', policy=policy.SMTP) 5 contentType = Header('text/comma-separated-values;', header_name='Content-Type') 6 contentType.append('name="') 7 contentType.append(filename, charset='iso-2022-jp') 8 contentType.append('"') 9 attachment['Content-Type'] = contentType 10 contentDisp = Header('attachment;', header_name='Content-Disposition') 11 contentDisp.append('filename="') 12 contentDisp.append(filename, charset='iso-2022-jp') 13 contentDisp.append('"') 14 attachment['Content-Disposition'] = contentDisp 15

20200702 16:56 del文 追加

Python

1filename = os.path.basename(filepath) 2with open(filepath, 'rt', encoding='Shift-JIS') as f: 3 content = f.read() 4 attachment = MIMEText(content, 'plain', 'Shift-JIS', policy=policy.SMTP) 5 contentType = Header('text/comma-separated-values;', header_name='Content-Type') 6 contentType.append('name="') 7 contentType.append(filename, charset='iso-2022-jp') 8 contentType.append('"') 9 del attachment['Content-Type'] 10 attachment['Content-Type'] = contentType 11 contentDisp = Header('attachment;', header_name='Content-Disposition') 12 contentDisp.append('filename="') 13 contentDisp.append(filename, charset='iso-2022-jp') 14 contentDisp.append('"') 15 attachment['Content-Disposition'] = contentDisp 16 prtin(attachment)

20200702 20:41 最新PGとその実行結果

Python

1filename = os.path.basename(filepath) 2with open(filepath, 'rt', encoding='Shift-JIS') as f: 3 content = f.read() 4 attachment = MIMEText(content, 'plain', 'Shift-JIS') 5 contentDisp = Header('attachment;', header_name='Content-Disposition') 6 contentDisp.append('filename="') 7 contentDisp.append(filename, charset='iso-2022-jp') 8 contentDisp.append('"') 9 attachment['Content-Disposition'] = contentDisp 10 print(attachment)

print文の結果とemlをエディタで確認

20200703 0829 結果添付

MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/comma-separated-values; charset="shift-jis"; name="=?iso-2022-jp?b?MjAyMDA3MDMwODI3NTcuY3N2?=" Content-Disposition: attachment; filename="=?iso-2022-jp?b?MjAyMDA3MDMwODI3NTcuY3N2?="

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

問題はset_paramadd_headerにであります。Python公式ドキュメントより email.message.Message.add_header

it is automatically encoded in RFC 2231 format

set_paramadd_headerは RFC 2231 を従って、このフォーマットにエンコードしています:

RFC2231

1title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A

しかし、Outlookはより古いの RFC 2047 だけを従っています、つまりこのフォーマットしか認識してないのです:

RFC2047

1=?iso-8859-1?q?this=20is=20some=20text?=

このフォーマットを使いたいなら、add_headerではなく、Headerクラスを使うべきです。

python

1from email.header import Header 2contentType = Header('text/comma-separated-values;', header_name='Content-Type', linesep='\r\n') 3contentType.append('name="') 4contentType.append(filename, charset='iso-2022-jp') 5contentType.append('"') 6attachment['Content-Type'] = contentType 7contentDisp = Header('attachment;', header_name='Content-Disposition', linesep='\r\n') 8contentDisp.append('filename="') 9contentDisp.append(filename, charset='iso-2022-jp') 10contentDisp.append('"') 11attachment['Content-Disposition'] = contentDisp

参考と問題を分析しただけの結果ですので、100%の把握がないけど、お役に立てたら幸いです。

参考:
c# - japanese email subject encoding - Stack Overflow
The mess that is attachment filenames – Nodemailer. Blog

追記

問題文と合わせたら、with openのブロックはこうなります:

python

1from email import policy 2 3with open(filepath, 'rt', encoding='Shift-JIS') as f: 4 content = f.read() 5 attachment = MIMEText(content, 'plain', 'Shift-JIS', policy=policy.SMTP) 6 contentType = Header('text/comma-separated-values;', header_name='Content-Type', linesep='\r\n') 7 contentType.append('name="') 8 contentType.append(filename, charset='iso-2022-jp') 9 contentType.append('"') 10 attachment['Content-Type'] = contentType 11 contentDisp = Header('attachment;', header_name='Content-Disposition', linesep='\r\n') 12 contentDisp.append('filename="') 13 contentDisp.append(filename, charset='iso-2022-jp') 14 contentDisp.append('"') 15 attachment['Content-Disposition'] = contentDisp

追記 1

Headerクラスはデフォルトで\nを使って行を区切りますが、それはRFCにあっていません。linesep='\r\n'をしてみましょう。上記のコードも訂正します。

MIMETextを構築するときも、policyという引数のデフォルトはcompat32であり、行終端を\r\nで指定しています。policyemail.policy.SMTPにしてみましょう。

SMTP.sendmail\n\r\nに変換しますので、上記の必要がありません。

追記 2

少なくともOutlookが RFC 2047 を従ってるはずと思った僕は甘すぎたかもしれません。もっとOutlookのバーションに接近しなきゃいけなさそうです。

数えたら、Outlookのencoded wordの一区切りの長さは54、RFC 2047の75と違っています。そして二重引用符の中に行終端がありません。この二つを訂正していきましょう。

こうしたら残した一致してないところは;後の行終端だけなはずですが、どうなりますかね。とりあえず試してみてください。

python

1with open(filepath, 'rt', encoding='Shift-JIS') as f: 2 content = f.read() 3 attachment = MIMEText(content, 'comma-separated-values', 'Shift-JIS') 4 filename_rfc2047 = Header(filename, 'iso-2022-jp', maxlinelen=55).encode().replace('\n', '') 5 attachment.set_param('name', filename_rfc2047) 6 attachment.add_header('Content-Disposition', 'attachment', filename=filename_rfc2047) 7 print(attachment)

投稿2020/07/01 10:20

編集2020/07/02 22:43
YufanLou

総合スコア464

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saya24

2020/07/01 14:26

ご見解をありがとうございます、またお返事が遅れて申し訳ございませんでした。 早速 適用させて頂き確認したのですが attachiment[’Content-Type’]の部分で 「 name 'attachiment' is not defined 」というエラーが生じました。 もし 解決できるようであれば 引き続きご見解を頂けたら幸いです、よろしくお願いします。
YufanLou

2020/07/01 21:54

attachimentではなくattachmentですよ、typoです
saya24

2020/07/01 22:36

ありがとうございます、そして気がつけずにすみません。 会社で試して報告しますね、しばしお待ちください。 まずはお礼まで
saya24

2020/07/02 00:14

お待たせました、試しました。 attachmentに修正した上での実行結果 「name 'attachment' is not defined 」 というエラーになりました。 ご提示のコードそのものを貼り付けてしまっているのですが 前もって attachment はMIMETextクラスなどから インスタンス化されていないとダメ ということでしょうか??
YufanLou

2020/07/02 01:10

そのものじゃさすが足りません。説明不足でごめんなさい。問題文にあるコードに合わせて書いたのです。そのattachmentは問題文のコードにあるattachmentです。
YufanLou

2020/07/02 01:17

> 前もって attachment はMIMETextクラスなどから インスタンス化されていないとダメ そうです。
saya24

2020/07/02 01:54

私が悪かったです、すぐに気が付くべきでした。後ほど適用してご報告致します。 少々お時間を頂けますでしょうか さすが月初...色々と立て込んできました
YufanLou

2020/07/02 02:00

お忙しい中でも休憩を忘れずにね。:)
saya24

2020/07/02 05:43

yymmtさんからご提案のコードを試した結果と同じ事象となりました。 つまり半角英数字の添付ファイル名であろうと、かつWebのメーラーであろうと添付ファイルがあらわれなくなってしまいました。 OUTLOOKでだけとか、日本語のファイル名だけ ということでなく....
YufanLou

2020/07/02 05:52 編集

妙ですね。受信したメールの中身どうなっていますか?
saya24

2020/07/02 06:17

.emlのファイルより こちらに貼り付けてしまいますね。プライベートな情報は置換しています。 Return-Path: <hogehoge@hoge.com> X-Original-To: hogehoge@hoge.com Received: from U1133150000.HOGEDOMAIN.local (unknown [10.71.71.32]) (Authenticated sender: S00277142@hoge.com) by samsm265.hoge.com (Postfix) with ESMTPA id 93A5380002; Thu, 2 Jul 2020 15:10:18 +0900 (JST) Content-Type: multipart/mixed; boundary="===============8198241519693652017==" MIME-Version: 1.0 Subject: =?utf-8?b?44GT44KM44Gv5re75LuY44OV44Kh44Kk44Or44Gu56iu6aGe44KS5Y+v5aSJ44GV44Gb44KL44K444On44OW?= From: hogehoge@hoge.com To: ypfhj194@hoge.com Cc: Date: Thu, 02 Jul 2020 06:10:18 -0000 Message-Id: <20200702061018.93A5380002@samsm265.hoge.com> This is a multi-part message in MIME format. --===============8198241519693652017== Content-Type: text/plain; charset="iso-2022-jp" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit 私はチャルメラのファンです。 --===============8198241519693652017==--
saya24

2020/07/02 06:23

YufanLouさん、今から15:16に変更頂きましたコードで試してみますね。先ほど貼り付けた内容は コード修正前の結果です。しばしお待ちを
saya24

2020/07/02 06:31

すみません、name 'policy' is not defined というエラーとなりました、ひとまずにご報告です。
YufanLou

2020/07/02 06:44 編集

from email import policy をファイルの先頭につけてください。 新たな追記の通り結果が変わらないかもしれませんが。 問題文に今のコードも示してください。
saya24

2020/07/02 06:50

ごめんなさい、たしかにそれimportしてなかったぁ
saya24

2020/07/02 06:59

別のエラーを招いてしまいましたが、お言葉に甘え こちらにコードを貼付けさせて頂きます。 エラーは「 __init__() got an unexpected keyword argument 'linesep' 」 とのこと filename = os.path.basename(filepath) with open(filepath, 'rt', encoding='Shift-JIS') as f: content = f.read() attachment = MIMEText(content, 'plain', 'Shift-JIS', policy=policy.SMTP) contentType = Header('text/comma-separated-values;', header_name='Content-Type', linesep='\r\n') contentType.append('name="') contentType.append(filename, charset='iso-2022-jp') contentType.append('"') attachment['Content-Type'] = contentType contentDisp = Header('attachment;', header_name='Content-Disposition', linesep='\r\n') contentDisp.append('filename="') contentDisp.append(filename, charset='iso-2022-jp') contentDisp.append('"') attachment['Content-Disposition'] = contentDisp
YufanLou

2020/07/02 07:01

すみません、それはこちらの間違いです。その引数を削除してください。
YufanLou

2020/07/02 07:06

コメントではインデントがなくなって読み辛いですけど。。。 よければ問題文にでコードを更新していただけますか?
saya24

2020/07/02 07:29

現行コードを本文に貼り付けました。 「 There may be at most 1Content-Type headers in a message 」 というエラーになりました。 参考にして頑張ってみます
YufanLou

2020/07/02 07:38

Content-Typeを2回つけたという可能性が思いつきました。やはりそうですね。 1回目はMIMETextを構築する時、2回目はこちら attachment['Content-Type'] = contentType 解決のはこの行の前に del attachment['Content-Type'] を加えてください こうなります del attachment['Content-Type'] attachment['Content-Type'] = contentType そして、msgを送信前にもprintし確認してみてください
saya24

2020/07/02 08:05

del文を追加した 現況のコードを本文に貼り付けました、再度別のエラーがでてしまい print文まで到達できませんでした。また何か私 間違えてしまっていますかね? 「 Header object does not support indexing 」 差し支えなければ ご都合のよろしい際でも ご見解をよろしくお願いします。 どなたでも...急ぎません
YufanLou

2020/07/02 08:09

エラーに行数と列数があるはずですが、それに沿ってエラーがでた位置を教えていただけますか?
saya24

2020/07/02 08:15

申し訳ありません、私のために休憩できないですよねぇ スミマセン attachment['Content-Type'] = contentType の行でエラーがでています。 列までは 特定できておりません
YufanLou

2020/07/02 08:22

休憩をとりました、大丈夫です。 ;) contentType = Header('text/comma-separated-values;', header_name='Content-Type') contentType.append('name="') contentType.append(filename, charset='iso-2022-jp') contentType.append('"') del attachment['Content-Type'] attachment['Content-Type'] = contentType いっそこちらのコードを削除してみてください。
saya24

2020/07/02 08:35

お世話になります、ご指摘の6行をコメントアウトしまして、実行したところ 前回同様のエラーメッセージを得ました「 ’Header’ object does not support indexing 」 尚、エラーとなった行は attachment['Content-Disposition'] = contentDisp の部分です。print文n直前です。 ご負担でなければ ご見解頂ければ幸いです。
YufanLou

2020/07/02 09:01

エラーはpolicy.SMTPのせいですね。おかげてContent-Type2回ついたのバグを見つけたが、policy.SMTPが有効限りRFC2047ヘッダを付けられないに見えますね。 attachment = MIMEText(content, 'plain', 'Shift-JIS', policy=policy.SMTP) を attachment = MIMEText(content, 'plain', 'Shift-JIS') にしてください。
saya24

2020/07/02 11:45

報告が遅くなり申し訳ありません。 本文に現況のコードと結果を貼り付けました。添付ファイルが現れていない状況です。 以外に解決できない問題だったりしますかねぇ
saya24

2020/07/02 22:24

おはようございます、ご親切に長期間のお付き合いを誠にありがとうございます。 attachment = MIMEText(content, 'comma-separated-values',', 'Shift-JIS') の部分は シングルクォートとカンマが一つ多くなっているようで、実行に至れない状況でしたので attachment = MIMEText(content, comma-separated-values, 'Shift-JIS') へ変更させて頂き 実行を試しました。 その結果は 「 name 'comma' is not defined 」 とのエラーを招きました。 他人様のお時間を頂いて非常に申し訳ない気持ちです、差し支えなければ引き続きよろしくお願いします。
YufanLou

2020/07/02 22:44

修正しました。カンマを削除しても引用符がまだ必要です。
saya24

2020/07/02 23:39

ありがとうございます、print文の結果の上段のみを貼り付けしました。 OUTLOOK及びWebメールのメーラ両方で 添付ファイルが 見当たりません。 無理のない範囲で ご確認を頂けたら幸いです。
YufanLou

2020/07/03 01:47

mag.attach(attachment) の後に print(msg) したら、Outlookの受信と違いますか?
saya24

2020/07/03 02:08

ごめんなさい、mag.attach(attachment) という行がありませんでした。 本当にコピペで ご提示のコードだけにしてしまっていて。 今から入れて実行します。
YufanLou

2020/07/03 02:14

XD 今までちゃんと attach してなかったですね。まさかと思いましたけど、失礼だと思ったので提示しませんでした。ごめんなさい。:P 解決できたら何よりです。XD
saya24

2020/07/03 02:32

YufanLouさん、yymmtさん ***************長い間 お付き合いを頂き ありがとうございました************** 和名のCSVファイル とうとう アウトルックに 添付ファイルとして現れました。 ******************************************************************** YufanLouさんから 20200703 07:43AM  にご提示頂きましたコードは 完全なもので mag.attach(attachment) を つけ忘れていた だけでお騒がせ致しました。 だいぶ添付ファイルがついていない、との報告を繰り返し時間を費やしてしまいましたが これは まさに 私の不貞際です、何卒ご容赦ください。 諦めずにゴールまで導いて頂き 本当に感謝しております、一人では 到底ここまで いきつくことはできませんでした。 ありがとうございました。
guest

0

気になる箇所としては文字コードの指定でしょうか。isoと2022の間にハイフンを入れたらどうなりますか?

python

1filename=('iso-2022-jp', '', filename)

投稿2020/06/20 18:08

yymmt

総合スコア1615

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saya24

2020/06/20 22:32

yymmtさん、ご見解ありがとうございました。 ご指摘の部分にハイフォンを入れるよう変更しましたが、状況は変わらず OUTLOOK側では 無題のテキストファイルとして表示されてしまいました。WebのメーラだとちゃんとCSVファイルの添付ファイルとして表示されています 頭が痛い...
yymmt

2020/06/20 22:50

念のため確認ですがWindows 10標準のメーラではなく、Officeをインストールした時に付いてくるOutlookでしょうか。最近はOffice 365ばかりでGUI版のOutlookをインストールした端末がないので試験できませんが、標準メーラの方ではアップロードされているソースコードで日本語の添付ファイルが問題なく表示されました。一応ヘッダも晒しておきます。 MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="shift-jis"; name="sjis_message.txt" Content-Disposition: attachment; filename*=iso-2022-jp''%1B%24BF%7CK%5C8l%24N%25U%25%21%25%24%25kL%3E%1B%28B.txt
saya24

2020/06/20 23:10

yymmtさん、オフィスのものの認識です。 実は経験浅く ヘッダの確認方法が分かりません。これはどうやって確認するのでしょうか これを提示させて頂ければゴールも見えるのかな、と思いましたもので
yymmt

2020/06/20 23:14

Outlookがどうだったかほとんど覚えていませんが、右クリックでヘッダの詳細を表示みたいなものはないでしょうか?なければ該当メールをデスクトップにDrag&Dropするか、右クリックで保存してテキストエディタでひらけば良いです。
saya24

2020/06/20 23:25

アウトルックでのヘッダ確認方法 ネットで検索しました。 前進することを祈って 貼り付けます。プライベートな部分は変更させて頂きました Return-Path: <内緒のメルアド> X-Original-To: 内緒のメルアド Received: from UXXXXX.XXXXXXX.local (unknown [10.71.XX.XXX]) (Authenticated sender: 内緒のメルアド2つめ) by ~@hogehoge.com (Postfix) with ESMTPA id 0C184280002; Sun, 21 Jun 2020 07:17:35 +0900 (JST) Content-Type: multipart/mixed; boundary="===============8233987232654054402==" MIME-Version: 1.0 Subject: =?utf-8?b?44K544K644Kx44Oz44Gu5Y2444OH44Od44Kz44O844OJ5LiA6Kan44GK5bGK44GR?= From: 内緒のメルアド To: 内緒のメルアド Cc: Date: Sat, 20 Jun 2020 22:17:34 -0000 Message-Id: <20200620221736.0C184280002@~@hogehoge.com>
yymmt

2020/06/20 23:30

肝心な添付ファイルの部分が含まれていませんね。メール本体ごと保存しないとダメかも知れません。
saya24

2020/06/20 23:50

失礼しました、おっしゃられるようにデスクトップに問題のメールを貼り付けて、terapadで開いたのですが やたら文字化けしています。開くうえでterapadから NULL文字は半角スペースに置き換えられたとの警告がはっせらえました。 上部はプライベートな情報を含むので、添付ファイルの最初の部分を含む ちょっと前からの画像を本文に追加します。あまり参考にならないかも 知れません。
saya24

2020/06/26 23:46

いま、取り組んでいるTkInterとスケジュールを駆使したプログラム、残課題がもはやこれださけとなりました。 添付ファイル名が日本語の際、アウトルックでメールを開くと、無名のテキストファイルとして表示される問題、どういった対策がありますかねぇー?? 前回エディタはTerapadを利用して提示致しましたが、最近こちらの動作がなんか思わしくないので、後ほどサクラエディタを入手して、メールを開く事をチャレンジしてみます。
yymmt

2020/06/27 01:17

正常に表示される添付ファイルのメールを1つ2つ選んで、生のメールをテキストエディタで開いた時にどのような違いがあるのか確認されるのが良いと思います。
saya24

2020/06/27 01:38

こちらの件でも お時間を頂き 誠にありがとうございます。 日本語名でない添付ファイルのメールを作り出して、そちらと比較するということですね。 確かにそれを行っていませんでした。今から行います。 サクラエディタ入手して問題のメール開くも、ファイルを開く際に指定されるべき文字コードが正しくないのか それ以前の問題なのか定かでありませんが terapad同様のイメージで開かれてしまい どうしたものか と悩んでいたところでした。
saya24

2020/06/27 07:02 編集

本文に今から OUTLOOK上で正常に添付ファイルを表現できるメールと表現できない(添付ファイルが和名)パターンのメールについて、エディタでの比較結果を添付します。双方40行目以上の添付にしている理由はそれ以前の行ではメールサーバ・メールアカウントの記載が目立ったためです。 尚、エディタはUTF-8の文字コードでメールを読み込んだ状況となっています。 terapad同様 何かの要因でやたら半角スペースが含まれてしまっています.... 51行目に明らかな違いがあることは確認できますが、何をどうすれば良いのか ちょっと分かりません。 画像確認後 ご見解を頂けたら幸いです。
saya24

2020/06/27 11:18

Yahooで受信のWebメールについて ヘッダを確認することができることを知り、早速社内だけでなく同時にYahooのメールアドレス宛に送り、ブラウザ上でヘッダを確認しました。 その内容をプライベートな部分をマスキングした上で 本文へ貼り付けさせていただきました。
saya24

2020/06/27 23:05

yymmtさんが仰られていた[正常表示される]は、自分のアウトルックで受信済みの日本語の添付ファイルのメールとの比較を仰られていたのですね?? 今回のプロジェクトで、半角英数字の添付ファイルだった場合は アウトルックで正常な表示ができていたので、そちらとの比較をしていました。 今から対応します!!! https://support.microsoft.com/ja-jp/help/323226/xcon-a-description-of-the-multipart-mixed-internet-message-format という記事を見つけました。何かやはり、Nameパラメータの与えかたに問題があるのかなー…
yymmt

2020/06/28 00:32

はい、日本語の添付ファイルでないと意味がないです。
saya24

2020/06/28 00:41

yymmtさんが仰られている [生のメールを]とは 拡張子emlのことでしたか、ひょっとして 今までアウトルックの受信箱から取り出したメールをエディタに展開・確認していたのですが、Webのメーラで「アウトルック側で」正常に表示できるものとできないものを抽出して比較する=emlのメール同士の比較を思いつきました! 比較結果を本文に改めて貼り付けます(無駄に貼り付けた画像を差替えます)、気になる点は アウトルックでうまく表示できているメール(和名の添付ファイルが正しく認識されている)は、”This is a multi part message in MIME format”という文言が現れた行があること、 またファイルの表記について 文字コードの指定が iso-2022-jp が宣言されている点です。この違いがアウトルックでうまく和名の添付ファイルを表示できているメールとの違いです。 おっ、ベルマークにコメント到着のしるしが....行き違いでしたら申し訳ないです。
yymmt

2020/06/28 01:32

おっしゃる通り、私が言っていたのはemlのことです。それはそうと問題点を整理すると 添付ファイルの内容: sjis メールで送信するときのファイル名: utf-8 という状況で、後者をiso-2022-jpにする方法は何か、ということになります。 それで提案ですが、一々メールを送信するのは大変なのでprint(attachment)をしてローカルで色々と試すのが良いと思います。
yymmt

2020/06/28 01:37

今気が付いたのですが attachment.set_param('name', filename) を attachment.set_param('name', ('iso-2022-jp', '', filename)) にすると強制的にiso-2022-jpになりませんか?
saya24

2020/06/28 01:38

引き続きのご見解ありがとうございます。「生のメール」っていう表現、今後絶対役立つことでしょうね、覚えておきます! 了解です、仰られるまで気が付きませんでした。 しっかし、 attachment.set_paramの事例がネットに見つけられないですねえ....
saya24

2020/06/28 01:39

早速ご提案やってみます! しばしお待ちを
saya24

2020/06/28 01:44

yymmtさん、ご提案の改修反映し得られたprtin文結果をいかに貼り付けます。近づきました。 MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/text/comma-separated-values; charset="shift-jis"; name*=iso-2022-jp''%1B%24B%40%3EF%7CK%5C1D6H%3Dj%24N%24_%1B%28B_20200628104117.csv Content-Disposition: attachment; filename*=iso-2022-jp''%1B%24B%40%3EF%7CK%5C1D6H%3Dj%24N%24_%1B%28B_20200628104117.csv Iolji8aPioNSgVuDaCIsIolji8aPipa8j8wiLCKUepfxIgoiMDMgIiwikLyT+pZ7keaI6olji8aP iiAgICAiLCI5Igo=
yymmt

2020/06/28 01:57

あまり推奨はしませんが、最終手段としては attachment['Content-Type'] = "望む文字列" ができることもお伝えしておきます。
saya24

2020/06/28 02:14 編集

nameのところをもとに戻し、最終手段のご提案を対応しましたが 相変わらずの添付ファイルが無名のテキストで アウトルックでは表示されています。 最終手段のご提案でいう望む文字列とは 添付ファイル名の変数名をあてがっては だめでしたかね?? with open(filepath, 'rt', encoding='Shift-JIS') as f: content = f.read() attachment = MIMEText(content, 'text/comma-separated-values', 'Shift-JIS') attachment.set_param('name', filename) attachment.add_header('Content-Disposition', 'attachment', filename=('iso-2022-jp', '', filename)) attachment['Content-Type'] = filename print(attachment) msg.attach(attachment) ちょっと席を外します....
yymmt

2020/06/28 02:12

filenameだけではなく全部書く必要があります。 attachment['Content-Type'] = "Content-type: text/plain; ..." もっと上手い方法がありそうなので最終手段なのです。
saya24

2020/06/28 07:48

現況の問題部分のコードと、添付ファイル部分のメールのヘッダ情報、改めてこちらに貼り付けます。 問題が絞りこまれてきただけに、対策を施したたいのですが 当方思い当たりません。 最終手段ご提案頂きましたが 形成に難しく 手を停めまして ひとつ前のご提案に戻させて頂きました。Content-TypeとContent-Dispositionの釣り合いを保てるのかなぁという不安もございまして。 非常に惜しいところまでキている気がするのですが、ネット上に対応記事が見つけられないところを見ると、メールサーバの設定に由来した問題なのでしょうか 以下が現況のコードになります。 filename = os.path.basename(filepath) with open(filepath, 'rt', encoding='Shift-JIS') as f: content = f.read() attachment = MIMEText(content, 'csv', 'Shift-JIS') attachment.set_param('name', ('iso-2022-jp', ' ', filename)) attachment.add_header('Content-Disposition', 'attachment', filename=('iso-2022-jp', ' ', filename)) print(attachment) msg.attach(attachment) 以下が得られているメールのヘッダ情報(添付部分)です --===============8921183499011178284== MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/csv; charset="shift-jis"; name*=iso-2022-jp' '%1B%24B%40%3EF%7CK%5C1D6H%3Dj%24N%24_%1B%28B_20200628163134.csv Content-Disposition: attachment; filename*=iso-2022-jp' '%1B%24B%40%3EF%7CK%5C1D6H%3Dj%24N%24_%1B%28B_20200628163134.csv Iolji8aPioNSgVuDaCIsIolji8aPipa8j8wiLCKUepfxIgoiMDMgIiwikLyT +pZ7keaI6olji8aPiiAgICAiLCI5Igo= --===============8921183499011178284==-- 私...どうすべきでしょう
yymmt

2020/07/01 15:13

結局RFC2231形式のファイル名を理解できない、という問題なのでYufanLouさんが答えられている方法で解決すると思います。
yymmt

2020/07/01 15:54

埒が明かないのでソースコード読んできました。 https://github.com/python/cpython/tree/3.8/Lib/email 結論は下記です。YufanLouさん、ありがとう。 from email.mime.text import MIMEText from email.header import Header filename="日本語のファイル名.txt" filename_rfc2047 = Header(filename, 'iso-2022-jp').encode() with open("sjis.txt", "rt", encoding='Shift-JIS') as f: content = f.read() attachment = MIMEText(content, 'plain', 'Shift-JIS') attachment.set_param('name', filename_rfc2047) attachment.add_header('Content-Disposition', 'attachment', filename=filename_rfc2047) print(attachment)
saya24

2020/07/01 18:37

長期に渡るお付き合い 誠にありがとうございます。 私の適用方法が悪いのか、半角英数字の名前にしたCSVファイルをも、現在はメールに添付ファイルとして現れなくなりました。またそれはOUTLOOKのみならずWebメールでも、です。 本文にプリント文の結果画像、及びWebメール(.eml)をエディタで確認した画像を貼り付け致します。 ご確認を頂けましたら幸いです。(今から貼り付けます)
YufanLou

2020/07/02 01:32

こちらこそ、ヘッダをみないと形式の問題を気付けないのです。 公式ドキュメントにHeaderインスタンスを['Content-Type']で直接にsetできるようにみましたが、検証しなかったので、そうできなければsaya24さんはyymmtさんの上記のコードに参考してください。
saya24

2020/07/02 01:52

色入とありがとうございます。決算業務落ち着いたら 適用対応します。少々お待ちくださいませ
guest

0

Python

1attachment = MIMEText(content, 'plain', 'Shift-JIS')

とありますが、'plain' の部分は 'csv' とすべきではないでしょうか。

https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types `によれば、CSV の mime type は text/csv なようです。

投稿2020/06/20 17:17

cugel

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saya24

2020/06/20 22:30

cugelさん、ご見解ありがとうございました。 csvに変更しましたが、状況は変わらず OUTLOOK側では 無題のテキストファイルとして表示されてしまいました。WebのメーラだとちゃんとCSVファイルの添付ファイルとして表示されているのですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問