9
# 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アプリを使用しています。このリンクは長いURLであり、最後にランダムなトークン(30文字以上)があり、その結果、トークンの途中で行が途切れています。

問題がDjangoのファイルベースのEmailBackendを使用していた場合は、 smtpバックエンドに切り替えて、組み込みのPythonsmtpdサーバーをデバッグモードで実行しました。これは私の電子メールをコンソールにダンプしましたが、それでもまだ壊れていました。

django-registrationは機能していると確信しており、何十億もの人々がそれを使用しています:)ですから、これは私が間違ったことや設定を間違えたことに違いありません。何がわからない。

アップデート2-Djangoリストの投稿によると、これは実際には基礎となるPython email.MIMETextオブジェクトであり、正しい場合は、問題をもう少し押し戻すだけです。それでも修正方法はわかりません。ドキュメントを見ると、行の折り返しについても言及しているものは何もありません。

アップデート3(ため息)-MIMETextオブジェクトの問題であるとは除外しました。純粋なPythonプログラムとsmtplib/MIMETextを使用してテストメールを作成および送信しましたが、正常に機能しました。また、charset = "us-ascii"を使用しました。これは、MIMETextオブジェクトでテキストをラップしない唯一の文字セットであると誰かが提案しましそれが正しいかどうかはわかりませんが、Djangoの電子メール出力を詳しく調べたところ、「utf-8」の文字セットが含まれています。

間違った文字セットが問題になる可能性がありますか?もしそうなら、どうすればDjangoで変更できますか?

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 ------------
4

4 に答える 4

6

EmailMessageオブジェクトを作成し、headers = {'format':'flowed'}を渡すことで、電子メールクライアントが78文字のソフト制限を超えないようにすることができる場合があります。

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セットアップを使用して、電子メールヘッダーで定義されたルールに従って電子メールをレンダリングする実際の電子メールクライアントにファイルを送信してみてください。

于 2011-06-09T02:33:25.363 に答える
0

で定義EMAIL_BACKENDしてみてくださいsettings.py。多分それはあなたの問題を解決しないでしょう、しかしそれを定義する正しい場所です、さもなければそれは使われないでしょう。

(ここであなたの問題を解決できるかどうかわからないので、私はあなたにコメントしようとしていましたが、どうやら私はできません。)

于 2011-05-08T22:26:44.423 に答える
0

電子メールの行自体は「壊れている」わけではなく、quoted-printableエンコーディングで表されているだけです。そのため、76文字で=\n挿入されます。有能なメールクライアントは、メッセージを適切にデコードし、中断を削除する必要があります。

decode=Trueデコードされた電子メールの本文を表す場合は、次のget_payloadメソッドに渡すことでこれを使用できます。

body = email.get_payload(decode=True)

これは、quoted-printableエンコーディングをデコードするようにメッセージに指示します。

さらに重要なのは、Pythonコンソールのデバッグサーバーにデコードされたメッセージを出力させることが主な関心事である場合、組み込みのを使用するのではなく、このスニペットのようにすばやく汚いことを行うことができますDebuggingServer。より適切には、「データ」文字列を電子メールオブジェクトとして解析し、気になるヘッダーを印刷してから、本文を。で印刷することができますdecode=True

于 2012-01-25T04:34:16.207 に答える
0

これはpython2.5であり、python2.7で修正されています。

email/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

または、email/generator.pyのこの行で「\t」を「」に変更することもできます

print >> self._fp, Header(
v, maxlinelen=self._maxheaderlen,
header_name=h, continuation_ws='\t').encode()
于 2012-05-01T15:15:43.953 に答える