OpenSmtp est un bon composant d'envoi d'e-mails sur la plate-forme .Net, mais il contient quelques bugs qui affectent notre utilisation. Lors de l'utilisation, j'ai rencontré des messages tronqués lorsque la longueur du sujet de l'e-mail était longue.
Après avoir vérifié le code source, il a été constaté qu'il y avait des problèmes avec le processus de traitement d'origine : premièrement, le thème était encodé via ASCII, et deuxièmement, l'encodage QP était utilisé, mais la différence entre le thème et le contenu n'était pas prise en compte.
Lors du codage au sein de thèmes, chaque ligne doit être codée individuellement et le thème entier ne peut pas être codé.
Après comparaison avec Outlook Express, une méthode est ajoutée à la classe MailEncoding pour effectuer un codage Base64 spécifiquement pour le sujet de l'e-mail.
chaîne statique publique ConvertHeaderToBase64 (string s, string charset)
{
int lineLength = 40; // Chaque ligne traite 40 octets
Encoding encoding = Encoding.GetEncoding( charset ); // Récupère l'encodage spécifié
byte[] buffer = encoding.GetBytes( s ); // Convertir en bytecode
StringBuilder sb = new StringBuilder(); // Enregistre le résultat final
chaîne linebase64;
int block = buffer.Length%lineLength==0?buffer.Length/lineLength:buffer.Length/lineLength + 1;
pour(int i=0; i< bloc; i++)
{
if( buffer.Length - i*lineLength >=lineLength )
linebase64 = Convert.ToBase64String( buffer, i*lineLength, lineLength );
autre
linebase64 = Convert.ToBase64String( buffer, i*lineLength, buffer.Length - i*lineLength);
sb.Append( "=?" );
sb.Append(jeu de caractères);
sb.Append( "?B?" );
sb.Append(linebase64);
sb.Append( "?=rnt" );
}
sb.Remove( sb.Length-3, 3); // Supprime le dernier caractère de nouvelle ligne
return sb.ToString();
}
Modifiez ensuite le traitement du sujet de l'e-mail dans la méthode ToString de la classe MailMessage pour appeler une méthode personnalisée
// sb.Append("Sujet : " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "rn");
sb.Append("Sujet : " + MailEncoder.ConvertHeaderToBase64( cleanSubject.ToString(), charset) + "rn");
Il suffit de recompiler
Source : haogj