Potřebujete odeslat email přímo z SQL serveru a nemůžete použít SQL Mail? V tomto článku se dozvíte, jak si s takovým problémem poradit.

Standardně je k odesílání emailů z SQL serveru používána služba SQL Mail. Bohužel, provoz této služby vyžaduje na serveru nainstalovánu klientskou aplikaci rozhraní MAPI (například MS Outlook) a profil zpráv rozhraní MAPI, ke kterému je nutný také doménový uživatelský účet. Splnit výše uvedené podmínky pro službu SQL Mail může být v řadě případů problematické a někdy i nemožné. Jak z této šlamastiky ven? Vzpomeňte si, jakým způsobem lze pomocí ASP odesílat emaily (viz článek ASP a rozesílání emailů? Žádný problém).

V MS SQL existují rozšířené uložené procedury, které dokáží pracovat s COM objekty. Pokud využijete této funkčnosti objektu CDONTS.NewMail a síly rozšířených uložených procedur, záhy zjistíte, že dokážete zcela bez problémů a jakékoli konfigurace MAPI a dalších „zbytečností“ odeslat požadovaný email. Pro zajištění funkčnosti stačí pomocí rozšířené uložené procedury sp_OACreate vytvořit instanci objektu CDONTS.NewMail a následně nastavit parametry pomocí sp_OASetProperty jako je odesílatel, příjemce, předmět či tělo zprávy. Takto připravenou poštovní zprávu odešlete pomocí metody Send, k jejímuž provedení využijete rozšířenou uloženou proceduru sp_OAMethod. Důležitým krokem, kterým je bezpodmínečně nutné celou akci zakončit, je zrušení instance objektu CDONTS.NewMail pomocí uložené procedury sp_OADestroy!

CREATE Procedure sp_SMTPMail
   @SenderAddress varchar(100),
   @RecipientAddress varchar(100),
   @Subject varchar(200),
   @Body varchar(8000)
AS
   SET nocount on
   declare @oMail int
   declare @resultcode int
   EXEC @resultcode = sp_OACreate ‚CDONTS.NewMail‘, @oMail OUT
   if @resultcode = 0
   BEGIN
      EXEC @resultcode = sp_OASetProperty @oMail, ‚From‘, @SenderAddress
      EXEC @resultcode = sp_OASetProperty @oMail, ‚To‘, @RecipientAddress
      EXEC @resultcode = sp_OASetProperty @oMail, ‚Subject‘, @Subject
      EXEC @resultcode = sp_OASetProperty @oMail, ‚Body‘, @Body
      EXEC @resultcode = sp_OAMethod @oMail, ‚Send‘, NULL
      EXEC sp_OADestroy @oMail
   END
   select @resultcode
   SET nocount off
GO

Přestože v uložené proceduře používám objekt CDONTS.NewMail lze jej nahradit jakýmkoli objektem s podobnou funkčností. Hotovou proceduru použijete takto:

EXEC sp_SMTPmaIL „test@INTERVAL.CZ“,“ondrej.kopp@interval.cz“,“Mail odeslaný z SQL pomocí uložené procedury“, „Tento mail by odeslán z SQL serveru pomocí CDONTS.NewMail.“

A jak ji využít v praxi? Co třeba při vložení záznamu do tabulky, pro emailové upozornění na nový příspěvek v diskuzi? Tuto funkčnost můžete zařídit tak, že použijete trigger (spoušť), která se aktivuje při vložení nového záznamu.

Bohužel, s výše popsaným řešením budete mít asi problémy, pokud používáte webhosting, protože budete mít pravděpodobně zakázáno spouštění rozšířených uložených procedur. Zde se však musím správců hostingových SQL serverů zastat, protože rozšířené uložené procedury poskytují mocný nástroj, kterým lze sice udělat spoustu užitečné práce, ale také ho lze velice snadno zneužít. Proto považuji za více než vhodné mít pro uživatele spouštění rozšířených uložených procedur zakázané.

Pokud požíváte výhod placeného hostingu, neměl by pro vás být problém přesvědčit správce SQL serveru, aby vám rozšířené uložené procedury používat povolil. Pokud přesně specifikujete, co a k čemu potřebujete, rozumný správce určitě nebude proti. Není třeba povolovat exekute všech rozšířených uložených procedur, pro práci s COM objekty zcela postačí pouze následující:

  • sp_OACreate
  • sp_OASetProperty
  • sp_OAMethod
  • sp_OADestroy

Ještě jedna poznámka na závěr. Už slyším dotazy, zda lze pomocí tohoto řešení odesílat maily s přílohou. Odpověď zní ano. Doplněním několika řádků a plným využitím objektu CDONTS.NewMail lze odesílat i soubory. Myslím si však, že většině z vás nebude činit problém si takovou funkčnost doplnit – tento článek přitom můžete považovat za „odrazový můstek“.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět