Windows - Az SQL szerver Mail szolgáltatása

forráskód letöltése
Felmerülhet bennünk az igény, hogy SQL szerverünkben zajló különféle folyamatokról értesüljünk, amint azok bekövetkeztek. Szerencsénkre erre megvan a lehetőségünk, hiszen az adatbázisszerverbe beépítettek egy olyan szolgáltatást, ami képes levelet küldeni és fogadni. Mire használhatók ezek a funkciók? Miért fogadjon levelet az SQL szerver? Mindezt megtudhatja cikkünkből.
Az SQL szerverben elérhető levelezési funkciók
Az SQL 6.5-ös és 7.0-ás verziójában egy egyszerű MAPI kapcsolatot nyithatunk Exchange szerver, vagy Windows NT Mail, vagy POP3 szerver irányába. Az SQL 7.0 ezen kívül tartalmazza az SQLAgentMail szolgáltatást, amely ugyanezekhez a szolgáltatásokhoz tud kapcsolódni. Az SQL 2000 kiterjesztett MAPI kapcsolattal dolgozik, egyaránt tud SQLMail és SQLAgentMail kapcsolatot nyitni a jelzett szolgáltatásokhoz. Köszönhetően a kiterjesztett MAPI támogatásnak, az SQL 2000 számára szükséges az Outlook 2000, vagy későbbi kliens megléte. Login problémák elkerülése végett a POP3/SMTP használata helyett a Microsoft az Exchange szerver alkalmazását javasolja.
Mielőtt az SQLMail-t beállítanánk, le kell tesztelnünk a levél profilt, hogy képes-e leveleket fogadni, küldeni.
Az SQL Mail levélküldéskor egy API hívást kezdeményez, amely elindítja a MAPI sorkezelőt a Windows Messaging alrendszerben. Elküldi a levelet, majd leállítja a sorkezelőt.
Az SQL Mail szolgáltatás a következő eljárásokból áll:
SQL Mail eljárás Funkció
xp_startmail Elindít egy levél kliens munkafolyamatot. Minden levélküldő eljárást megelőzően már használni kell.
xp_stopmail Bezárja az SQL szerver levél kliens folyamatot.
xp_findnextmsg Az sp_processmail-el együtt használható az SQL mailbox-ba érkezett levelek feldolgozásához. Kap egy üzenet azonosítót bemenetként és visszaad egy azonosítót kimenetként.
xp_readmail Az sp_processmail használja az SQL mailbox-ban lévő levél elolvasásához.
xp_deletemail Az sp_processmail használja az SQL mailbox-ban lévő levél törléséhez.
xp_sendmail Az sp_processmail, vagy egy tárolt eljárás, trigger használja. Értesítésekhez használható. Elküld egy üzenetet és egy lekérdezés eredményét csatolt állományként a meghatározott címzettnek.
sp_processmail Az xp_findnextmessage, xp_readmail és xp_deletemail kiterjesztett tárolt eljárások segítségével feldolgozza a beérkezett üzeneteket és az xp_sendmail-t használja az eredmény továbbítására a levél küldőjének. Az sp_processmail-nek rendszeres futtatása, ütemezése szükséges az SQL mailbox-ba érkezett levelek észleléséhez.
Levélküldés
A levélküldésre az SQL szerverben az xp_sendmail utasítást használjuk. Szintaxisa a következő:
xp_sendmail {[@recipients =] 'recipients [;...n]'}
[,[@message =] 'message']
[,[@query =] 'query']
[,[@attachments =] attachments]
[,[@copy_recipients =] 'copy_recipients [;...n]'
[,[@blind_copy_recipients =] 'blind_copy_recipients [;...n]'
[,[@subject =] 'subject']
[,[@type =] type]
[,[@attach_results =] 'attach_value']
[,[@no_output =] 'output_value']
[,[@no_header =] 'header_value']
[,[@width =] width]
[,[@separator =] separator]
[,[@echo_error =] 'echo_value']
[,[@set_user =] user]
[,[@dbuse =] database]
Paraméterek:
  • @recipients: Pontosvesszővel elválasztott listája a címzetteknek.
  • @message: A kiküldött üzenet. Maximum 8000 bájt hosszú lehet.
  • @query: A lekérdezés, amely eredménye az üzenetbe kerül.
  • @attachments: Mellékelt fájl, ügyeljünk arra, hogy az elérési út a szerveren érvényes.
  • @copy_recipients: Az üzenet cc címzettei pontosvesszővel elválasztva, vagyis akik másolatot kapnak.
  • @blind_copy_recipients: Az üzenet bc címzettei pontosvesszővel elválasztva, vagyis akik titkos másolatot kapnak.
  • @subject: A levél címe.
  • @type: A MAPI levél definíción alapuló levél típus. (IP[M | C].Vendorname.subclass) Alapértelmezetten NULL. Az IPM-el kezdődő üzenetek a postafiókban maradnak, és megtalálja őket az xp_findnextmsg. Az IPC-vel kezdődő üzenetek nem jelennek meg a postafiókban, és a type paraméter beállítása segítségével olvashatók, találhatók meg.
  • @attach_results: Alapértelmezésben a lekérdezés eredménye a levél szövegrészében jelenik meg. Ha itt igaz értéket adunk meg, akkor mellékletként utazik az eredmény.
  • @no_header: Elhagyja az oszlopfejléceket
  • @no_output: Ha értékét igazra állítjuk akkor a kliens nem kap vissza értesítést a levél elküldéséről.
  • @width: Megadja az üzenet sorainak szélességét. Alapértelmezetten 80.
  • @separator: Oszlophatároló karakter az eredményhalmazhoz. Alapesetben üres string.
  • @echo_error: Amikor az értéke igaz, akkor a lekérdezés futása alatt visszaadott hibaüzenetek nem a hibanaplóba, hanem az üzenetbe kerülnek.
  • @set_user: A lekérdezés futtatásának biztonsági kontextusa.
  • @dbuser: Az adatbázis környezet, amelyben a lekérdezés fut. Adjuk meg minden esetben.
Levél fogadás
Az üzenetek fogadását az xp_readmail tárolt eljárás végzi. Szintaxisa a következő:
xp_readmail [[@msg_id =] 'message_number']
[, [@type =] 'type' [OUTPUT]]
[,[@peek =] 'peek']
[,[@suppress_attach =] 'suppress_attach']
[,[@originator =] 'sender' OUTPUT]
[,[@subject =] 'subject' OUTPUT]
[,[@message =] 'message' OUTPUT]
[,[@recipients =] 'recipients [;...n]' OUTPUT]
[,[@cc_list =] 'copy_recipients [;...n]' OUTPUT]
[,[@bcc_list =] 'blind_copy_recipients [;...n]' OUTPUT]
[,[@date_received =] 'date' OUTPUT]
[,[@unread =] 'unread_value' OUTPUT]
[,[@attachments =] 'attachments [;...n]' OUTPUT])
[,[@skip_bytes =] bytes_to_skip OUTPUT]
[,[@msg_length =] length_in_bytes OUTPUT]
[,[@originator_address =] 'sender_address' OUTPUT]]
Paraméterek (amelyek a levélküldésnél nem szerepeltek):
  • @msg_id: A fogadott levél száma.
  • OUTPUT: Ha megadjuk, akkor a meghatározott paraméter megjelenik a kimeneten.
  • @peek: Meghatározza, hogy a feldolgozás után a levél olvasottként legyen-e megjelölve. True esetén nem olvasott, false esetén olvasott, és ez utóbbi az alapértelmezett.
  • @suppress_attach: Alapértelmezésben true értékű, nem készít átmeneti mappát a mellékletnek. Ha értéke false, akkor nincs ilyen korlátozás.
  • @originator: A küldő visszaadott levélcíme.
  • @date_received: A levél dátuma.
  • @unread: Megadja, hogy a levél ezelőtt el lett-e olvasva, vagy nem.
  • @attachments: Pontosvesszővel elválasztott listája a mellékleteket tartalmazó mappáknak.
  • @skip_bytes: Megadható az a bájt mennyiség, amit a levél feldolgozásakor átugrik, mielőtt beolvassa a levél tartalmából a következő 255 karaktert.
  • @msg_length: A levél üzenet tartalmának mérete.
  • @originator_address: A levél küldőjének levélcíme.
Az xp_readmail visszaad egy eredménytáblázatot az alábbi oszlopokkal (korábbi levelek jelennek meg elől).
Oszlopnév Leírás
Originator Az üzenet küldője
Date Received Az üzenet fogadásának dátuma
Recipients A levél címzettjei
CC List Másolatot kapott címzettek
BCC List Titkos másolatot kapott címzettek
Subject Címe a levélnek
Message Üzenet test (szöveg)
Unread El lett-e olvasva a levél
Attachments Az üzenet mellékletei
Message ID Üzenet azonosítója
Type Üzenet típusa
Mielőtt beállítanánk az SQL Mail-t
Az SQL Mail számára szükséges egy levél kapcsolat, egy postafiók, levél profil, és egy Windows NT azonosító, amely indítja az SQL szervert. Exchange szerver esetében az azonosítónak tartományi azonosítónak kell lennie. POP3/SMTP esetében lehet helyi is.
A legegyszerűbb eljárás az, ha belépünk a szerverre az SQL szervert indító azonosító segítségével, beállítjuk a mail profile-t, leteszteljük a levelezési kapcsolatot, majd átadjuk ezt a profilt az SQL Mail-nek. Amikor profil nevet választunk, ne használjunk speciális karaktereket és a profil neve ne legyen hosszabb 32 karakternél.
SQL Mail beállítása
  • Az Exchange szerveren állítsunk be egy postafiókot annak az azonosítónak, amely az MSSQLServer szolgáltatást futtatja. POP3 esetén hozzunk létre POP3 postafiókot.
  • Lépjünk be az SQL szerver számítógépbe és telepítsünk Exchange/POP3 kliens alkalmazást. (Outlook 98, 2000 vagy 2002-t). SQL 2000 esetében az Outlook 2000, vagy 2002 telepítése szükséges.
  • Indítsuk el az Outlook-ot, és állítsuk be a kapcsolatot az Exchange/POP3 szerverhez.
  • Indítsuk el a Vezérlőpultból a Posta alkalmazást, és vizsgáljuk meg, a profilok között, hogy a beállított profil 32 karakteresnél rövidebb nevű-e.

  • Vizsgáljuk meg a szolgáltatásoknál, hogy az MSSQLServer az általunk éppen használt azonosító alatt fut-e. Az SQL szerver Enterprise Manager-ben, ha a szerver tulajdonságlapján megnézzük, akkor a security lap alsó részében látható, hogy mely azonosító nevében fut a szerver.

  • Állítsuk be az SQL Mail-t, hogy azt a profilt használja, amit az imént beállítottunk. Az Enterprise Manager-ben nyissuk le a Support Services fát, és ott kattintsunk az SQL Mail-re. Nézzük meg ennek is a tulajdonságlapját a jobb egérgomb segítségével felbukkanó menüben. Itt válasszuk ki a profilt. (Outlook)
  • Teszteljük le úgy, hogy indítsunk egy lekérdező ablakot (Query Analyzer), és használjuk az xp_sendmail parancsot. Az alábbiakban láthatunk példát az xp_sendmail használatára. A szolgáltatás SQL 2000 esetén automatikusan indul.

Példa levélküldésre
EXEC xp_sendmail @recipients = 'admin13@hotmail.com',
@query = 'SELECT * FROM INFORMATION_SCHEMA.TABLES',
@subject = 'SQL szerver üzenet',
@message = 'Az INFORMATION_SCHEMA.TABLES tartalma:',
@attach_results = 'TRUE', @width = 250
Elkészít és elküld egy levelet, amelynek címzettje 'admin13@hotmail.com', a megadott lekérdezés eredménye pedig mellékletként csatolódik, 250-es sorhosszal.
A mellékelt állományban több példát is láthatunk levélküldésre, ügyeljünk arra, hogy a címzett nevét a saját címünkre állítsuk be!