OpenSmtp ist eine gute E-Mail-Versandkomponente auf der .Net-Plattform, es gibt jedoch einige Fehler, die unsere Verwendung beeinträchtigen. Bei der Verwendung bin ich auf verstümmelte Nachrichten gestoßen, wenn die E-Mail-Betrefflänge groß war.
Nach der Überprüfung des Quellcodes wurde festgestellt, dass es Probleme mit dem ursprünglichen Verarbeitungsprozess gab: Erstens wurde das Thema über ASCII kodiert, und zweitens wurde QP-Kodierung verwendet, aber der Unterschied zwischen Thema und Inhalt wurde nicht berücksichtigt.
Beim Codieren innerhalb von Themen muss jede Zeile einzeln codiert werden und das gesamte Thema kann nicht codiert werden.
Nach dem Vergleich mit Outlook Express wird der MailEncoding-Klasse eine Methode hinzugefügt, um die Base64-Codierung speziell für den E-Mail-Betreff durchzuführen.
öffentlicher statischer String ConvertHeaderToBase64(String s, String-Zeichensatz)
{
int lineLength = 40; // Jede Zeile verarbeitet 40 Bytes
Encoding binding = Encoding.GetEncoding( charset ); // Die angegebene Codierung abrufen
byte[] buffer = binding.GetBytes( s ); // In Bytecode konvertieren
StringBuilder sb = new StringBuilder(); // Das Endergebnis speichern
Zeichenfolge linebase64;
int block = buffer.Length%lineLength==0?buffer.Length/lineLength:buffer.Length/lineLength + 1;
for(int i=0; i< block; i++)
{
if( buffer.Length - i*lineLength >=lineLength )
linebase64 = Convert.ToBase64String( buffer, i*lineLength, lineLength );
anders
linebase64 = Convert.ToBase64String( buffer, i*lineLength, buffer.Length - i*lineLength);
sb.Append( "=?" );
sb.Append(charset);
sb.Append( "?B?" );
sb.Append(linebase64);
sb.Append( "?=rnt" );
}
sb.Remove( sb.Length-3, 3); // Letztes Zeilenumbruchzeichen entfernen
return sb.ToString();
}
Ändern Sie dann die Verarbeitung des E-Mail-Betreffs in der ToString-Methode in der MailMessage-Klasse, um eine benutzerdefinierte Methode aufzurufen
// sb.Append("Subject: " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "rn");
sb.Append("Subject: " + MailEncoder.ConvertHeaderToBase64( cleanSubject.ToString(), charset) + "rn");
Einfach neu kompilieren.
Quelle: haogj