djangoメールアプリの破損 - 最大線の長さ(およびそれを変更する方法)?
-
27-10-2019 - |
質問
# settings.py
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
# view.py
from django.core.mail import send_mail
def send_letter(request):
the_text = 'this is a test of a really long line that has more words that could possibly fit in a single column of text.'
send_mail('some_subject', the_text, 'me@test.com', ['me@test.com'])
上記のDjangoビューコードは、壊れた線を含むテキストファイルになります。
this is a test of a really long line that has more words that could possibl=
y fit in a single column of text.
-------------------------------------------------------------------------------
出力ファイルにラインブレイクがないように、変更方法を知っている人はいますか?これを制御するDjangoには、いくつかの設定がありますか? Djangoのバージョン1.2。
更新 - レベルをバックアップして私の元の問題を説明するために:)私は Django-Registration アプリ、anで電子メールを送信しますアカウントのアクティベーションリンク. 。このリンクは長いURLであり、最後にランダムなトークン(30文字以上)があり、その結果、トークンの中央でラインが壊れています。
問題がDjangoを使用していた場合 ファイルベース 電子メールバックエンド、私はに切り替えました SMTP デバッグモードで、組み込みのPython SMTPDサーバーをバックエンドして実行しました。これは私のメールをコンソールに投げ捨てました。そこではまだ壊れていました。
私は確信しています Django-Registration 何十人もの人々がそれを使用して働いています:)それは私が間違ったことをしたことや間違っていることでなければなりません。何が手がかりがありません。
更新2- djangoリストの投稿によると、それは本当に根本的なものです python email.mimetextオブジェクト, 、正しい場合は、問題をもう少し押し戻すだけです。それはまだそれを修正する方法を教えてくれません。ドキュメントを見ると、ラインラッピングに言及することさえありません。
更新3(ため息) - 私はそれがmimetextオブジェクトの問題であることを排除しました。 Pure PythonプログラムとSMTPLIB/MIMETEXTを使用して、テストメールを作成および送信しましたが、正常に機能しました。これ また charset = "us-ascii"を使用しました。 いいえ Mimetextオブジェクトでテキストをラップします。それが正しいかどうかはわかりませんが、Djangoの電子メール出力をもっと詳しく見ていて、「UTF-8」の炭みがあります。
間違ったチャーセットが問題になる可能性がありますか?もしそうなら、どうしますか 変化する ダジャンゴで?
これが、Djangoのメールからの出力ストリーム全体です。
---------- MESSAGE FOLLOWS ----------
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Subject: some_subject
From: me@test.com
To: me@test.com
Date: Tue, 17 May 2011 19:58:16 -0000
this is a test of a really long line that has more words that could possibl=
y fit in a single column of text.
------------ END MESSAGE ------------
解決
電子メールクライアントに78文字のソフトリミットを削除してもらうことができる場合があります。電子メールメッサージオブジェクトを作成し、ヘッダー= {'format': 'flowed'}を渡すことで:
from django.core.mail import EmailMessage
def send_letter(request):
the_text = 'this is a test of a really long line that has more words that could possibly fit in a single column of text.'
email = EmailMessage(
subject='some_subject',
body=the_text,
from_email='me@test.com',
to=['me@test.com'],
headers={'format': 'flowed'})
email.send()
これがうまくいかない場合は、非障害のあるSMTPセットアップを使用して、電子メールヘッダーで定義されているルールに従って電子メールをレンダリングする実際の電子メールクライアントにファイルを送信してみてください。
他のヒント
これはPython2.5であり、Python2.7で固定されています。
電子メール/generator.pyの関連するコードには、今すぐコメントがあります
# Header's got lots of smarts, so use it. Note that this is
# fundamentally broken though because we lose idempotency when
# the header string is continued with tabs. It will now be
# continued with spaces. This was reversedly broken before we
# fixed bug 1974. Either way, we lose.
ここでバグについて読むことができます http://bugs.python.org/issue1974
または、この電子メール/generator.pyのこの行で「 t」を ''に変更するだけです
print >> self._fp, Header(
v, maxlinelen=self._maxheaderlen,
header_name=h, continuation_ws='\t').encode()
定義してみてください EMAIL_BACKEND
あなたの中で settings.py
. 。たぶんそれはあなたの問題を解決しないかもしれませんが、それを定義する適切な場所です。そうでなければ、それは使用されないでしょう。
(私はここであなたの問題を解決しているかどうかわからないので、私はあなたにコメントをしようとしていましたが、どうやらできません。)
メールラインは「壊れている」わけではありません - それらはただ表現されています 引用プリント可能 エンコーディング。そのため、76文字で、 =\n
挿入されます。有能なメールクライアントは、メッセージを適切にデコードし、ブレークを削除する必要があります。
デコードされた電子メールの本文を表現したい場合は、渡すことでこれを使用できます decode=True
に get_payload
方法:
body = email.get_payload(decode=True)
これにより、引用された印刷可能なエンコードをデコードするメッセージが表示されます。
さらに重要なことに、あなたの主な関心事がPythonコンソールのデバッグサーバーを取得してメッセージをデコードした場合、すぐに汚いことをすることができます このスニペット 内蔵を使用するのではなく DebuggingServer
. 。より適切には、「データ」文字列を電子メールオブジェクトとして解析し、気にするヘッダーを印刷してから、ボディを印刷することができます decode=True
.