Знадобилось відправляти листи, повідомлення користувачам про різні події щодо їхніх замовлень. З тілом листа проблем не виникло: написав в хідері, що тіло в utf-8, 8bit encoded і все працює.
З Subject трохи складніше: в цьому полі листа все, що не ASCII, має бути закодоване згідно RFC 2047. Нижче - моя реалізація функції, що перетворює рядок в Q-encoding:
let encode_word init_str str =
let rec convert dst s =
match peek s with
| Some c when ((127 > Char.code c) && (c != '=')) ->
let new_str = sprintf "%c" c in
junk s; convert (dst ^ new_str) s
| Some c ->
let new_str = sprintf "=%0X" (int_of_char c) in
junk s; convert (dst ^ new_str) s
| None -> dst
and s = Stream.of_string str in
convert init_str s
Користуйтесь на здоров'я :-)
P.S.: Юра, дякую за підказку, з '=' справді могло вийти некрасиво :-)