۱۳۸۸/۰۴/۲۰

رمزگشايي عنوان يك ايميل فارسي دريافت شده


گوگل اجازه‌ي فعال كردن POP3 را روي اكانت‌هاي GMail مي‌دهد. فرض كنيد با استفاده از يكي از كلاينت‌هاي POP3 دات نت مي‌خواهيم ايميل‌ها را با برنامه نويسي دريافت كنيم (و مثلا از Outlook استفاده نكنيم). اكنون به نظر شما عنوان دريافت شده زير چه معنايي دارد؟
=?UTF-8?B?QW5hbHl0aWNzIHZhaGlkbmFzaXJpLmJsb2dzcG90LmNvbSAyMDA4MTIyNiAo2KLZhdin?= =?UTF-8?B?2LEg2LPYp9mK2Kop?=

براي درك اتفاق رخ داده بايد به RFC ‌هاي مربوطه مراجعه كرد (RFC-2822 و RFC-2047). مطابق استانداردهاي ذكر شده، هدر ارسالي يك ايميل همواره بايد از حروف اسكي تشكيل شود. حال اگر عنوان ايميل كه جزئي از هدر را تشكيل مي‌دهد از حروف غير اسكي تشكيل شد، حتما بايد يك لايه encoding روي آن‌ها صورت گيرد. دو حالت تعريف شده در اين‌جا مطابق استاندارد ميسر است:
الف) Quoted Printable : در اين حالت عنوان با =?utf-8?Q شروع مي‌شود.
ب) Base64 : در اين روش عنوان با =?utf-8?B شروع خواهد شد.

روش متداول، روش ب است كه نسبت به روش الف فشرده‌تر مي‌باشد. در اين حالت براي درك معناي قسمت‌هاي مختلف رشته دريافت شده بايد به الگوي زير مراجعه كرد:
=?charset?encoding?EncodedText?=
در اين‌جا charset بيانگر نحوه encoding متن اصلي است كه بر روي آن الگوريتم base64 اعمال شده.
در رشته طولاني فوق كه در ابتداي مقاله به آن اشاره شده، عنوان به دو قسمت تجزيه شده. يا به عبارتي دوبار الگوي فوق در آن تكرار شده است كه بايد EncodedText هاي آن‌ها را يافت و سپس آن‌ها را با توجه به charset مربوطه از حالت base64 به يك رشته معمولي تبديل نمود.

//using System.Text;
public static string Base64ToString(string charset, string encodedString)
{
//تبديل بيس 64 به آرايه‌اي از بايت‌ها
byte[] buffer = Convert.FromBase64String(encodedString);
//تبديل آرايه‌اي از بايت‌ها به رشته با توجه به انكدينگ مربوطه
return Encoding.GetEncoding(charset).GetString(buffer);
}
اكنون عنوان صحيح ايميل فوق به صورت زير قابل دريافت خواهد بود:

string subject = Base64ToString("utf-8", "QW5hbHl0aWNzIHZhaGlkbmFzaXJpLmJsb2dzcG90LmNvbSAyMDA4MTIyNiAo2KLZhdin2LEg2LPYp9mK2Kop");