2014-06-24 3 views
5

मैं अनुरोध पोस्ट करने के लिए पाइथन अनुरोध का उपयोग कर रहा हूं। जब अटैचमेंट पैरामीटर में कुछ गैर असीसी वर्ण होते हैं तो अपवाद उठाया जाता है, अन्य अवसरों में जहां केवल एसीआईआई डेटा मौजूद होता है, सब कुछ ठीक है।पायथन गैर असीसी फ़ाइल नामों के साथ मुद्दों का अनुरोध करता है

you can see the exception here

response = requests.post(url="https://api.mailgun.net/v2/%s/messages" % utils.config.mailDomain, 
       auth=("api", utils.config.mailApiKey), 
       data={ 
         "from" : me, 
         "to" : recepients, 
         "subject" : subject, 
         "html" if html else "text" : message 
        }, 

       files= [('attachment', codecs.open(f.decode('utf8'))) for f in attachments] if attachments and len(attachments) else []         
       ) 

संपादन: UTF8 के साथ फ़ाइल नाम डिकोडिंग करने के बाद, मैं एक अपवाद हालांकि फ़ाइल संलग्न नहीं है नहीं मिलता है। मैं अपने नाम में केवल ASCII वर्ण के साथ एक फ़ाइल संलग्न अनुरोध डिबग, और अनुरोध हेडर अनुरोधों का निर्माण होता है:

{'Content-Type': None, 'Content-Location': None, 'Content-Disposition': u'form-data; name="attachment"; filename="Hello.docx"'} 

यह सफल होता है, मैं अनुलग्नकों के साथ मेल हो रही है।

हालांकि, जब हिब्रू पात्रों के साथ एक फ़ाइल का उपयोग कर, अनुरोध के हेडर है:

{'Content-Type': None, 'Content-Location': None, 'Content-Disposition': 'form-data; name="attachment"; filename*=utf-8\'\'%D7%91%D7%93%D7%99%D7%A7%D7%94.doc'} 

मैं मेल प्राप्त लेकिन यह करने के लिए संलग्न फाइल के बिना। कोई विचार?

+0

हमें त्रुटि ट्रेस दिखा सकते हैं। आपके द्वारा प्रदान की जाने वाली तस्वीर से पता चलता है कि अप्रत्याशित वर्णों के साथ हेडर बनाने का कुछ प्रयास है। लेकिन यह आपके कोड में आपके पास कई मानों का मामला हो सकता है और स्टैकट्रैक हमें और बताएगा। आदर्श रूप में आपको कोड का छोटा टुकड़ा प्रदान करना चाहिए, जो समस्या को चलाता है और दिखाता है। वर्तमान में बहुत अधिक पुन: उत्पन्न करना संभव नहीं है। –

उत्तर

3

जब फ़ाइल नाम में गैर-एसीआईआई है, तो पुस्तकालय अनुरोध मानक RFC 2231 के बाद इसे एन्कोड करता है। प्रारूप जैसा आपने देखा: filename*=utf-8''......। ऐसा लगता है कि मेलगुन इस मानक का समर्थन नहीं करता है, नतीजतन, गैर-असीसी फाइलनाम खो गए हैं। यूनिकोड फ़ाइल नामों के लिए वे किस प्रारूप की अपेक्षा करते हैं, यह पुष्टि करने के लिए आप मेलगुन से संपर्क कर सकते हैं।

एक नहीं के सही समाधान के रूप में आप के रूप में गैर-ascii वर्ण की जगह ले सकता:

def replace_non_ascii(x): return ''.join(i if ord(i) < 128 else '_' for i in x) 

और जब के रूप में अनुरोध (मान attachments यूनिकोड आधारित फ़ाइल नामों की सूची है) पर कॉल स्पष्ट रूप से फ़ाइल नाम निर्दिष्ट करें:

files= [('attachment', (replace_non_ascii(f), codecs.open(f))) for f in attachments] ... 

संपादन

आप हैडर प्रारूप अनुकूलित करने के लिए चाहते हैं, के बजाय मान (चलो ओ च मानक RFC 2231) MailGun प्रारूप इस तरह का स्वीकार कर सकते हैं:

filename="%D7%91%D7%93%D7%99%D7%A7%D7%94.doc" 

तो फिर तुम के रूप में फ़ाइल नामों को अनुकूलित कर सकते हैं:

import urllib 
def custom_filename(x): return urllib.quote(x.encode('utf8')) 

files= [('attachment', (custom_filename(f), codecs.open(f))) for f in attachments] ... 

MailGun की प्रतिक्रिया पर निर्भर करता है, यह संभव हो सकता है कि आप में से कोड बदलाव करने की जरूरत है requests या इसके बजाय निम्न स्तर की लाइब्रेरी (urllib2) का उपयोग करें। उम्मीद है कि वे आरएफसी 2231

+0

मैं पहले से ही ऐसा कर रहा हूं, समस्या यह है कि फाइल किसी कारण से नहीं जाती है ... कोई अपवाद नहीं है (संपादन अनुभाग में देखें)। भ्रम से बचने के लिए मैं प्रश्न में कोड अपडेट करूंगा –

+0

धन्यवाद, मैं मेलगुन से जांच करूंगा। यदि ऐसा है, तो मैं मेलकुन के तरीके से यूनिकोड फ़ाइल नामों के इलाज के लिए अनुरोध कैसे कर सकता हूं? –

+0

धन्यवाद, मेलगुन की प्रतिक्रिया के लिए इंतजार करेंगे –

संबंधित मुद्दे