sobota, 26 grudnia 2009

Wysyłanie meili w .NET

Wysyłanie maila w .NET to jedna z prostszych czynności jakie możemy wymagać od naszego programu.

1. Przestrzeń System.Net.Mail

Przestrzeń ta zawiera wszystko co jest nam potrzebne aby w łatwy i szybki sposób wysłać maila. Najczęściej używanymi klasami z pewnością są:
Attachment – reprezentuje załącznik wiadomości
MailAddress – klasa reprezentująca mail nadawcy lub odbiorcy
MailMessage – reprezentuje wiadomość do wysłania
SmtpClient – pozwala na wysłanie utworzonego maila protokołem SMTP
SmtpException – wyjątek w przypadku błędu podczas wysyłania wiadomości


2. Tworzenie wiadomości email

 
Korzystając z wymienionych wcześniej klas możemy utworzyć naszą wiadomość. Rozpoczniemy od utworzenia obiektu klasy MailMessage:
    public MailMessage();
    public MailMessage(MailAddress from, MailAddress to);
    public MailMessage(string from, string to);
    public MailMessage(string from, string to, string subject, string body);

Jak widać mamy do dyspozycji 4 konstruktory. Parametry które przyjmują to:
From – mail osoby wysyłającej
To – mail osoby do której kierujemy wiadomość
Subject – temat wiadomości
Body – treść wiadomości
Wszystkie te parametry można ustawić po utworzeniu obiektu klasy MailMessage:
            MailMessage message = new MailMessage();
            //właściwość To jest typu MailAdressCollection tak więc możemy
            //dodać wiele osób do których kierujemy naszą wiadomość:
            //message.To.Add(new MailAddress("do_kogo1@o2.pl");
            //message.To.Add(new MailAddress("do_kogo2@o2.pl");
            //message.To.Add(new MailAddress("do_kogo3@o2.pl");
            message.To.Add(new MailAddress("do_kogo@o2.pl"));
            message.From = new MailAddress("od_kogo@o2.pl");
            message.Subject = "Temat naszej wiadomości";
            message.Body = "Treść naszej wiadomości";

Oprócz tych podstawowych właściwości możemy także ustawić takie rzeczy jak:
            //Wysłanie ukrytej kopii
            message.Bcc.Add(new MailAddress("do_kogo@o2.pl"));
            //Wysłanie kopi
            message.CC.Add(new MailAddress("do_kogo@o2.pl"));
            //Powiadomienie o stanie wysłania; opóźnienie, dostarczenie, niepowodzenie
            message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
            //Priorytet wiadomości
            message.Priority = MailPriority.High;


3. Dodawanie załączników do wiadomości
 
Wiele wysyłanych przez nas wiadomości zawiera dodatkowe dane w postaci zdjęć, plików PDF czy też innego rodzaju dane audio/wideo. Aby do wiadomości dodać załączniki tworzymy obiekty klasy Attachment a w jego konstruktorze podajemy ścieżkę do pliku na dysku:
            message.Attachments.Add(new Attachment(@"C:\Users\Patryk\Documents\CV.docx"));
            message.Attachments.Add(new Attachment(@"C:\Users\Patryk\Documents\Lista_Zakupow.docx"));



4. Wsparcie dla znaczników HTML
 
Aby włączyć w wiadomości wsparcie dla znaczników HTML należy najpierw ustawić właściwość IsBodyHtml na true:
message.IsBodyHtml = true;
Po tej operacji możemy używać znaczników HTML w naszej wiadomości:
message.Body = @"<html><body><h1>Hello</h1><br><br>Co u ciebie słychać?</body></html>";
Aby dodać jakąś grafikę bezpośrednio w wiadomości (nie jako załącznik) należy skorzystać z klas AlternateView oraz LinkedResource:
            //treść naszej wiadomości ze znacznikami HTML
            string body = "<html><body><h1>Hello</h1><br><br>Co u ciebie słychać?<br>Tutaj moje zdjęcie z zeszłych wakacji: <br> <img src=\"cid:Zd1\"></body></html>";
            //tworzymy alternatywny widok
            AlternateView htmlView = AlternateView.CreateAlternateViewFromString(body);
            //wybieramy zdjęcie które zostanie dodane do naszej wiadomości HTML
            LinkedResource image = new LinkedResource(@"C:\Users\Patryk\Pictures\przyklad_graphic.png", "image/png");
            //nadajemy Id naszemu zdjęciu (później wstawiamy je jako cid:"Id"
            image.ContentId = "Zd1";
            htmlView.LinkedResources.Add(image);
            //dodajemy widok do wiadomości
            message.AlternateViews.Add(htmlView);



5. Wysyłanie wiadomości
 
Czas teraz na najważniejszą część czyli wysłanie wiadomości. Wysyłamy za pomocą protokołu SMTP więc tworzymy najpierw obiekt tej klasy:
SmtpClient smtp = new SmtpClient("poczta.o2.pl", 587);
W konstruktorze jak widać podałem port SMTP wykorzystywany przez o2.pl oraz nazwę serwera.
Jeśli serwer wymaga uwierzytelnienia, należy stworzyć obiekt klasy NetworkCredential i w konstruktorze podać wymagane parametry:
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential("uzytkownik", "haslo");
Na końcu oczywiście wysyłamy nasze dzieło:
smtp.Send(message);

Jeśli zrobiliśmy wszystko zgodnie z instrukcją, nasza wiadomość powinna zostać wysłana bez żadnych błędów.
Wracając jeszcze do portów SMTP to należy sprawdzić jaki jest używany przez danego dostawcę poczty. Najczęściej to 587 od kiedy TP SA zablokowała port 25.

Tyle odnośnie wysyłania wiadomości. Miłego spamowania J

sobota, 12 grudnia 2009

Factory Method

aplikacja
Wzorcem obiektowym którym dzisiaj się zajmiemy jest Factory Method Pattern (Metoda Wytwórcza). Jest jeden z kreacyjnych wzorców projektowych, a jak sama nazwa sugeruje służy do tworzenia obiektów. Ściśle ujmując dostarcza on interfejsu do tworzenia obiektów, ale o typie obiektów decydują jego podklasy.
Zobaczmy na schemat klas:



Jak widać mamy tu do czynienia z dwoma klasami abstrakcyjnymi: Product czyli obiekt który chcemy utworzyć oraz Creator definiujący sposób jego utworzenia.

Zobaczmy na przykład. Rozważmy produkcję laptopów. Mamy dwie fabryki wytwarzające gotowe laptopy. Jedna z fabryk zlokalizowana jest w Polsce druga w Japonii. Fabryki produkują dwa rodzaje laptopów: modelA i modelB. Diagram klas:


Typ wyliczeniowy LaptopModel pozwala nam w prosty sposób tworzyć obiekty potrzebnego nam typu. Można także robić to w inny sposób jak np. przekazać string czy daną typu int. Enum wydał mi się tu jednym z najbardziej uniwersalnych i prostych rozwiązań.

Kod aplikacji można pobrać stąd: aplikacja