Discussion:
Senden einer EMail aus einem Windows-Form-Programm
(zu alt für eine Antwort)
Frank Massel
2006-11-13 15:48:02 UTC
Permalink
Ein freundliches Hallo an die Newsgroup !

[Info: Ich verwende das MS Visual Studio 2005, C#]

Ich habe das "Mailer Technology Sample" aus der MSDN-Hilfe
ms-help://MS.VSCC.v80/MS.MSDN.vAug06.en/dv_fxsamples/html/5889bd22-58e7-4898-a2fc-faae3fcb369b.htm
(zum Verschicken von EMails mit den Klassen MailMessage und SmtpClient) mit
unserem eigenen SMTP-Server ausprobiert: Funktioniert.

Nächster Test: Verschicken einer EMail (Absender, Adressat, Betreff und Text
immer fest) aus einem C#-Windows-Forms-Programm, genauer nach dem Drücken
eines Schaltknopfes. Dazu habe ich den o.a. Quellcode sinngemäß in die
zugehörige "Button_Click"-Routine kopiert:

try
{
using (MailMessage message = new
MailMessage("EMailAdresse_ABSENDER", "EMailAdresse_EMPFÄNGER", "Betreff",
"Nachricht"))
{
SmtpClient mailClient = new
SmtpClient("MeinMailServerName");
mailClient.DeliveryMethod = SmtpDeliveryMethod.Network;
mailClient.UseDefaultCredentials = true;
mailClient.Send(message);
}
}
catch (FormatException ex)
{
//...
}
catch (SmtpException ex)
{
//...
}
[natürlich mit richtigem SMTP-Servernamen, richtigen EMailAdressen,...]

Nun das Problem:
Windows-Forms-Programm starten und Schaltknopf drücken:
Nix passiert ! Erst wenn das Programm beendet wird (= Schließen des
Fensters), wird auch die EMail verschickt.
Wenn man den Schaltknopf z.B. dreimal drückt, werden die drei EMails auch
erst NACH Beendigung des Programms (= Schließen des Fensters) verschickt.

Daraufhin habe ich auch nochmal das o.a. MSDN-Bsp. (Konsolen-Exe) im
DEBUG-Modus mit Einzelschritten durchlaufen. Auch da wird die EMail erst nach
Beendigung des Programms verschickt.

Hat jemand einen Tipp/Lösungsvorschlag ???

Ach so: Hintergrund des Ganzen: Wir möchten aus einem permanent laufenden
Programm im Fehlerfall zur Protokollierung und Benachrichtung EMails
verschicken.

Vielen Dank im voraus und viele Grüße aus (dem jetzt wieder jecken) Köln

Frank Massel
Frank Massel
2006-11-14 12:16:02 UTC
Permalink
Hallo an die Newsgroup,
ich habe selber eine Lösung gefunden:
Man lässt die Methode, die die EMail versendet, einfach in einer
zusätzlichen AppDomain ausführen (nur ein Thread reicht nicht): Wenn diese
AppDomain entladen wird, wird auch die EMail verschickt, auch wenn das
Hauptprogramm weiterläuft.

public static class Nachricht
{
public static short Send_via_EMail(string EMailAdresse_ABSENDER,
string
EMailAdresse_EMPFÄNGER,
string derBetreff,
string dieNachricht)
{
EMail_Nachricht dieEMail_Nachricht = null;

try
{
dieEMail_Nachricht = new
EMail_Nachricht(EMailAdresse_ABSENDER,

EMailAdresse_EMPFÄNGER,

derBetreff, dieNachricht);
}
catch (FormatException)
{
return -3;
}
catch(ArgumentNullException)
{
return -4;
}
try
{
AppDomain otherDomain = AppDomain.CreateDomain("otherDomain");
otherDomain.DoCallBack(new CrossAppDomainDelegate

(dieEMail_Nachricht.Verschicke_EMail));
AppDomain.Unload(otherDomain);
}
catch (SmtpException)
{
return -5;
}
catch (ArgumentNullException)
{
return -6;
}
return 0;
}
/*****************
* Unterklassen: *
* ***************/
[Serializable]
private class EMail_Nachricht
{
private string mEMailAdresse_ABSENDER = "";
private string mEMailAdresse_EMPFÄNGER = "";
private string mBetreff = "";
private string mNachricht = "";

public EMail_Nachricht(string EMailAdresse_ABSENDER, string
EMailAdresse_EMPFÄNGER,
string derBetreff, string
dieNachricht)
{
mEMailAdresse_ABSENDER = EMailAdresse_ABSENDER;
mEMailAdresse_EMPFÄNGER = EMailAdresse_EMPFÄNGER;
mBetreff = derBetreff;
mNachricht = dieNachricht;
}
public void Verschicke_EMail()
{
using (MailMessage MailMessage = new
MailMessage(mEMailAdresse_ABSENDER,

mEMailAdresse_EMPFÄNGER,

mBetreff, mNachricht))
{
SmtpClient mailClient = new SmtpClient("MeinSMTPServer");
mailClient.DeliveryMethod = SmtpDeliveryMethod.Network;
mailClient.UseDefaultCredentials = true;
mailClient.Send(MailMessage);
}
}
}
}
}

Lesen Sie weiter auf narkive:
Loading...