C# - E-mail küldő szerviz alkalmazás

forráskód letöltése
Ebben a példában egy olyan szerviz alkalmazást készítünk, amely elindulásakor egy SMS üzenetben jelzi az adott szerver rendszergazdájának a számítógép nevét, elindulásának tényét, és időpontját - ha az valamilyen okból újraindulni kényszerült -, amennyiben rendelkezésre áll egy megfelelő e-mail cím valamelyik mobilszolgáltatónál.
A mellékelt példaalkalmazás felhasználása előtt a mellékelt MailService.xml állományt el kell helyezni az alkalmazás mappájában, majd a kód 66. és 81. sorában meg kell változtatni az elérési útvonalakat. Az XML állományban meg kell adni a kiszolgáló szerver címét és az e-mail címet a megfelelő tag-ek között.
Szerviz alkalmazást a korábban ismertetett módon készíthetünk, válasszuk a File – New – Project menüpontot, majd a Visual C# Project-ből Windows Service tételt. Ekkor létrejön egy új project, benne egy Service1.cs forrás állomány, melyben megtaláljuk a szerviz alkalmazásunk osztályát, amely a ServiceBase osztályból lett származtatva.
A mellékelt példában egy olyan szerviz alkalmazást készítünk, mely a számítógép indulásakor automatikusan elindul, erről pedig egy üzenetet küld egy e-mail címre. Kihasználva azt a napjainkban népszerű szolgáltatást, miszerint egy adott postafiók tulajdonosa SMS üzenetet kap e-mail-jei érkezéséről, elegendő egy ilyen szolgáltatáshoz kapcsolódó e-mail címet megadni.
A megvalósítandó szerviz alkalmazás a kiszolgáló szerver címét és az elektronikus levél címét egy XML állományból olvassa be, így annak elérhetőnek kell lenni, valamint helyes adatokat kell tartalmaznia.
Ahhoz, hogy a szervizek indulásához valamilyen feladat elvégzését kapcsoljuk, mint jelen esetben az e-mail elküldését, felül kell írnunk a ServiceBase osztály OnStart metódusát, mely az induláskor fut le.
Egy XmlDocument osztályú objektumba beolvassuk az állományt:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("C:\\MailService\\MailService.xml");    
A szerviz alkalmazás levélküldő funkciójának megvalósításához a System.Web.Mail névtérben található SmtpMail osztályt használjuk fel. Az objektumnak meg kell adni a kiszolgáló nevét, melyet az XML-ből veszünk:
SmtpMail.SmtpServer = xmlDoc.DocumentElement["SmtpServer"].InnerText;
Az üzenet egy MailMessage típusú adat, melynek property-jét kell feltölteni az üzenet adataival. Jelen esetben csak az üzenet címzettjét kell megadni, vagyis azt az elektronikus levélcímet, mely egy SMS-t küldő szerveren található, valamint meg kell adnunk az üzenet tárgyát, mely az SMS üzenetrésze lesz:
message.To = xmlDoc.DocumentElement["AdminMailAddress"].InnerText;
message.Subject = Environment.MachineName.ToString() + " szerver " + DateTime.Now.ToString() + " -kor elindult!";
Az üzenet tárgya két információt tesz az elküldendő karakterláncba: az első a számítógép neve, melyet a System névtér Environment osztályának MachineName statikus property-je segítségével adunk meg. A második információ a számítógép elindulásának időpontja.
Az elektronikus levél küldése az SmtpMail osztály Send metódusával történik meg:
try
{
  SmtpMail.Send(message);
}
catch
{}  
Az alkalmazás leállításakor végrehajtódó funkciók, például egy napló állományba írás, az OnStop metódusba kerülnek:
Stream st = File.Open("C:\\MailService\\log.txt", FileMode.OpenOrCreate);
st.Seek(0, SeekOrigin.End);
BinaryWriter bw = new BinaryWriter(st);
bw.Write(" OnStop: "+DateTime.Now.ToString());
st.Close();
Az alkalmazást felhasználás előtt telepíteni kell a többi szerviz alkalmazás közé.
A telepítés menetét megkönnyítendő válaszuk ki a „Service1.cs [Design]” lapot. A Properties ablak alsó részén látható egy „Add Installer” link, melyre kattintva létrejön a projektünkhöz egy új forrás állomány ProjectInstaller.cs névvel. Ebbe automatikusan bekerül egy ServiceProcessInstaller és egy ServiceInstaller komponens, mely segít elvégezni a telepítést, eltávolítást.
Válasszuk a serviceInstaller1 komponenst és a DisplayName property-jének adjuk értékül a _MailService szöveget. Ezzel azt érjük el, hogy a rendszer szerviz kezelő alkalmazásában a mi szervizünk _MailService névvel jelenik meg a listában elsőként.
A szerviz alkalmazás indulásának típusa háromféle lehet, melyet a ServiceInstaller osztály StartType property-jének segítségével adhatunk meg. A property egy ServiceStartMode enumerátor, melynek a következő értékeket adhatjuk meg:
Attribútum Jelentés
Automatic Ezt beállítva a szerviz alkalmazás automatikusan elindul, amikor az operációs rendszer betöltődik. Amennyiben az automatikusan induló szervizhez valamilyen manuálisan indítandó szerviz kapcsolódik (függőségi viszonyban állnak), akkor az utóbbi attribútumú szerviz is elindul automatikusan.
Manual Jelzi, hogy a szerviz alkalmazás manuálisan indítható csak. Vagy egy alkalmazás teszi meg ezt a ServiceController osztály Start metódusával, vagy a Service Control Manager használatával indítjuk el mi magunk.
Disabled A szerviz alkalmazás nincs engedélyezve, vagyis a SCM (Service Control Manager)-ben „Letiltva” állapotban jelenik meg.
Fordítsuk le az alkalmazást a Build – Build menüpont kiválasztásával. Itt most nem futtathatjuk a programot, hiszen ez egy szerviz alkalmazás, így azt csak az operációs rendszer futtathatja.
A tényleges telepítés elvégzéséhez még szükségünk lesz egy kis segédprogramra, mely része a Visual Studio.NET-nek. Ez az InstallUtil.exe lesz. Ennek kell paraméterként megadnunk a telepítendő szerviz alkalmazásunk EXE-jét elérési útvonallal. Ehhez indítsunk egy parancssort, méghozzá a Start - Programs - Microsoft Visual Studio.NET - Visual Studio.NET Tools - Visual Studio.NET Command Prompt menüponton keresztül. Erre a speciális parancssorra azért van szükség, hogy az InstallUtil alkalmazás bárhonnan elérhető legyen.
installutil C:\MailService\MailService.exe
Az elérési útvonal természetesen mindig az aktuális legyen, ahol a szerviz alkalmazásunk is található.
Ha szeretnénk eltávolítani a szervizek közül az alkalmazásunkat, akkor ismét az InstallUtil.exe segédprogramot kell használnunk. Most viszont egy /u paramétert is kell használnunk jelezve, hogy most nem telepítés, hanem eltávolítás van.
Installutil /u C:\MailService\MailService.exe