EMail via SMTP versenden (synchron / asynchron)

Die im Folgenden aufgeführten Codeausschnitte stützen sich u.A. auf Beispiele der nachfolgenden Seiten:

synchrones Senden (einfaches Beispiel)

using System;
using System.Collections.Generic;
using System.Text;
using System.Net; // NetworkCredential
using System.Net.Mail;
using System.Net.Mime;
using System.ComponentModel;
using System.IO; //AsyncCompletedEventArgs

class Program
{
    static void Main(string[] args)
    {
        // Mailobjekt erzeugen
        MailMessage mmMsg = new MailMessage();

        // Absenderadresse, Name, Codierung
        mmMsg.From = new MailAddress("horst@domain.com", "Horst", Encoding.UTF8);
        // Empfängeradresse, Name, Codierung
        mmMsg.To.Add(new MailAddress("heinz@domain.com", "Heinz", Encoding.UTF8));

        // Mailüberschrift + Codierung
        mmMsg.Subject = "Mailüberschrift";
        mmMsg.SubjectEncoding = Encoding.UTF8;

        // Mailtext + Codierung
        mmMsg.Body = "Testtext";
        mmMsg.Body += Environment.NewLine;
        mmMsg.Body += "Testtext2";
        mmMsg.BodyEncoding = Encoding.UTF8;

        // Anhänge hinzufügen
        // Mime-Typen: http://www.webmaster-toolkit.com/mime-types.shtml
        // Textdatei + Mimetype
        mmMsg.Attachments.Add(new Attachment("c:\\Test.txt", "text/plain"));
        // Exedatei + Mimetype
        mmMsg.Attachments.Add(new Attachment("c:\\Test.exe", "application/octet-stream"));
        // Bild + Mimetype
        mmMsg.Attachments.Add(new Attachment("c:\\Test.jpg", "image/jpeg"));

        // MailClient-Obj erzeugen und Servernamen und Port übergeben
        SmtpClient smtpClient = new SmtpClient("mail.gmx.net", 25);
        // User, Passwort
        smtpClient.Credentials = new NetworkCredential("user", "password");

        // Mail Directory festlegen
        smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
        smtpClient.PickupDirectoryLocation = "c:\\Temp\\";

        // Mail versenden
        smtpClient.Send(mmMsg);
    }
}

asynchrones Senden (Komplexbeispiel)

using System;
using System.Collections.Generic;
using System.Text;
using System.Net; // NetworkCredential
using System.Net.Mail;
using System.Net.Mime;
using System.ComponentModel;
using System.IO; //AsyncCompletedEventArgs

class Program
{
    static bool bSendCompleted = false;

    private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
    {
        String sToken = (string)e.UserState; // "ÜbergabeToken", siehe smtpClient.SendAsync(...)

        if (e.Cancelled)
        {
            Console.WriteLine("[{0}] Mailsendung abgebrochen.", sToken);
        }

        if (e.Error != null)
        {
            Console.WriteLine("[{0}] {1}", sToken, e.Error.ToString());
        }
        else
        {
            Console.WriteLine("Mail versendet.");
        }

        bSendCompleted = true;
    }

    static void Main(string[] args)
    {
        // Mailobjekt erzeugen
        MailMessage mmMsg = new MailMessage();

        // Absender, Name, Codierung
        mmMsg.From = new MailAddress("horst@domain.com", "Horst", Encoding.UTF8);

        // Empfänger, Name, Codierung
        mmMsg.To.Add(new MailAddress("heinz@domain.com", "Heinz", Encoding.UTF8));
        mmMsg.To.Add(new MailAddress("klaus@domain.com", "Klaus", Encoding.UTF8));

        // Carbon-Copy-Empfänger, Name, Codierung
        mmMsg.CC.Add(new MailAddress("rita@domain.com", "Rita", Encoding.UTF8));

        // Blind-Carbon-Copy-Empfänger, Name, Codierung
        mmMsg.Bcc.Add(new MailAddress("sieglinde@domain.com", "Sieglinde", Encoding.UTF8));

        // Priorität der Mail
        mmMsg.Priority = MailPriority.Normal;



        // Mailüberschrift + Codierung
        mmMsg.Subject = "Mailüberschrift";
        mmMsg.SubjectEncoding = Encoding.UTF8;

        // Mailtext, HTML, Codierung
        mmMsg.Body = "Testtext";
        mmMsg.Body += Environment.NewLine;
        mmMsg.Body += "Testtext2";
        mmMsg.IsBodyHtml = false;
        mmMsg.BodyEncoding = Encoding.UTF8;

        // Benachrichtigungen
        mmMsg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess | DeliveryNotificationOptions.OnFailure | DeliveryNotificationOptions.Delay;

        // Filestream für Mailanhang (Bild) öffnen
        FileStream fs = new FileStream("c:\\Bild1.jpg", FileMode.Open, FileAccess.Read);

        // Typ des Mailanhang festlegen (JPEG, Name)
        ContentType ct = new ContentType();
        ct.MediaType = MediaTypeNames.Image.Jpeg;
        ct.Name = "Bild1.jpg";

        // Mailanhang hinzufügen
        mmMsg.Attachments.Add(new Attachment(fs, ct));

        // MailClient-Obj erzeugen
        SmtpClient smtpClient = new SmtpClient();
        // Servernamen
        smtpClient.Host = "mail.gmx.net";
        // Mail-Port
        smtpClient.Port = 25;
        // Timeout bis Abbruch
        smtpClient.Timeout = 10000;
        // SSL verwenden?
        smtpClient.EnableSsl = false;
        // Mail Directory festlegen, funktioniert nicht mit SSL
        smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
        smtpClient.PickupDirectoryLocation = "c:\\Temp\\";

        // Username und Passwort festlegen        
        smtpClient.UseDefaultCredentials = false;
        smtpClient.Credentials = new NetworkCredential("user", "password");

        // Eventhandler für asyncheones Senden hinzufügen
        smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);

        // Mail asynchron versenden
        smtpClient.SendAsync(mmMsg, "ÜbergabeToken");

        Console.WriteLine("Mail wird versendet ... 'c' zum abbrechen.");
        string sInput = Console.ReadLine();

        // auf Eingabe warten und wenn Mail noch nicht versendet
        // evtl. abbrechen
        if (sInput.StartsWith("c") && bSendCompleted == false)
        {
            smtpClient.SendAsyncCancel();
        }

        // aufräumen
        mmMsg.Dispose();

        // Stream für Mailanhang schließen
        fs.Close();
    }
}