2016-07-04 54 views
10

Provo a inviare System.Net.Mail.MailMessage con System.Net.Mail.Attachment.allegato e-mail con nome lungo non ascii

Nome di attaccamento è "Счёт-договор №4321 от 4 июля.pdf"

codice per la creazione di attacco:

var nameEncoding = Encoding.UTF8; 
return new System.Net.Mail.Attachment(new MemoryStream(bytes), 
             MessageBodiesHelpers.EncodeAttachmentName(fileName, nameEncoding), 
             attachment.MediaType) 
     { 
      TransferEncoding = TransferEncoding.Base64, 
      NameEncoding = nameEncoding 
     }; 

codice all'interno MessageBodiesHelpers.EncodeAttachmentName tratto da https://social.msdn.microsoft.com/Forums/en-US/b6c764f7-4697-4394-b45f-128a24306d55/40-smtpclientsend-attachments-mit-umlauten-im-dateinamen?forum=dotnetframeworkde

Se invio che allegato a gmail o scambio di ms, quindi il nome dell'allegato decodificato con successo. MA!

Se invio che l'attaccamento a icloud allora ottengo "???? - ??????? №4321 от4 ???? pdf."

posta intestazioni di attacco:

da Exchange ms:

Content-Type: application/pdf; 
    name="=?utf-8?B?0KHRh9GR0YIt0LTQ?==?utf-8?B?vtCz0L7QstC+0YAg?==?utf-8?B?4oSWNDMyMSDQvtGC?==?utf-8?B?IDQg0LjRjtC70Y8u?==?utf-8?B?cGRm?=" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

Da icloud:

Content-Transfer-Encoding: BASE64 
Content-Type: APPLICATION/PDF; 
    name="????-??????? =?utf-8?B?4oSWNDMyMSDQvtGC?= 4 ????.pdf" 

Come formattare il nome per icloud?

upd

Se inoltro messaggio da Outlook (scambio ms) a icloud, quindi il nome di attaccamento decodificati con successo. Intestazioni:

Content-Transfer-Encoding: BASE64 
Content-Disposition: ATTACHMENT; 
    size=200702; 
    modification-date="Mon, 04 Jul 2016 13:40:22 GMT"; 
    filename*=utf-8''%D0%A1%D1%87%D1%91%D1%82%2D%D0%B4%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%20%E2%84%964321%20%D0%BE%D1%82%204%20%D0%B8%D1%8E%D0%BB%D1%8F.pdf; 
    creation-date="Mon, 04 Jul 2016 13:40:22 GMT" 
Content-Type: APPLICATION/PDF; 
    name*=utf-8''%D0%A1%D1%87%D1%91%D1%82%2D%D0%B4%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%20%E2%84%964321%20%D0%BE%D1%82%204%20%D0%B8%D1%8E%D0%BB%D1%8F.pdf 

UPD2

Se leggo i messaggi utilizzando l'interfaccia Web di icloud (icloud.com), quindi il nome di attaccamento decodificati con successo.

+1

si è in grado di inviare l'allegato correttamente per iCloud con un normale client di posta elettronica? Outlook ad esempio? –

+0

@MartinBrown, post modificato – mif

+3

Forse icloud non supporta l'unicode. Ma proverei Encoding.UTF16; – Paparazzi

risposta

3

In .NET 4.0 SmtpClient ora implementa i limiti di lunghezza della linea RFC (76 caratteri). Ciò ha richiesto ampie modifiche al processo di codifica e non ha coperto alcuni problemi come quello che descrivi.

Nel tuo caso, c'è un problema con i nomi degli allegati non ascii che sarebbero codificati su più di 41 utf-8 byte (Encoding.UTF8.GetByteCount (fileName);). In questo scenario i nomi sono codificati due volte e possono avere interruzioni di riga aggiuntive in essi. L'unica soluzione nota è limitare la lunghezza dei nomi di file non ASCII.

si può leggere questo post per ulteriori informazioni circa il vostro problema

+0

Conosco quell'errore. E quando limite il nome del file, tutto è ok. Ma perché altre app di posta gestiscono il problema? – mif

0

sembra che sia bug icloud esterna. Puoi dare un feedback su questo problema here.

0

Dai un'occhiata a questo discussion. Potrebbe essere necessario tradurlo però o semplicemente guardare il codice. This ha anche alcune informazioni utili e fa riferimento al primo collegamento come soluzione alternativa.

+0

Ho già utilizzato il codice da questa discussione. Link nella domanda. – mif