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

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

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

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

Q&A

解決済

3回答

15197閲覧

Pythonでメール送信時に送信者名に日本語表記を使用したときの不具合について

shitumon-suru

総合スコア8

Python

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

0グッド

0クリップ

投稿2018/06/01 03:03

###前提・実現したいこと

Python 3.6.2(Anaconda)32bit を使用してメール送信したいと考えています。
その際、差出人名を日本語にしたいと考えています。
使用しているPCはWindows8.1 Pro 64bitです。

###発生している問題・エラーメッセージ

送信はできたのですが、送信者名の表示がおかしくなります。

(Thunderbirdで受信したとき)
私の名前<私のメールアドレス>@xxxx.yyyy.ac.jp
xxxx >> メールサーバのコンピュータ名
yyyy >> ドメイン名
(勤務先で使用しているWebメールサービスで受信したとき)
"私の名前"<私のメールアドレス>@xxxx.yyyy.ac.jp>
xxxx >> メールサーバのコンピュータ名
yyyy >> ドメイン名

上記のように、「@xxxx.yyyy.ac.jp」と余計な文字列がくっついてしまいます。
この文字列が表示されないようにするにはどうすればよいかご教示いただけますでしょうか。
どうぞよろしくお願いいたします。

###該当のソースコード

Python

1#使用しているのはPython 3.6.2です。 2# -*- coding: utf-8 -*- 3 4import smtplib 5from email.mime.text import MIMEText 6from email.header import Header 7 8charset = 'iso-2022-jp' 9 10send_name = u'私の名前' #差出人名 11send_addr = '私のメールアドレス' #差出人のメールアドレス 12msg = MIMEText(u'これはテストメールです。\n確認をお願いします。', 'plain', charset) 13 14#差出人名+アドレス 15#'%s<%s>'でもu'%s<%s>'でも結果は同じだった 16msg['From'] = u'%s<%s>'%(str(Header(send_name.encode(charset), charset)), send_addr) 17 18#タイトル 19msg['Subject'] = Header(u'テストメールです'.encode(charset), charset) 20 21#SMTPサーバ名、ポート番号 22smtp_obj = smtplib.SMTP('SMTPサーバ名', 25) 23 24#SMTPサーバに"Hello"メッセージを送信する(必須) 25smtp_obj.ehlo() 26 27#SMTPサーバにログイン(ログイン名、パスワード) 28#>>今回この操作は使用していない 29##print('ログイン名:') 30##login_name = input() 31##print('パスワード:') 32##passwd_name = input() 33#smtp_obj.login(login_name, passwd_name) 34 35#メッセージの送信 36smtp_obj.sendmail(send_addr, '送信先メールアドレス', msg.as_string()) 37 38#最後に切断する 39smtp_obj.quit() 40

###試したこと

ちなみに、print(msg['From'])で内容を見たところ、
正しく「私の名前<私のメールアドレス>」となっていました。

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

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

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

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

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

guest

回答3

0

ベストアンサー

HeaderクラスのencodeメソッドでBエンコードした文字列が得られるようです。

Python

1msg['From'] = '%s <%s>'%(Header(send_name.encode(charset),charset).encode(),send_addr) 2print(msg['From'])

追記:
解説すると、元のコードでは、msg['From']に日本語が含まれているので、日本語部分じゃなくて文字列全体(※)がBエンコードされ、=?utf-8?b?~~~=?=のような文字列になり、MTAで「ドメイン部を含まない文字列」と判断されてドメイン部が付加されます。メールソフトではBデコードされるので、お書きの現象になります。

※部分の仕様(マルチバイトも字部分だけじゃなくて全体がエンコードされる)はバグに近い仕様だと思いますが、そういう仕様のメジャーなメールソフトもあったかと思います。

投稿2018/06/01 06:25

編集2018/06/01 06:38
otn

総合スコア85052

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

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

shitumon-suru

2018/06/04 02:05

ご指摘いただいた通り、下記のコードで実行したところ、自分が求めていた表記となりました。 どうもありがとうございました。 (修正コード) msg['From'] = '%s <%s>'%(Header(send_name.encode(charset), charset).encode(), send_addr) (結果) 差出人名が、Thunderbirdでは「(自分)」と表記され、Webメールでは「"私の名前"<私のアドレス>」と 表記され、思い通りの結果が得られました。 また、ご丁寧に解説までつけていただき、ありがとうございました。 print(msg['From'])を実行したところ、以下の通り表示されました。 =?iso-2022-jp?b?...(実際はアルファベットと数字を組み合わせた文字列ですが...と表記しています)=?=(Bエンコードされた私の名前) <私のアドレス> なるほど、msg['From']の中に日本語表記が含まれていると文字列全体がBエンコードされてしまうため 日本語表示されている部分をBエンコードしてから、msg['From']に代入すべきだったというわけですね。貴重な情報をいただきありがとうございました。 重ねてお礼申し上げます。本当にありがとうございました。
guest

0

正しく「私の名前<私のメールアドレス>」となっていました。

間にスペースが必要なのではないでしょうか。

"表示名" <メールアドレス>

補足

「@ドメイン名」は MTA が付けていると思われます。
おそらく、
「From: "表示名" <local_part@domain_part>」ならばドメイン部を抽出できるけれど、
「From: "表示名"<local_part@domain_part>」(スペースが無い)の場合、正しい形式ではないため、MTA はドメイン部が無いものと認識し、「@ドメイン名」を付けるのだと思います。

投稿2018/06/01 05:48

編集2018/06/01 15:52
TaichiYanagiya

総合スコア12159

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

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

shitumon-suru

2018/06/04 02:15

間にスペースを含めて試してみましたが、やはり結果は同じで 私の名前 <私のアドレス>@xxxx.yyyy.ac.jp xxxx >> メールサーバのコンピュータ名 yyyy >> ドメイン名 となり、「@xxxx.yyyy.ac.jp」の文字列はくっついてしまいました。 ですが、貴重な情報をいただきありがとうございました。 私の名前 <私のアドレス>というように、名前とアドレスの間にスペースを入れるのが 正しい表記であることを、はじめて知りました。 また、otnさんからのご指摘内容で試したところ、思い通りの結果が得られたのですが、 otnさんもまた名前とアドレスの間にスペースを入れて修正くださっているので、 TaichiYanagiyaさんからのご指摘と合わせて、それが正しい表記であると再認識いたしました。 ご教示いただき、どうもありがとうございました。
guest

0

"私の名前"<私のメールアドレス>@xxxx.yyyy.ac.jp>

「@」以降のホスト名を補完するのは、メールサーバ側の仕様だったと記憶しております。
(Postfixでmyoriginとかmydomainとか)

メールヘッダに使用できる文字コードも、RFCで厳密に決まっていた(MTAによって許容範囲は異なります)と思います。

ウラ取り不十分ですみません。

投稿2018/06/01 04:21

kazto

総合スコア7196

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

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

shitumon-suru

2018/06/04 02:21

メールがどのような仕組みで送られているのかわかっていなかったため、 ご教示いただきありがとうございました。 メールサーバ側で「@以降のドメイン部を含まない文字列」と判断されれば、 ホスト名を含めたドメイン部が付加されてしまうというわけですね。 貴重な情報をいただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問