Как декодировать электронное письмо в формате MIME
Большинство электронных писем, отправляемых сегодня, имеют формат MIME (многоцелевые расширения почты Интернета). Это позволяет отправлять электронные письма с версиями обычного текста и расширенного текста/HTML, встроенными изображениями и вложениями. Расширения MIME могут быть добавлены к сообщению в стандартном формате RFC/822, что обеспечивает обратную совместимость со старыми почтовыми системами.
Шаг 1
Загрузите содержимое сообщения электронной почты.
Шаг 2
Проверьте заголовок «Content-Type». Если тип содержимого составной (например, «составной/смешанный», «составной/альтернативный» и т. д.), сообщение будет состоять из нескольких разделов для анализа. Если тип содержимого составной, выполните следующие шаги.
Шаг 3
Заголовок Content-Type должен содержать уникальную строку, используемую кодом, сгенерировавшим сообщение MIME, для обозначения границ частей MIME. Пример:
Content-Type:составной/смешанный; граница="part_c7161025_fe8a_45f4_83ef_6befcfa5d021"
Строка границы в этом случае — "part_c7161025_fe8a_45f4_83ef_6befcfa5d021".
Шаг 4
Каждая часть MIME будет разделена граничной строкой, которой предшествуют два дефиса ("--") на пустой строке. Вам нужно будет сканировать сообщение строка за строкой в поисках границ частей. Весь текст между границами кроме последнего CR/LF является частью этой части MIME.
Важно! Последняя часть MIME будет заканчиваться граничной строкой, за которой следуют еще два дефиса.
Пример:
--part_c7161025_fe8a_45f4_83ef_6befcfa5d021 Первая часть MIME.
--part_c7161025_fe8a_45f4_83ef_6befcfa5d021 Вторая часть MIME
--part_c7161025_fe8a_45f4_83ef_6befcfa5d021 Последняя часть MIME.
--part_c7161025_fe8a_45f4_83ef_6befcfa5d021--
Шаг 5
Каждая часть MIME затем должна быть проанализирована. Формат каждой части MIME подобен исходному сообщению в формате RFC/822. Он будет содержать ряд заголовков, за которыми следует пустая строка, а затем данные тела.
Шаг 6
Часть MIME сама по себе может быть составной, с собственным заголовком «Content-Type» и граничной строкой. Ваш код должен рекурсивно анализировать части MIME, пока не достигнет дочерних узлов.
Шаг 7
Часть MIME может быть просто двоичным вложением. В этом случае обычно предоставляется заголовок имени файла вместе с кодировкой передачи. BASE64 — популярный тип кодирования. В этом случае все тело части MIME должно быть декодировано BASE64. В качестве примера вот первые несколько строк прикрепленного изображения JPG:
------= NextPart_003_01C755EF.43F2628D Content-Type:image/jpeg; name="testimage.jpg" Content-Transfer-Encoding:base64 Content-Description:testimage.jpg Content-Disposition:вложение; имя_файла="testimage.jpg"
/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAQABQQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
Шаг 8
HTML-текст сообщения должен находиться в разделе MIME с ContentType:Text/Html внутри раздела ContentType:Multipart/Alternative MIME.
Шаг 9
Основной текст сообщения должен находиться в разделе MIME с ContentType:Text/plain внутри раздела ContentType:Multipart/Alternative MIME.
Совет
См. RFC 822 http://www.ietf.org/rfc/rfc0822.txt?number=822 и RFC 1341 http://www.ietf.org/rfc/rfc1341.txt?number=1341 для получения дополнительной информации. Если вы программируете на C#, отличная бесплатная библиотека доступна по адресу http://www.codeproject.com/csharp/mime_project.asp.