OpenSmtp は .Net プラットフォーム上で優れた電子メール送信コンポーネントですが、使用中に電子メールの件名が長いと文字化けするメッセージが発生するバグがいくつかありました。
ソース コードを確認したところ、元の処理プロセスに問題があることが判明しました。まず、テーマが ASCII でエンコードされ、次に QP エンコードが使用されていましたが、テーマとコンテンツの違いが考慮されていませんでした。
テーマ内でコーディングする場合、各行を個別にコーディングする必要があり、テーマ全体をコーディングすることはできません。
Outlook Express と比較した後、電子メールの件名専用に Base64 エンコードを実行するメソッドが MailEncoding クラスに追加されます。
public static string ConvertHeaderToBase64(string s, string charset)
{
int lineLength = 40; // 各行は 40 バイトを処理します。
エンコーディング encoding = Encoding.GetEncoding( charset ); // 指定されたエンコーディングを取得します。
byte[] バッファ = encoding.GetBytes( s ); // バイトコードに変換します。
StringBuilder sb = new StringBuilder() // 最終結果を保存します。
文字列 linebase64;
int block =buffer.Length%lineLength==0?buffer.Length/lineLength:buffer.Length/lineLength+1;
for(int i=0; i< ブロック; i++)
{
if(buffer.Length - i*lineLength >=lineLength )
linebase64 = Convert.ToBase64String( バッファ, i*lineLength, lineLength );
それ以外
linebase64 = Convert.ToBase64String( バッファ, i*lineLength, バッファ.Length - i*lineLength);
sb.Append( "=?" );
sb.Append(文字セット);
sb.Append( "?B?" );
sb.Append(linebase64);
sb.Append( "?=rnt" );
}
sb.Remove( sb.Length-3, 3); // 最後の改行文字を削除します。
sb.ToString() を返します。
}
次に、MailMessage クラスの ToString メソッドで電子メールの件名の処理を変更し、カスタム メソッドを呼び出します。
// sb.Append("Subject: " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "rn");
sb.Append("件名: " + MailEncoder.ConvertHeaderToBase64( cleanSubject.ToString(), charset) + "rn");
再コンパイルするだけです
出典: haogj