2014-06-24 23 views
5

Bir istek göndermek için python isteklerini kullanıyorum. , ek parametresinin bazı ascii karakterleri içermediğinde, yalnızca ascii verilerin bulunduğu başka durumlarda bir istisna kaldırılır, her şey yolundadır.python, ascii dosya adlarıyla ilgili sorunları ister

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 []         
       ) 

DÜZENLEMELER: utf8 ile dosya adını deşifre sonra, ancak dosya ekli olmayan bir istisna alamadım. Ben adında tek ASCII karakterlerle bir dosya ekleyebilir ile isteklerini ayıklanmış ve başlıkları istekleri inşa istek:

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

Bu başarılı, ben ekleri ile posta alıyorum. İbranice karakterlerle bir dosya kullanırken

Ancak, isteğin başlık budur:

{'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'} 

ben posta almak ama ona bağlı dosyası olmadan. Herhangi bir fikir?

+0

Hata izleme işlemini bize destekleyebilirler. Sağladığınız resim, beklenmedik karakterlere sahip bir başlık oluşturma girişimi olduğunu gösteriyor. Ancak bu, kodunuzda sahip olduğunuz birden fazla değer için bir durum olabilir ve stacktrace bize daha fazlasını anlatacaktır. İdeal olarak sorunu yöneten ve gösteren kısa bir kod parçası sağlamalısınız. Şu anda çok çoğaltmak mümkün değildir. –

cevap

3

Dosya adı ascii içermediğinde, kitaplık istekleri standart RFC 2231'u izleyerek kodlar. Biçim, gördüğünüz şeydir: filename*=utf-8''....... MailGun bu standardı desteklemiyor gibi görünüyor, sonuç olarak, ascii dosya isimleri kayboldu. Unicode dosya isimleri için bekledikleri biçimleri doğrulamak için MailGun ile iletişime geçebilirsiniz. Bir değil mükemmel çözüm olarak

, siz ASCII olmayan karakter değiştirebilirsiniz:

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

Ve istekleri (attachments varsayalım unicode tabanlı dosya adları listesi) çağrılırken açıkça dosya adını belirtin:

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

o üstbilgi biçimini özelleştirmek istiyorsanız, Onun yerine (varsayalım

EDITS f standart RFC 2231) Mailgun formatında bu tür kabul edebilir:

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

Sonra olarak dosya adlarını özelleştirebilirsiniz: Mailgun yanıtına bağlı olarak

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

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

, size ait kodları çimdik gerektiğini mümkün olabilir requests veya bunun yerine düşük düzeyli kitaplıklar (urllib2) kullanın. Umarız RFC 2231

+0

Zaten bunu yapıyorum, sorun şu ki dosya bir nedenden ötürü geçmiyor ... istisna yoktur (düzenleme bölümünde bakınız). Ben de karışıklıklarını önlemek için sorudaki kodu güncelleyeceğim –

+0

Teşekkürler, mailGun ile kontrol edeceğim. Durum buysa, mailGun'un ifade ettiği biçimlerde unicode dosya adlarını işleme isteklerini nasıl zorlayabilirim? –

+0

Teşekkürler, mailgunun cevabını bekleyecek –

İlgili konular