2010-01-07 5 views
1

J'ai une fonction qui envoie des emails en utilisant le framework de messagerie intégré asp.net. Je l'ai inclus ci-dessous.SmtpClient ne ferme pas la session après l'envoi du message

public void SendMessage() 
{ 
    var message = new MailMessage(); 
    var client = new SmtpClient(); 

    // Get the Message Envelope Details 
    this.LoadMessageDetailsFromFile(); 

    // Process rules (if any): Rules engine not implemented yet! 
    this.SetConfiguration(message); 

    // Formats the message body template using XSLT 
    this.FormatMessageBody(message); 

    // Adds the attachments 
    this.AddAttachments(message); 


    // Send the mail 
    client.Timeout = 999999999; 
    client.Send(message); 

    //Clean up attachments 
    foreach (var attachment in message.Attachments) 
    { 
     attachment.Dispose(); 
    } 
} 

Maintenant, à aucun moment est la taille du message total supérieur à 10 Mo, mais l'échange est produit une erreur en disant que 20Mo est la taille maximale pour chaque session. Est-ce que .net envoie des messages en lot à SMTP? Pourquoi produirait-il cette erreur, même si chaque fois que j'envoie un email, je crée un nouvel objet SMtpClient?

Échange exacte Erreur: la taille de la session dépasse la taille maximale de session fixe

Il semble que la connexion est réutilisée en soulignant, même si vous créez de nouvelles instances de smtpclient.

Quelqu'un sait contourner ce problème, ce qui suit ne fonctionne pas:

Smtp client = new SmtpClient("hostname"); 
client.ServicePoint.MaxIdleTime = 0; 
client.ServicePoint.ConnectionLimit = 1; 

Merci à l'avance

+0

L'hôte du paramètre de serveur SMTP est le serveur Exchange lui-même? –

+0

Oui, c'est correct. –

+1

Je vous suggère de regarder dans le journal Exchange (si possible) pour vérifier si la boucle est réellement considérée comme une session du point de vue de l'échange. –

Répondre

1

Tout smtpclient fourni avec le framework .net ci-dessous v4 Beta 2 est buggy et envoie JAMAIS une commande QUIT au serveur SMTP. Il n'y a pas de solution de contournement. La solution consiste à utiliser une application tierce pour envoyer des emails. .net échoue pour les e-mails de masse sur les serveurs SMTP qui limitent la taille de la session à 20 Mo.

+0

Et quand je parle de masse ici, ne parle pas de spammer la planète, parle de l'envoi de 10 messages dans un intranet ... –

1

Pièces jointes sur e-mails sont codés à l'aide base64, ce qui pourrait les rendre considérablement selon plus sur le contenu du fichier . De the Wikipedia article on base64:

Thus, the actual length of MIME-compliant base64-encoded binary data is usually about 137% of the original data length, though for very short messages the overhead can be a lot higher because of the overhead of the headers. Very roughly, the final size of base64-encoded binary data is equal to 1.37 times the original data size + 814 bytes (for headers). In other words, you can approximate the size of the decoded data with this formula: bytes = (string_length(encoded_string) - 814) /1.37. Please note that these formulas should not be used to calculate the exact memory size to hold encoded data since they are very rough and produce errors in both directions

+0

Informations intéressantes en effet, cependant Si j'ai commencé avec une taille de pièce jointe maximale de 10 Mo, alors cela ne devrait sûrement pas doubler la taille du message? –

+0

C'est peu probable, mais possible. Cela dépend du contenu du fichier, les fichiers texte ne se développent généralement pas beaucoup mais les fichiers binaires peuvent le faire. Pourquoi n'essayez-vous pas d'encoder votre pièce jointe et de vérifier la taille? Vous pourriez être surpris par le résultat. – Rory

+1

Pensez que j'ai trouvé le problème - http://www.vbforums.com/showthread.php?t=584384 –

Questions connexes