2011-05-01 2 views
6
# 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, '[email protected]', ['[email protected]']) 

장고보기 코드, 파선이 포함 된 텍스트 파일에 결과 :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에서 이것을 제어하는 ​​설정이 있습니까? 장고 1.2 버전.

업데이트 - 내 원래의 문제를 수준을 백업하고 설명 할 :) 나는 하는데요 계정 활성화 링크 된 이메일을 보내는 장고 등록 응용 프로그램을 사용하여. 이 링크는 긴 URL이며 끝 부분에 임의의 토큰 (30 자 이상)이 있으므로 토큰 중간에 줄이 끊어집니다.

하는 경우 문제가 장고의 filebased EmailBackend을 사용했는데, 나는 디버깅 모드에서 SMTP 백엔드로 전환하고, 파이썬 내장 smtpd를 서버를 달렸다. 이것은 나의 이메일을 콘솔에 버렸고, 여전히 고장났다.

나는 장고 등록이 (가) 사용하는 수많은 사람들과 함께 작동하고 있다는 것을 확신합니다. 그래서 내가 잘못했거나 잘못 구성된 것일 것입니다. 나는 단서가 없다.

업데이트 2 - Django 목록의 게시물에 따르면, 실제로는 Python email.MIMEText object의 근원이며 올바른 경우 문제를 조금만 푸시합니다. 아직 해결 방법을 알려주지 않습니다. 문서를 살펴보면 줄 바꿈을 언급하는 내용이 전혀 없습니다.

업데이트 3 (한숨) - 나는 그것이 MIMEText 객체 문제라는 것을 배제했습니다. 필자는 순수 Python 프로그램과 smtplib/MIMEText를 사용하여 테스트 전자 메일을 작성하고 보냈다. 또한 은 charset = "us-ascii"를 사용했습니다. 누군가가 제안한 유일한 문자는 이 아니며,은 MIMEText 객체의 텍스트를 줄입니다. 그게 맞는지 아닌지는 모르겠지만 Django 이메일 출력을 더 자세히 살펴 봤는데 "utf-8"의 문자 세트가 있습니다.

잘못된 charset이 문제가 될 수 있습니까? 그렇다면 어떻게해야합니까 장고에서 변경합니까?

여기 장고의 이메일에서 전체 출력 스트림입니다 :

---------- MESSAGE FOLLOWS ---------- 
Content-Type: text/plain; charset="utf-8" 
MIME-Version: 1.0 
Content-Transfer-Encoding: quoted-printable 
Subject: some_subject 
From: [email protected] 
To: [email protected] 
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 ------------ 
+0

참고 - Django 1.3으로 업그레이드되었지만 여전히 문제가 있습니다. (또한 Python 2.6 사용) –

+0

내가 smtp로 테스트 할 때 URL에 깨지지 않은 메일이있다. 파일이 손상된 것입니다. –

+0

시도 할 항목 : http://almaer.com/blog/avoiding-broken-links-in-email URL을 '<' and '>'으로 둘러 쌉니다. (이메일 클라이언트 일이라고 생각합니다) –

답변

4

당신은하지 않도록 이메일 클라이언트를 얻을 수 있습니다 {: '유입' '형식'}과 같이이 작동하지 않는 경우

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='[email protected]', 
     to=['[email protected]'], 
     headers={'format': 'flowed'}) 

    email.send() 

이 아닌 디버그 SMTP를 사용하려고 EmailMessage 객체를 생성하고 헤더 =에 전달하여 78 문자 소프트 제한에 휴식 전자 메일 헤더에 정의 된 규칙에 따라 전자 메일을 렌더링하는 실제 전자 메일 클라이언트로 파일을 보내도록 설정합니다.

+0

'headers'를 사용해 보았습니다. 아무런 효과가 없었습니다. 내가 디버그가 아닌 smtp 설정에 의해 당신이 무슨 뜻인지 모르겠다 - 나는 장고에서 디버깅을 해제, 변경하지 않았다. –

+0

아, 방금 당신이 smtp 기반 대 파일 기반 백엔드라는 것을 깨달았습니다. 글쎄요, 저는 Windows XP를 실행 중이고 실제 이메일 서버가 없습니다. 그러나 Python의 smtplib에 내장 된 디버깅 서버를 실행했습니다. - python -m smtpd -n -c DebuggingServer localhost : 1025'. 문서에서 출력물을 콘솔로 출력하기 때문에 형식을 변경하지 않는다고 생각합니다. 어쨌든, 그것은 문제에 영향을 미치지 않았습니다. –

+0

필자는 전자 메일을 보내기 위해 ISP에 로그인 할 수있는 Python smtp 개체를 설치했습니다. 제대로 작동했습니다. 나는 여전히'장고 등록 (django-registration) '을 ISP에 이메일로 보내려고 노력하고 있지만, 지금까지는 대답이 아닌 것처럼 보입니다. 로컬의 단순한 전자 메일 서버를 사용할 때의 문제입니다. –

0

시도가 settings.pyEMAIL_BACKEND을 정의 할 수 있습니다. 어쩌면 문제를 해결할 수는 없지만 그것을 정의 할 수있는 적절한 곳입니다. 그렇지 않으면 사용하지 않을 가능성이 있습니다.

(내가 여기 당신의 문제를 해결하고있어 확실하지 않다 때문에, 당신의 코멘트를 만들려고 노력했지만, 분명히 나는 ​​할 수 없습니다.)

+0

아, settings.py에 넣었는데, 나는 일종의 게시물을 압축했다. :) 나는 그것을 고칠 것이다. 그리고 네, 의견을 남기려면 50 명의 담당자가 필요합니다 ... –

0

이메일 회선 자체는 "깨진"것이 아니며 단지 quoted-printable 인코딩으로 표시됩니다. 따라서 76 자에서 =\n이 삽입됩니다. 유능한 메일 클라이언트는 메시지를 올바르게 해독하고 휴식을 취해야합니다. 당신이 디코딩 이메일 본문을 표현하려면

, 당신하여 get_payload 방법에 decode=True를 전달하여이를 사용할 수 있습니다

body = email.get_payload(decode=True) 

이것은 인용 - 인쇄 가능한 인코딩 디코딩하는 메시지를 알려줍니다.

중요한 점은 파이썬 콘솔 디버깅 서버가 디코딩 된 메시지를 인쇄하도록하는 경우 DebuggingServer을 사용하는 것보다 this snippet과 같이 빠르고 더러운 작업을 수행 할 수 있다는 것입니다. 보다 적절하게, "데이터"문자열을 이메일 객체로 구문 분석하고 관심있는 헤더를 인쇄 한 다음 decode=True으로 본문을 인쇄 할 수 있습니다.

+0

감사하지만 실제로 Python 디버깅 전자 메일 서버 작동에 관심이 없었습니다. 실제로 메시지 링크가 실제 전자 메일 서버에서 올바르게 작동하도록했습니다. * Django *에 문제가있었습니다. 디버깅 서버가 어떻게 해석했는지가 아닌 생성. –

1

나는이 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

에 대해 읽을 수 있습니다 또는 당신은 단지 '\의 t'에 ''를 변경할 수 없다는 의견이 있습니다 이 줄의 이메일/generator.py

print >> self._fp, Header(
v, maxlinelen=self._maxheaderlen, 
header_name=h, continuation_ws='\t').encode()