OpenSmtp เป็นองค์ประกอบการส่งอีเมลที่ดีบนแพลตฟอร์ม .Net แต่มีข้อบกพร่องบางประการที่ส่งผลต่อการใช้งานของเรา ในระหว่างการใช้งาน ฉันพบข้อความที่อ่านไม่ออกเมื่อหัวเรื่องอีเมลมีขนาดใหญ่
หลังจากตรวจสอบซอร์สโค้ดแล้ว พบว่ามีปัญหากับกระบวนการประมวลผลดั้งเดิม ประการแรก ธีมถูกเข้ารหัสผ่าน ASCII และประการที่สอง ใช้การเข้ารหัส QP แต่ไม่พิจารณาถึงความแตกต่างระหว่างธีมและเนื้อหา
เมื่อเขียนโค้ดภายในธีม แต่ละแถวจะต้องเขียนโค้ดแยกกัน และไม่สามารถเขียนโค้ดทั้งธีมได้
หลังจากเปรียบเทียบกับ Outlook Express แล้ว วิธีการจะถูกเพิ่มลงในคลาส MailEncoding เพื่อทำการเข้ารหัส Base64 โดยเฉพาะสำหรับหัวเรื่องอีเมล
สตริงคงที่สาธารณะ ConvertHeaderToBase64 (สตริง s, ชุดอักขระสตริง)
-
int lineLength = 40; // แต่ละบรรทัดประมวลผล 40 ไบต์
การเข้ารหัส การเข้ารหัส = Encoding.GetEncoding( ชุดอักขระ ); // รับการเข้ารหัสที่ระบุ
ไบต์ [] บัฟเฟอร์ = การเข้ารหัส GetBytes (s); // แปลงเป็น bytecode
StringBuilder sb = new StringBuilder(); // บันทึกผลลัพธ์สุดท้าย
สตริง linebase64;
บล็อก int = buffer.Length%lineLength==0?buffer.Length/lineLength:buffer.Length/lineLength + 1;
สำหรับ(int i=0; i< บล็อก; i++)
-
ถ้า ( buffer.Length - i*lineLength >=lineLength )
linebase64 = Convert.ToBase64String( บัฟเฟอร์, i*lineLength, lineLength );
อื่น
linebase64 = Convert.ToBase64String( บัฟเฟอร์, i*lineLength, buffer.Length - i*lineLength);
sb.ผนวก( "=?" );
sb.ผนวก(ชุดอักขระ);
sb.ผนวก( "?B?" );
sb.ผนวก(linebase64);
sb.ผนวก( "?=rnt" );
-
sb.Remove( sb.Length-3, 3); // ลบอักขระขึ้นบรรทัดใหม่สุดท้าย
กลับ sb.ToString();
-
จากนั้น ปรับเปลี่ยนการประมวลผลของหัวเรื่องอีเมลในวิธี ToString ในคลาส MailMessage เพื่อเรียกวิธีการแบบกำหนดเอง
// sb.Append("Subject: " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "rn");
sb.Append("หัวเรื่อง: " + MailEncoder.ConvertHeaderToBase64( cleanSubject.ToString(), ชุดอักขระ) + "rn");
เพียงคอม
ไพล์ใหม่ที่มา: haogj