Главная | О сайте | ROM-Mail | Форум | Статьи | Программы | OLAP | Ссылки |
Отправка почты по SMTP с помощью расширенной хранимой процедуры XPSMTP.
Довольно часто у разработчиков возникает необходимость отправки email-сообщений по протоколу SMTP без использования среды 1С и компоненты ROM-Mail. Для этого можно использовать SQL Server 7.0/2000 и расширенную хранимую процедуру XPSMTP.
Однако следует заметить, что XPSMTP на момент написания статьи пригодна только для рассылки сообщений с помощью SMTP серверов, не требующих аутентификации. В моем случае, XPSMTP применяется для рассылки административных сообщений от SQL Server 2000 в пределах локальной сети. В следующих версиях автор обещает поддержку аутентификации, поддержку больших сообщений, одновременную поддержку нескольких SMTP серверов, счетчик попыток, и т.д.
По опыту использования могу сказать, что XPSMTP работает очень устойчиво, мной не было замечено ни одного случая падения.
Домашняя страница расширенной хранимой процедуры XPSMTP http://sqldev.net/xp/xpsmtp.htm
XPSMTP позволяет отсылать MIME сообщения через указанный SMTP сервер, по умолчанию используется порт 25. Кроме SQL Server этой хранимой процедуре дополнительное программное обеспечение не требуется.
Ниже описаны параметры XPSMTP. Имена параметров не чуствительны к регистру, параметры разделяются на обязательные и необязательные.
Name | Разрешенные типы значений | По умолчанию | Обязательный | Возможные значения | Описание |
@FROM | NVARCHAR(4000), VARCHAR(8000) | NULL | Обязательный | Адрес отправителя | |
@FROM_NAME | NVARCHAR(4000), VARCHAR(8000) | NULL | Необязательный | Имя отправителя | |
@TO | NVARCHAR(4000), VARCHAR(8000) | NULL | Обязательный | Список получателей, разделенных символом "," (запятая) | |
@replyto | NVARCHAR(4000), VARCHAR(8000) | NULL | Необязательный | Адрес для ответа | |
@CC | NVARCHAR(4000), VARCHAR(8000) | NULL | Необязательный | Список получателей копии сообщения, разделенных символом "," (запятая) | |
@BCC | NVARCHAR(4000), VARCHAR(8000) | NULL | Необязательный | Список получателей скрытой копии сообщения, разделенных символом "," (запятая) | |
@priority | NVARCHAR(10), VARCHAR(10) | NORMAL | Необязательный | LOW, NORMAL or HIGH | Важность сообщения |
@subject | VARCHAR(4000), VARCHAR(8000) | NULL | Необязательный | Тема сообщения | |
@type | NVARCHAR(100), VARCHAR(100) | text/plain | Необязательный | text/plain text/html |
Определение типа сообщения (текст или HTML) |
@message | NVARCHAR(4000), VARCHAR(8000) | NULL | Необязательный | Тело сообщения. Максимальная длина строки составляет 1000 символов. Строки следует разделять символами перевода строки (\r\n или T-SQL char(13) | char(10)). | |
@messagefile | NVARCHAR(4000), VARCHAR(8000) | NULL | Необязательный | Полный путь и имя файла. Размер файла не должен превышать 64KB | Ссылка на файл, который содержит тело сообщения. Файл может содержать сообщение в текстовом или HTML формате (ASCII или Unicode). Максимальный размер 64К. Максимальная длина строки составляет 1000 символов. Строки следует разделять символами перевода строки (\r\n или T-SQL char(13) | char(10)). |
@attachment | NVARCHAR(4000), VARCHAR(8000) | NULL | Необязательный | Полный путь и имя файла. | Ссылка на файл, который будет включен в сообщение в качестве вложения. |
@attachments | NVARCHAR(4000), VARCHAR(8000) | NULL | Необязательный | Полный путь и имя файла. | Список ссылок на файлы вложения разделенных символом ";" (точка с запятой) |
@server | NVARCHAR(4000), VARCHAR(8000) | smarthost | Необязательный | Имя хоста или IP адрес SMTP сервера | SMTP сервер, имя хоста или IP адрес. По умолчанию "smarthost". |
@port | INT | 25 | Необязательный | Номер порта | Номер порта SMTP сервиса, по умолчанию 25 |
@codepage | INT | 0 | Кодировка | ||
@timeout | INT | 10000 (=10 secs) |
Необязательный | [0 >= WaitForSingleObject] | Таймаут для соединения в миллисекундах |
@dumpmsg | NVARCHAR(4000), VARCHAR(8000) | NULL | Необязательный | Полный путь и имя файла. | Выгрузка сообщения в дамп-файл. Прим.: Требуются админ. права. |
@ping | INT | NULL | Необязательный | [0 | 1] | Попытка соединения с @server (используется @timeout), успешное соединение @rc = 0 иначе @rc = 1. Может быть использован для проверки соединения с SMTP сервером. |
Примеры (Query Analyzer).
Открываем Query Analyzer и выполняем примеры.
--
************************************************************************
--
Минимальное количество параметров
--
************************************************************************
declare
@rc int
exec @rc = master.dbo.xp_smtp_sendmail
@FROM = N'vasya@mail.ru',
@TO = N'pupkin@mail.ru'
select RC =
@rc
go
--
************************************************************************
--
Более расширенный пример
--
************************************************************************
declare
@rc int
exec @rc = master.dbo.xp_smtp_sendmail
@FROM =
N'vasya@mail.ru',
@FROM_NAME =
N'Вася',
@TO =
N'pupkin@mail.ru',
@CC =
N'petya@mail.ru',
@BCC = N'stepa@mail.ru',
@priority =
N'HIGH',
@subject = N'Типа
привет, это SQL
Server SMTP Mail',
@message =
N'Прощай MAPI, прощай Аутглюк',
@type =
N'text/plain',
@attachments=
N'c:\attachment1.txt;c:\attachment2.txt',
@server = N'smtp.mail.ru'
select RC =
@rc
go
--
************************************************************************
--
отсылка HTML сообщения
--
************************************************************************
declare
@rc int
exec @rc = master.dbo.xp_smtp_sendmail
@FROM =
N'vasya@mail.ru',
@TO =
N'pupkin@mail.ru',
@subject = N'Первое HTML
сообщение',
@message =
N'<HTML><H1>Это типа HTML содержимое</H1></HTML>',
@type = N'text/html'
select RC =
@rc
go
--
************************************************************************
--
отсылка HTML сообщения, тело берем из файла
--
************************************************************************
declare
@rc int
exec @rc = master.dbo.xp_smtp_sendmail
@FROM =
N'vasya@mail.ru',
@FROM_NAME =
N'Вася',
@TO = N'pupkin@mail.ru',
@subject = N'ASCII HTML сообщение из файла',
@type = N'text/html',
@messagefile = N'c:\msg.html'
select RC = @rc
go
--
************************************************************************
--
все возможные параметры
--
************************************************************************
declare
@rc int
exec @rc = master.dbo.xp_smtp_sendmail
@FROM =
N'ivan@mail.ru',
@FROM_NAME =
N'Иван Федорович Крузенштерн (человек и пароход)',
@replyto =
N'ivan@mail.ru',
@TO =
N'pupkin@mail.ru',
@CC =
N'',
@BCC =
N'',
@priority =
N'NORMAL',
@subject = N'Типа
привет, это
SQL Server SMTP сообщение',
@type =
N'text/plain',
@message =
N'Прощай MAPI, прощай Аутглюк',
@messagefile=
N'',
@attachment = N'',
@attachments=
N'',
@codepage = 0,
@timeout =
10000,
@server =
N'smtp.mail.ru'
select RC = @rc
go
--
************************************************************************
--
Использование переменных
--
************************************************************************
declare @FROM NVARCHAR(4000),
@FROM_NAME
NVARCHAR(4000),
@TO
NVARCHAR(4000),
@CC
NVARCHAR(4000),
@BCC
NVARCHAR(4000),
@priority
NVARCHAR(10),
@subject
NVARCHAR(4000),
@message
NVARCHAR(4000),
@type
NVARCHAR(100),
@attachments NVARCHAR(4000),
@codepage
INT,
@rc
INT
select
@FROM = N'vasya@mail.ru',--
************************************************************************
--
использование дамп-файла для диагностики
--
************************************************************************
declare
@rc int
exec @rc = master.dbo.xp_smtp_sendmail
@FROM =
N'vasya@mail.ru',
@FROM_NAME =
N'Вася',
@TO = N'pupkin@mail.ru',
@subject = N'ASCII HTML сообщение из файла',
@type = N'text/html',
@message = N'Типа
привет...',
@dumpmsg =
N'C:\TEMP\dumpmsg.log'
select RC = @rc
go
--
************************************************************************
--
пингуем SMTP сервер
--
************************************************************************
declare
@rc int
exec @rc = master.dbo.xp_smtp_sendmail
@server = N'smtp.mail.ru',
@port =
25,
@ping = 1
select RC = @rc
go
Примеры (1С:Предприятие 7.7)
Для соединения с SQL Server 2000 используем внешнюю компоненту 1с++ (http://1c.proclub.ru/)
Внешняя компонента 1с++ требует инициализации в глобальном модуле.
ЗагрузитьВнешнююКомпоненту("1cpp.dll");
Используем "родное" соединение 1С:Предприятия 7.7 и выполним запрос без возврата результата выборки.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Процедура
ОтправитьСообщение()
ОДБС=СоздатьОбъект("ODBCRecordSet");
ТекстЗапроса="
|exec master.dbo.xp_smtp_sendmail
|@FROM =
N'vasya@mydomain.com',
|@FROM_NAME = N'ROM',
|@TO =
N'pupkin@mydomain.com',
|@priority = N'HIGH',
|@subject = N'Типа привет, это SQL Server SMTP Mail',
|@message = N'Прощай MAPI, прощай Аутглюк',
|@type = N'text/plain',
|@server = N'192.168.1.1'
|";
ОДБС.Выполнить(ТекстЗапроса);
КонецПроцедуры
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~