Img/xRom.gif Главная О сайте 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',
        @FROM_NAME = N'Вася',
        @TO = N'pupkin@mail.ru',
        @CC = N'',
        @BCC = N'',
        @priority = N'High',
        @subject = N'SQL Server SMTP сообщение',
        @message = N'<HTML><H1>Типа привет, это SQL Server SMTP SQL Mail</H1></HTML>',
        @type = N'text/html',
        @attachments = N'',
        @codepage = 0

exec @rc = master.dbo.xp_smtp_sendmail
        @FROM = @FROM,
        @TO = @TO,
        @CC = @CC,
        @BCC = @BCC,
        @priority = @priority,
        @subject = @subject,
        @message = @message,
        @type = @type,
        @attachments = @attachments,
        @codepage = @codepage,
        @server = N'mail.sqldev.net'

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',

    @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'
    |";
    ОДБС.Выполнить(ТекстЗапроса);
КонецПроцедуры
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

 



1C:TOP-100 КЛУБ ПРОФЕССИОНАЛОВ 1С Rambler's Top100
Hosted by uCoz