يعد OpenSmtp مكونًا جيدًا لإرسال البريد الإلكتروني على منصة .Net، ولكن هناك بعض الأخطاء فيه التي تؤثر على استخدامنا، واجهت رسائل مشوهة أثناء الاستخدام عندما كان طول موضوع البريد الإلكتروني كبيرًا.
بعد التحقق من الكود المصدري، تبين أن هناك مشاكل في عملية المعالجة الأصلية: أولاً، تم تشفير الموضوع من خلال ASCII، وثانيًا، تم استخدام تشفير QP، ولكن لم يتم أخذ الفرق بين الموضوع والمحتوى في الاعتبار.
عند الترميز داخل السمات، يجب ترميز كل صف على حدة ولا يمكن ترميز السمة بأكملها.
بعد المقارنة مع Outlook Express، تتم إضافة طريقة إلى فئة MailEncoding لتنفيذ تشفير Base64 خصيصًا لموضوع البريد الإلكتروني.
سلسلة ثابتة عامة ConvertHeaderToBase64 (سلسلة s، سلسلة محارف)
{
int lineLength = 40; // يعالج كل سطر 40 بايت
ترميز الترميز = Encoding.GetEncoding( charset );
byte[] buffer = encoding.GetBytes( s );
StringBuilder sb = new StringBuilder(); // احفظ النتيجة النهائية
سلسلة linebase64؛
int block = buffer.Length%lineLength==0?buffer.Length/lineLength:buffer.Length/lineLength + 1;
ل(int i=0;i<block;i++)
{
إذا ( buffer.Length - i*lineLength >=lineLength )
linebase64 = Convert.ToBase64String( buffer, i*lineLength, lineLength );
آخر
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); // إزالة آخر حرف للسطر الجديد
إرجاع sb.ToString();
}
ثم قم بتعديل معالجة موضوع البريد الإلكتروني في أسلوب ToString في فئة MailMessage لاستدعاء أسلوب مخصص
// sb.Append("Subject: " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "rn");
sb.Append("Subject: " + MailEncoder.ConvertHeaderToBase64( cleanSubject.ToString(), charset) + "rn");
مجرد إعادة ترجمة
المصدر: haogj