2011-05-01 11 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 दृश्य कोड से ऊपर, कि एक टूटी हुई लाइन में शामिल है एक पाठ फ़ाइल में परिणाम: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 पंजीकरण एप्लिकेशन है, जो एक खाता सक्रियण लिंक साथ एक ईमेल भेजता है का उपयोग कर। यह लिंक एक लंबा यूआरएल है, जिसमें एक यादृच्छिक अंत में टोकन (30+ वर्ण) है, और नतीजतन, रेखा टोकन के बीच में टूट रही है।

मामले में समस्या Django के filebased EmailBackend उपयोग कर रहा था, मैं डिबगिंग मोड smtp बैकएंड में स्विच करने और निर्मित अजगर smtpd सर्वर भाग गया,। इसने मेरा ईमेल कंसोल पर छोड़ दिया, जहां यह अभी भी टूट गया था।

मुझे यकीन है कि django-पंजीकरण काम कर रहे लोगों के साथ काम कर रहा है :) तो यह कुछ ऐसा होना चाहिए जो मैंने गलत या गलत कॉन्फ़िगर किया है। मुझे बस कोई सुराग नहीं है।

अद्यतन 2 - एक Django सूची में एक पोस्ट के अनुसार, यह वास्तव में अंतर्निहित Python email.MIMEText object है, जो सही है, केवल समस्या को थोड़ा और धक्का देता है। यह अभी भी मुझे यह नहीं बताता कि इसे कैसे ठीक किया जाए। दस्तावेज़ों को देखते हुए, मुझे कुछ भी दिखाई नहीं देता है जो लाइन-रैपिंग का भी उल्लेख करता है।

अद्यतन 3 (श्वास) - मैंने इसे एक MIMEText ऑब्जेक्ट समस्या से इंकार कर दिया है। मैंने टेस्ट ईमेल बनाने और भेजने के लिए एक शुद्ध पायथन प्रोग्राम और smtplib/MIMEText का उपयोग किया, और यह ठीक काम किया। यह भी ने एक वर्णसेट = "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: [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 में अपग्रेड किया गया, अभी भी समस्या है। (पायथन 2.6 का उपयोग करके) –

+0

जब मैं smtp के साथ परीक्षण करता हूं तो मेरा ईमेल एक यूआरएल अखंड के साथ आता है। फाइलबेस के साथ यह टूटा हुआ है। –

+0

कुछ कोशिश करने के लिए: http://almaer.com/blog/avoiding-broken-links-in-email अपने यूआरएल को '<' 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

मैंने 'हेडर' का उपयोग करने की कोशिश की, कोई प्रभाव नहीं। मुझे यकीन नहीं है कि गैर-डीबग एसएमटीपी सेटअप द्वारा आपका क्या मतलब है - मैंने Django में डिबगिंग बंद कर दी, कोई बदलाव नहीं हुआ। –

+0

आह, मुझे अभी एहसास हुआ कि आप smtp- आधारित बनाम फ़ाइल-आधारित बैकएंड का मतलब है। खैर, मैं विंडोज एक्सपी चला रहा हूं, और मेरे पास * असली * ईमेल सर्वर नहीं है, लेकिन मैंने डिबगिंग सर्वर चलाया जो कि पायथन के smtplib में बनाया गया है - 'python -m smtpd -n -c डिबगिंग सर्वर स्थानीयहोस्ट: 1025'। दस्तावेज़ों से, यह सिर्फ आउटपुट को कंसोल पर प्रिंट करता है, इसलिए मुझे लगता है कि यह कोई स्वरूपण नहीं बदलता है। किसी भी मामले में, इसने समस्या को प्रभावित नहीं किया। –

+0

मैंने आखिरकार एक पायथन एसएमटीपी ऑब्जेक्ट स्थापित किया जो ईमेल भेजने के लिए मेरे आईएसपी में लॉगिन कर सकता था - और यह ठीक से काम करता था। मैं अभी भी अपने आईएसपी को ईमेल भेजने के लिए 'डीजेंगो-पंजीकरण' प्राप्त करने की कोशिश कर रहा हूं, लेकिन अब तक ऐसा लगता है कि यह उत्तर है - स्थानीय, सरल ईमेल सर्वर का उपयोग करने में बस एक समस्या है। –

0

कोशिश अपने settings.py में EMAIL_BACKEND परिभाषित करने के लिए। हो सकता है कि यह आपकी समस्या का समाधान न करे, लेकिन यह सही जगह है जहां इसे परिभाषित किया जाए, अन्यथा यह संभवतः उपयोग नहीं किया जा रहा है।

(के बाद से मुझे यकीन है कि मैं यहाँ अपनी समस्या का समाधान कर रहा हूँ नहीं कर रहा हूँ, मैं अपने पर एक टिप्पणी बनाने की कोशिश कर रहा था, लेकिन जाहिरा तौर पर मैं नहीं कर सकता।)

+0

आह, मैंने इसे सेटिंग.py में रखा था, मैं सिर्फ पोस्ट को संपीड़ित करता हूं। :) मैं इसे ठीक कर दूंगा। और हाँ, टिप्पणी छोड़ने के लिए 50 प्रतिनिधि लगते हैं ... –

0

ईमेल लाइनें "टूटा" नहीं हैं - वे सिर्फ quoted-printable एन्कोडिंग में प्रदर्शित हैं। इस प्रकार, 76 वर्णों पर, =\n डाला गया है। किसी भी सक्षम मेल क्लाइंट को संदेश को ठीक से डीकोड करना और ब्रेक को हटाना चाहिए।

आप डीकोड ईमेल के मुख्य भाग का प्रतिनिधित्व करना चाहते हैं, तो आप get_payload विधि के लिए decode=True पारित करके इस का उपयोग कर सकते हैं:

body = email.get_payload(decode=True) 

यह संदेश बताता है कोटेड-प्रिंटेबल एनकोडिंग डिकोड करने के लिए।

अधिक बिंदु पर, यदि आपकी मुख्य चिंता पाइथन कंसोल डीबगिंग सर्वर को डीकोड किए गए संदेश को प्रिंट करने के लिए प्राप्त कर रही है, तो आप अंतर्निहित DebuggingServer का उपयोग करने के बजाय this snippet जैसे कुछ त्वरित और गंदे कर सकते हैं। अधिक ठीक से, आप "ऑब्जेक्ट" स्ट्रिंग को ईमेल ऑब्जेक्ट के रूप में पार्स कर सकते हैं, जिन शीर्षकों की आप परवाह करते हैं उन्हें प्रिंट करें, फिर decode=True के साथ शरीर को प्रिंट करें।

+0

धन्यवाद, लेकिन मैं वास्तव में पाइथन डीबगिंग ईमेल-सर्वर काम करने के लिए वास्तव में चिंतित नहीं था, बस संदेश लिंक को * वास्तविक * ईमेल सर्वर में ठीक से काम करने के लिए तैयार करता था। मैंने गलती से माना कि समस्या क्या थी * 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() 
संबंधित मुद्दे