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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

555閲覧

Exception Type: UnicodeEncodeError

sasaki0628

総合スコア106

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2022/12/09 07:52

編集2022/12/09 09:02

CentOS Stream 9
Python 3.9.12

メールを送信するAPIをテストで作成しています。
英文のメールは送信できるのですが、日本語だと以下のエラーが出力されます。

Exception Type: UnicodeEncodeError
Exception Value:
'ascii' codec can't encode character '\u3042' in position 32: ordinal not in range(128)
Exception Location: /usr/local/anaconda3/lib/python3.9/subprocess.py, line 1754, in _execute_child

コードは以下になります。

# -*- coding: utf_8 -*- from rest_framework import status from rest_framework.views import APIView from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response import subprocess class Mail(APIView): def post(self, request, *args, **kwargs): subject = 'あ' message = 'This is a test mail.' cmd = "echo -e '" + message + "' | mail -s '" + subject + "' test@test.com" subprocess.run(cmd, shell=True, encoding="utf_8", universal_newlines=True) return Response(status.HTTP_200_OK)

色々と調べたところ、subprocess.run() の引数に encoding="utf_8", universal_newlines=True をつければうまくいくと書いてありましたが、状況は変わりません。

解決方法をご存知の方がいれば教えていただきたいです。

以下のコマンドでサーバーから日本語メールを送れるので、Pythonの方の問題だと思っています。

echo -e 'This is a test mail.' | mail -s 'あ' test@test.com

▽追記
サーバーの文字コードはUTF-8になっています。
# echo $LANG
ja_JP.UTF-8

▽追記
対話型モードで実行したところ、エラーが出力されませんでした。

# python3 Python 3.9.12 (main, Apr 5 2022, 06:56:58) [GCC 7.5.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import subprocess >>> subject = 'あ' >>> message = 'test' >>> cmd = "echo -e '" + message + "' | mail -s '" + subject + "' test@test.com" >>> subprocess.run(cmd, shell=True, encoding="utf8", universal_newlines=True) CompletedProcess(args="echo -e 'test' | mail -s 'あ' test@test.com", returncode=0)

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

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

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

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

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

can110

2022/12/09 08:28

エラーメッセージは、どこで発生したかなど詳細が分かるように全文(Traceback)を提示ください。 なおサーバ(API)動作のためエラー確認しずらい場合は subprocess.runするだけの単純な.pyコードをサーバ上のターミナルで実行して エラー全文を提示すると回答得られやすくなるかと思います。 あと、コマンド文字列が「echo -e 'This is a test mail.' | mail -s 'あ' test@test.com」なら エラー発生文字位置(position)は32ではなく42あたりになるべき?なのが気になります。
can110

2022/12/09 09:08

対話環境(ユーザーシェル)では動作するということは、API動作(デーモンプロセス?)上での問題かと。 デーモンプロセスだとユーザーも異なる可能性あるし、そもそもsubprocess.Runが使えるのかといったところも気になるところです。
sasaki0628

2022/12/09 10:39

ご回答ありがとうございました。原因はわかりませんでしたがDjangoの機能を使ったところメールを送れましたので、いったん忘れます。
guest

回答1

0

自己解決

Djangoのsend_mailを使ったところ、日本語のメールも送れました。

from rest_framework import status from rest_framework.views import APIView from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from django.core.mail import send_mail class Mail(APIView): permission_classes = [IsAuthenticated] def post(self, request, *args, **kwargs): subject = 'あいうえお' message = 'TEST MAIL' recipient_list = ['test@test.com'] send_mail(subject, message, "testuser", recipient_list) return Response(status.HTTP_200_OK)

settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'localhost' EMAIL_PORT = '25'

投稿2022/12/09 10:38

sasaki0628

総合スコア106

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問