среда, 27 мая 2009 г.

Интернационализация ns_sendmail

Понадобилось отправлять почту без вложений, а это как раз тот случай, когда вызов внешней утилиты оказывается слишком накладно. Потому сделал враппер для встроенной в AOL функции ns_sendmail, умеющий корректно обрабатывать не-ASCII символы.


# note: _ns_sendmail is exists!
if {[info commands orig_ns_sendmail] eq {}} {
rename ns_sendmail orig_ns_sendmail
package require base64
package require mime

# headers are ignored!
proc ns_sendmail {to from subject body args} {
set headerSet [ns_set create]
ns_set put $headerSet Content-Type {text/plain; charset=UTF-8}
ns_set put $headerSet Content-Transfer-Encoding base64
ns_set put $headerSet MIME-Version 1.0

orig_ns_sendmail $to \
$from \
[mime::word_encode utf-8 quoted-printable [encoding convertto utf-8 $subject]] \
[base64::encode [encoding convertto utf-8 $body]] \
$headerSet [lindex $args 1]
}
}


Обертка работает точно так же, как и базовая функция, за исключением того, что игнорирует дополнительные хидеры (можно их не игнорировать, изменения тривиальны).


Как в рассылке подсказывает Bernhard van Woerden, мой вариант не разбивает на несколько строк длинный subject и не кодирует заголовки From и To. Правда, предложенный им вариант функции вообще не работает, но идея понятна. Сделал обработку большого subject (поправил код выше).

Upd.
А вот на перле аналог, с поддержкой вложений: Отправка писем с авторизацией на SMTP-сервере из Perl (smtp auth perl)

1 комментарий:

Игорь комментирует...

Уважаемый Печников Алексей 31 мая на сайте
http://professionali.ru/
Вы комментировали тему «сколько стоит сделать такой сайт????”
http://professionali.ru/Topic/1658298/Expand/?lastview=1245957053
Я только вчера обнаружил эту тему и предложил свое решение.
Очень хотелось бы узнать Ваше мнение по предложенному мной варианту.
bim2010@mail.ru

Успеха !


(C) Alexey Pechnikov aka MBG, mobigroup.ru