OpenSmtp adalah komponen pengiriman email yang bagus di platform .Net, tetapi ada beberapa bug di dalamnya yang memengaruhi penggunaan kami. Selama penggunaan, saya menemukan pesan yang kacau ketika panjang subjek email terlalu besar.
Setelah memeriksa kode sumber, ditemukan bahwa ada masalah dengan proses pemrosesan aslinya: pertama, tema dikodekan melalui ASCII, dan kedua, pengkodean QP digunakan, tetapi perbedaan antara tema dan konten tidak dipertimbangkan.
Saat mengkode dalam tema, setiap baris harus diberi kode satu per satu dan keseluruhan tema tidak dapat dikodekan.
Setelah dibandingkan dengan Outlook Express, sebuah metode ditambahkan ke kelas MailEncoding untuk melakukan pengkodean Base64 khusus untuk subjek email.
string statis publik ConvertHeaderToBase64(string s, string charset)
{
int lineLength = 40; // Setiap baris memproses 40 byte
Pengkodean pengkodean = Encoding.GetEncoding( charset ); // Dapatkan pengkodean yang ditentukan
byte[] buffer = pengkodean.GetBytes( s ); // Konversikan ke bytecode
StringBuilder sb = new StringBuilder(); // Simpan hasil akhir
string linebase64;
int blok = buffer.Length%lineLength==0?buffer.Length/lineLength:buffer.Length/lineLength + 1;
untuk(int i=0; saya< blok; i++)
{
if( buffer.Panjang - i*lineLength >=lineLength )
linebase64 = Konversi.ToBase64String( buffer, i*lineLength, lineLength );
kalau tidak
linebase64 = Konversi.ToBase64String( buffer, i*lineLength, buffer.Length - i*lineLength);
sb.Tambahkan( "=?" );
sb.Tambahkan(rangkaian karakter);
sb.Tambahkan( "?B?" );
sb.Tambahkan(linebase64);
sb.Tambahkan( "?=rnt" );
}
sb.Remove( sb.Length-3, 3); // Hapus karakter baris baru terakhir
kembali sb.ToString();
}
Kemudian, ubah pemrosesan subjek email dalam metode ToString di kelas MailMessage untuk memanggil metode kustom
// sb.Append("Subjek: " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "rn");
sb.Append("Subjek: " + MailEncoder.ConvertHeaderToBase64( cleanSubject.ToString(), charset) + "rn");
Cukup kompilasi ulang
Sumber: haogj