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

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

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

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

Q&A

解決済

1回答

1627閲覧

Python: 日本語を含むメールを送ろうとすると、エンコードエラーが起きる

saya24

総合スコア247

Python

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

0グッド

2クリップ

投稿2020/05/25 08:49

自分のTkInterを利用したGUIアプリの中で、本日メールを送る部分のコーディングを行いましたが、表題のとおり
日本語の文字を含んだ本文にすると エラーになってしまいます。

Error

1UnicodeEncodeError: 'ascii' codec can't encode characters in position 92-96: ordinal not in range(128) 2

上記エラー内容で、ネット上を検索しこれらをはじめとした記事で、とりあえずコード頭に

Python

1sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 2

の記述を行うことが妥当な策に挙げられておりましたので、当方一先ず 「 if name == 'main':」 の直下で上記を挿入しました。
if name == 'main':
□□□□sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
しかし、状況に進展が得られず、相変わらず同じエラーを招いています。

日本語を含む本文をメール送信するには どういった対策を行えば 良いのでしょうか? メール送信の関数は現況以下となっています。

python

1 def mail_Send(): 2 smtp_host = 'XXXXXXXXXXXXXXXXXXXX' 3 smtp_port = 587 4 username = 'XXXXXXXXXXXX' 5 password = 'XXXXXXXXXXXX' 6 from_address = 'XXXXXXXXXXXXXXXXXXX' 7 to_address = 'XXXXXXXXXXXXXXXXXXXXX' 8 subject = 'This mail is a test!' 9 body = 'あいうえお' 10 message = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s" % (from_address, to_address, subject, body)) 11 12 smtp = smtplib.SMTP(smtp_host, smtp_port) 13 smtp.login(username, password) 14 result = smtp.sendmail(from_address, to_address, message)

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

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

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

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

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

glyzinieh

2020/05/29 03:42 編集

if name == 'main': ではなく、 if __name__ == '__main__': ではないですか?
saya24

2020/05/29 03:56

if __name__ == '__main__': sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') でした、誤ったこちらへの掲載をしていました。すみません。 引き続き ご見解を頂けたら幸いです。
guest

回答1

0

ベストアンサー

Python

1import smtplib 2from email.MIMEText import MIMEText 3from email.Header import Header 4from email.Utils import formatdate 5 6def mail_Send(): 7 smtp_host = 'XXXXXXXXXXXXXXXXXXXX' 8 smtp_port = 587 9 username = 'XXXXXXXXXXXX' 10 password = 'XXXXXXXXXXXX' 11 from_address = 'XXXXXXXXXXXXXXXXXXX' 12 to_address = 'XXXXXXXXXXXXXXXXXXXXX' 13 subject = 'This mail is a test!' 14 body = 'あいうえお' 15 16 msg = MIMEText(body.encode(encoding), 'plain', encoding) 17 msg['Subject'] = Header(subject, encoding) 18 msg['From'] = from_address 19 msg['To'] = to_address 20 msg['Date'] = formatdate() 21 22 smtp = smtplib.SMTP(smtp_host, smtp_port) 23 smtp.login(username, password) 24 result = smtp.sendmail(from_address, to_address, msg.as_string()) 25 smtp.close()

こちらでどうでしょうか?
申し訳ないですが、ほとんどコピペというのと動作テストをしていないのもあり、ほとんど仕組みなどを理解していません。
また、エラーなどがある場合教えてください。

参考サイト様

そしたらとうとう同じ目にあってる方を見つけました。

http://d.hatena.ne.jp/tomisima/20070718

Python

msg = MIMEText(body, 'plain', encoding)

msg = MIMEText(body.encode(encoding), 'plain', encoding)

に直すだけで良いらしい。 で、マネしたら出来ました。

投稿2020/05/29 05:11

glyzinieh

総合スコア222

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

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

saya24

2020/05/30 12:16

ご支援を頂いておきながら、お返事が遅れてしまい申し訳ありませんでした。 当方のPythonのVerは3.6であるためか、ご提示のコードそのものではモジュールのimportに失敗してしまいました。この部分を適宜修正し、それ以外をそのままご提示のコードで実行してみたところ.... msg = MIMEText(body.encode(encoding), 'plain', encoding)の部分で 「name 'encoding' is not defined」 というエラーになってしまいました。 ちなみにこちらで修正しました部分は以下のとおりです。 from email.mime.text import MIMEText from email.header import Header 開発環境は Windows10なのですが、環境変数「PYTHONENCORDING」に、uft-8を設定していないことは関係しているのでしょうかねぇ 今日 参考書を買ってきて これを設定していないことに気が付きました
saya24

2020/06/16 23:55

from email.mime.text import MIMEText from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart を改めてインポートしまして、昨日日本語を含む文面のメール送信に成功することができました。 MIMETextでbodyを組み立てる際に、エンコードを指定したことが功を奏したのかも知れません。 ご支援を頂いておきながら 長い間の放置大変失礼致しました。
glyzinieh

2020/06/17 06:04

こちらこそ、コメントに気づかず無視してしまい申し訳ありませんでした。 ご解決されてよかったです。 BAありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問