2010-09-21 23 views
0

Je suis passé par ce lien. (http://connect.microsoft.com/VisualStudio/feedback/details/544562/cannot-send-e-mails-with-large-attachments-system-net-mail-smtpclient-system-net-mail-mailmessage)Impossible d'envoyer des e-mails avec des pièces jointes volumineuses dans VS 2010

Il n'est pas possible d'envoyer un e-mail avec une pièce jointe supérieure à 4 Mo dans .NET Framework 4.0. Le même code fonctionne pour les fichiers petits et volumineux si vous définissez la plate-forme cible de .NET Framework 4.0 à .NET Framework 3.5. Donc, cela ne peut pas être un problème avec notre configuration de messagerie! Je n'obtiens aucune erreur si j'attache par ex. 10 fichiers de 2 Mo! J'ai cherché dans Google mais je ne l'ai pas compris.

Solution de contournement ne fonctionne pas correctement comme prévu. Après avoir utilisé cette solution de contournement pendant un moment, j'ai constaté que certains fichiers sont endommagés. Donc ce n'est pas une solution pour ce bug.

Nous avons appliqué ce correctif Microsoft et le problème persiste.
Quelqu'un peut-il me dire comment résoudre ce problème?

Répondre

0

Solution possible via SMTP répertoire de collecte

Je ne sais pas si le bogue est dans le code qui envoie le message via SMTP ou MailMessage sérialisation avec de grandes pièces jointes. Si c'est dans l'envoi et que la sérialisation est correcte, vous pouvez essayer de le surmonter en utilisant l'envoi via le répertoire de collecte.

Quelque chose comme ceci:

 //create the mail message 
     MailMessage mail = new MailMessage(); 

     //set the addresses 
     mail.From = new MailAddress("[email protected]"); 
     mail.To.Add("[email protected]"); 

     //set the content 
     mail.Subject = "This is an email"; 
     mail.Body = "this is the body content of the email."; 

     //if we are using the IIS SMTP Service, we can write the message 
     //directly to the PickupDirectory, and bypass the Network layer 
     SmtpClient smtp = new SmtpClient(); 
     smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis; 
     smtp.Send(mail); 

Vous auriez besoin sur la même machine un serveur exécutant SMTP Microsoft (Microsoft IIS, Microsoft Exchange) en tant que votre code est exécuté.

Autre solution:

L'utilisation d'un composant SMTP tiers qui ne dispose pas de limitation de taille des pièces jointes pourrait être un moyen d'aller (notre Rebex Secure Mail .NET component est par exemple d'une telle bibliothèque SMTP).

0

Ceci est probablement le premier bogue signalé par le client à ce jour pour System.Net.Mail Class dans .NET 4.0 Framework, ou au moins le premier sur lequel j'ai travaillé. C'était assez simple repro et je n'ai pas eu à faire beaucoup pour reproduire le problème localement.

static void Main(string[] args) 

    { 

     SmtpClient client = new SmtpClient("contoso_smtp_server"); 
     client.Credentials = new System.Net.NetworkCredential("User1", "Password", "contoso"); 


     MailMessage msg = new MailMessage("[email protected]", "[email protected]", "Large Attachment Mail", "Large Attachment - Test Body"); 

     Attachment attachment = new Attachment(@"d:\3mb.dat"); 
     msg.Attachments.Add(attachment); 

     client.Send(msg); 


    } 

Ce fut le code le plus simple que vous pourriez écrire à envoyer email à l'aide SNM mais le problème est-il échouer avec une « erreur dans l'envoi d'e-mail » message. J'ai donc regardé autour de ce qui se passait et j'ai trouvé que le problème n'était pas directement lié à SNM mais à ses classes sous-jacentes et en particulier la classe Base64Encoding qui était utilisée comme méthode par défaut d'encodage des pièces jointes lors de l'envoi. Cela m'a sauvé plus de dépannage et j'ai changé la façon dont les pièces jointes ont été encodées de Base64 à 7Bit et cela a fonctionné comme charme.

Alors tout ce que vous devez faire est d'ajouter l'une des lignes suivantes à votre code pour le faire fonctionner.

Tout "un" de ces deux sections de code fonctionnera

attachment.TransferEncoding = System.Net.Mime.TransferEncoding.QuotedPrintable; 

attachment.TransferEncoding = System.Net.Mime.TransferEncoding.SevenBit; 

Cette solution a été trouvée dans this post