Блог‎ > ‎

Отправка уведомлений из 1C

Отправлено 21.10.2011, 3:05 пользователем Антон Дербенёв   [ обновлено 15.04.2012, 9:36 ]

Долгое время для отправки писем из 1С мы использовали blat. Он хорош всем кроме того, что не умеет ни SSL, ни TLS. Что может и не является show-stopper'ом, но заставляет городить костыли (вроде локального релея или stunnel) или использовать небезопасные соединения.

После недавнего поиска наткнулся на аналогичную утилиту – SendEmail. Её функционал очень похож на blat (хоть и бледнее), зато она дружит с шифрованием. Это позволяет, например, автоматически отправлять почту через учётную запись gmail (или Google Apps) без каких-либо затруднений. Почти.

А затруднения есть: утилита не в курсе существования кодировок и не-ASCII символов, и хоть они ей не мешают, она не умеет даже кодировать заголовки. А вот это уже мешает почтовым программам и серверам.

Можно было бы написать свой кодер, но пока лень, да и не так сложно найти существующий. После некоторых_хитрых манипуляций со строкой base64, её можно использовать в заголовках для SendEmail примерно так:

FOR %%I IN ("%Outbox%\*.*") DO CALL :DeliverOneTask "%%~I"

EXIT /B

:DeliverOneTask
    SET To=
    SET Subject=
    ECHO Getting addressee and subject from %1
    FOR /F "usebackq delims=" %%J IN (%1) DO IF NOT DEFINED To (
        SET To="%%~J"
    ) ELSE (
        FOR /F "usebackq delims=" %%K IN (`ECHO %%J^|base64`) DO (
        SET Subject="=?cp866?B?%%K?="
        GOTO :ExitFor
        )
    )
    :ExitFor
    ECHO Delivering %Subject% to %To%
    tail -n+3 %1 | sendemail -f %From% -t %To% -u %Subject% -s smtp.googlemail.com:587 -xu %User% -xp %Password% -l "%SentTasks%\%~n1.log" -o message-charset=cp866 -o timeout=3 -o message-header="Organization: =?utf-8?B?0KbQuNGE0YDQvtCz0YDQsNC0LdCh0YLQsNCy0YDQvtC/0L7Qu9GM?=" && MOVE /Y %1 "%SentTasks%"
EXIT /B

Файлы для этого скрипта необходимо готовить в следующем формате:

адресат (одна строка; можно несколько получателей через запятую)
тема (одна строка)
текст письма (с третьей строки до конца файла)

Для простоты скрипта, поскольку многострочные темы SendEmail'у непонятно как указать, не формируя сообщения в соответствии со стандартами SMTP, длина темы обрезается по длине первой строки темы, закодированной в BASE64.

Также обратите внимание, что %From% и %To% либо должны быть уже закодированы (аналогично организации), либо должны содержать только адрес.

P.S. tail можно взять здесь: unxutils.sourceforge.net.

Цифроград-Ставрополь