Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!20.10.2023
Формат поштових відправлень (message/rfc822)
Останнім часом доводиться складати чимало поштових повідомлень вручну. Чому вручну? Бо так можна досягти більш компактного, мінімального змісту, порівняно з автоматичними засобами (наприклад, чудовим пакетом для Ruby mail.)
Цікаво, що цей формат, так само як HTTP, був очевидно розроблений для можливості ручного авторства, але згодом нашарування абстракцій витіснило його з колективної свідомості. Хоча, формат повідомлень SMTP та HTTP суттєво простіше, ніж, наприклад, HTML. Навіть коли доходить до повідомлень з декількома частинами (multipart).
Перше, що треба знати: повідомлення складається з заголовків та тіла. Між ними завжди стоїть порожній рядок. Заголовки в форматі Header-Name: value
, мабуть, найбільш відома частина повідомлення. Менш відомо, що заголовок може містити декілька рядків; додаткові рядки значення починаються просто з табуляції.
Тіло повідомлення складається просто з тексту. На цей час текст може містити будь-які символи, в тому числі UTF, з цим проблем немає. Але якщо тіло двійкове — воно обовʼязково кодується, зазвичай в Base64. Це на відміну від HTTP, де в тілі дозволено відправляти двійкові дані.
Зокрема це потрібно тому, що двійкові дані зазвичай не будуть всім тілом повідомлення, а лише його частиною. Текст тіла в такому випадку можна прочитати як декілька частин — отже, ніяких двійкових даних всередині бути не може. Частини розділяються спеціальними рядками та також мають закінчуватись трохи іншим рядком. Кожна частина має свої заголовки та своє тіло… яке в деяких випадках може теж складатись з частин.
Ось мінімальний, але повний приклад повідомлення з двома частинами:
Content-Type: multipart/mixed;
boundary=demo
--demo
Content-Type: text/plain
Hello, Text!
--demo
Content-Type: text/html
<p>Hello, HTML!</p>
--demo--
Як бачите, ніякої магії, якщо розібратись.