Отправка почты SMTP (очередная сборка)

by Alexey Knyazev 7. апреля 2010 10:15

В очередной раз обращаюсь к работе с почтой через CLR-сборки. Я уже описывал, как читать почту по протоколу POP3 и IMAP. Теперь небольшая демонстрация, как отправлять почту через SMTP.

SMTP (англ. Simple Mail Transfer Protocol — простой протокол передачи почты) — это сетевой протокол, предназначенный для передачи электронной почты в сетях TCP/IP.

Для отправки почты в SQL Server 2005 и выше используется Компонент Database Mail.

Компонент Database Mail — это решение уровня предприятия для отправки сообщений электронной почты от компонента SQL Server Database Engine. Используя компонент Database Mail, приложения базы данных могут отправлять почтовые сообщения пользователям. Сообщения могут содержать результаты запроса, а также могут включать файлы из любого сетевого ресурса. Компонент Database Mail спроектирован для надежности, масштабируемости, безопасности и простой поддержки.

А я покажу простенький код сборки для отправки почты, не используя Database Mail.

Код сборки:

using System;
using System.Net;
using System.Net.Mail;

public class SMTPClr
{
    public static void SendMessage(string From, string To, string Subject, string Body, string Host, string UserName, string Password)
    {
        MailMessage mes = new MailMessage(From, To, Subject, Body);
        SmtpClient client = new SmtpClient(Host); 
        client.Credentials = new NetworkCredential(UserName, Password); 
        client.Send(mes);
    }
}

 

Вот и всё!!! Smile

Далее регистрируем сборку и отправляем тестовое письмо:

--Регистрируем сборку
CREATE ASSEMBLY SMTPCLR
FROM 'C:\SMTPClr\SMTPCLR.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
GO

--Создаём процедуру отправки почты
CREATE PROCEDURE SendMessage
(
--От кого
@From nvarchar(max),
--Кому
@To nvarchar(max),
--Тема письма
@Subject nvarchar(max),
--Само сообщение
@Body nvarchar(max),
--Имя сервера или его IP (порт 25)
@Host nvarchar(max),
--Имя пользователя
@UserName nvarchar(max),
--Пароль
@Password nvarchar(max)
) 
AS 
EXTERNAL NAME SMTPCLR.SMTPClr.SendMessage
GO

--Отправляем письмо
EXECUTE SendMessage 'admin@microsoft.com', 'a.knyazev@t-sql.ru', 'SMTPClr', 'Hi, Alexey!', 'MySMTPServer', 'MySMTPUserName', 'MySMTPPassword'

И не забываем предварительно включить возможность работы с CLR-сборками:

--Включаем выполнение пользовательских сборок
SP_CONFIGURE 'clr enabled', 1
GO
RECONFIGURE
GO


--Модули базы данных (например, пользовательские функции или хранимые процедуры),
--которые используют контекст олицетворения, могут обращаться к ресурсам,
--находящимся вне базы данных.
ALTER DATABASE [Ваша БД] SET TRUSTWORTHY ON
GO


По просьбе трудящихся, выкладываю саму сборку сюда: SMTPCLR.zip

Tags: ,

SQL Server

Комментарии

08.04.2010 19:32:57 #

Vlad

Это все конечно хорошо, но нужно понимать, что произойдет если, например, сделать бекап и восстановление БД. Отправка писем не заработает.По моему мнению для надежной работы лучше использовать Database Mail. А если вы знаете тонкости настроек CLR сборок, то конечно удобно использовать CLR сборку.

Vlad Россия

09.04.2010 9:14:33 #

Admin

Цель данной заметки не убедить, что отправка почты через сборку лучше, чем Database Mail, а показать возможные альтернативы, а так же продемонстрировать в очередной раз, как с помощью нескольких строк расширить стандартный функционал SQL Server

Admin Россия

14.04.2010 17:14:52 #

Oleg

А как можно посмотреть все зарегистрированные сборки? Или это нельзя сделать?

Oleg Россия

14.04.2010 18:51:39 #

Admin

SELECT * FROM sys.assemblies

Admin Россия

20.09.2010 21:18:11 #

Роман

У меня не получается отправить СМС на моб.телефон с помощью этой компоненты. Приходит абракадабра. Догадуюсь, что надо как то перекодировать в gsm38 но как это сделать мыслей нет.

Роман Украина

22.09.2010 18:17:14 #

Alexey Knyazev

msdn.microsoft.com/.../...essage.bodyencoding.aspx можно задать кодировку через BodyEncoding

Alexey Knyazev Россия

20.10.2010 18:44:01 #

Роман

не совсем понял, можно подробнее?
мне нужно сменить кодировку тела письма(по умолчанию оно в utf-8)

Роман Украина

20.10.2010 19:28:21 #

Alexey Knyazev

Да, подправте мой код, думаю дело именно в кодировке

Alexey Knyazev Россия

21.10.2010 16:29:54 #

Роман

Не получается выполнить код:
CREATE ASSEMBLY SMTPCLR
03  FROM 'C:\SMTPClr\SMTPCLR.dll'
04  WITH PERMISSION_SET = EXTERNAL_ACCESS;
05  GO
ругается что, CREATE ASSEMBLY failed because it could not open the physical file "c:\Temp\SMTPClr\SMTPClr.dll": 3(Системе не удается найти указанный путь.).
но файл там лежит точно!
Все, права что в Винде, что разрешения в самом SQL Server'e настроены.

Роман Украина

21.10.2010 19:05:31 #

Alexey Knyazev

Под кем стартует сам SQL Server? У этой УЗ есть доступ к этой дирректории?

Alexey Knyazev Россия

22.10.2010 0:47:06 #

Роман

На домашнем компе попробывал(на работе походу, что-то с правами намучено), процедура создалась нормально, но при отправке след. ругань:

Msg 6522, Level 16, State 1, Procedure SendMessage, Line 0
A .NET Framework error occurred during execution of user defined routine or aggregate 'SendMessage':
System.Net.Mail.SmtpException: Failure sending mail. ---> System.FormatException: An invalid character was found in the mail header.
System.FormatException:
   at System.Net.BufferBuilder.Append(String value, Int32 offset, Int32 count)
   at System.Net.Mail.EHelloCommand.PrepareCommand(SmtpConnection conn, String domain)
   at System.Net.Mail.EHelloCommand.Send(SmtpConnection conn, String domain)
   at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
   at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
   at System.Net.Mail.SmtpClient.GetConnection()
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
System.Net.Mail.SmtpException:
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at SMTPClr.SendMessage(String From, String To, String Subject, String Body, String Host, String UserName, String Password)

Роман Украина

22.10.2010 22:53:48 #

Alexey Knyazev

--Модули базы данных (например, пользовательские функции или хранимые процедуры),
--которые используют контекст олицетворения, могут обращаться к ресурсам,
--находящимся вне базы данных.
ALTER DATABASE [Ваша БД] SET TRUSTWORTHY ON
GO

Alexey Knyazev Россия

24.10.2010 23:50:58 #

Роман

Не, причина была не в этом. А в кирилических символах в заголовке. Сначала обходил это с помощью возножности - сменить язык системы(Win7) на english. А потом прочел, что такое возможно из-за кирилического названия компа. Переименовал и все получилось! Спасибо Вам!

Роман Украина

15.11.2010 20:33:26 #

Константин

Алексей, был бы очень сильно признателен ,если вышлите скомпилированную сборку SMTPCLR.dll
на timpost@bk.ru

Константин Россия

16.11.2010 20:45:02 #

Alexey Knyazev

Качайте: http://www.t-sql.ru/Tools/SMTPCLR.zip

Alexey Knyazev Россия

17.11.2010 14:29:30 #

Константин

Спасибо!

Константин Россия

Добавить комментарий


(Отображает Gravatar)

  Country flag

Click to change captcha
biuquote
  • Комментарий
  • Предпросмотр
Loading



Powered by BlogEngine.NET 1.6.0.0
Все права защищены © T-SQL.RU | Alexey Knyazev 2008-2012