Setkal jsem se v aplikaci s požadavkem na přímé odesílání mailu. K tomuto účelu se hodí třída SmtpClient, která obsahuje parametrickou metodu .Send().
Bohužel, ve Windows 7 a Windows Vista metoda selhává /nepřítomnost prostředků IIS/. Rozhodl jsem se použít k odeslání asynchronní variantu metodu .SendAsync(). Na rozdíl od metody .Send() však tato vyžaduje událost pro obsluhu stavu.
Pro funkčnost je také podstatné, stanovit správně schránku pro odesílání emailu v systému /DeliveryMethod/. Uvádím možné řešení:
public bool SendMailA(string p_from, string p_to, string p_sub,
string p_body, string p_attach)
{
//iniciuje třídu SmtpClient s parametry: adresa SMTP serveru,
//port serveru
SmtpClient client = new SmtpClient(cSMTPserver, nPortNum)
//autentizace klienta, pokud jej bude provider vyzadovat
client.Credentials =
new NetworkCredential(this.cUserAddr, this.cUserPass);
client.EnableSsl = this.bIsSSL;
client.Timeout = 5000;
try
{
//iniciuje mailovou zpravu
MailMessage message = new MailMessage(from, to);
message.Sender = p_from;
message.To = p_to;
message.IsBodyHtml = this.bIsHTML;
message.Body = p_body;
message.BodyEncoding = System.Text.Encoding.UTF8;
message.Subject = p_sub;
message.SubjectEncoding = System.Text.Encoding.UTF8;
//token
object mailState = message;
//událost pro obsluhu stavu zpracování metody
client.SendCompleted +=
new SendCompletedEventHandler(SmtpClient_OnCompleted);
client.SendAsync(message, mailState); //odeslani zpravy
return (this.bSendRes);
}
catch (Exception ex)
{
MessageBox.Show(ViewException(ex),"Chyba");
return (false);
}
//událost pro obsluhu stavu zpracování metody SendAsync
public void SmtpClient_OnCompleted(object sender,
AsyncCompletedEventArgs e)
{
string m_result = "";
MailMessage mail = (MailMessage)e.UserState;
try
{
if (e.Cancelled)
{
m_result = "Odesílání mailu příjemci " +
mail.To.ToString() + " zrušeno!";
}
if (e.Error != null)
{
m_result = "Chyba v průběhu odesílání mailu " +
mail.To.ToString() + "\r\n" + e.Error.ToString();
}
else
{
m_result = "Zpráva příjemci " + mail.To.ToString() + " odeslána...";
this.bSendRes = true;
}
}
catch (Exception ex)
{
m_result = ex.Message + ex.InnerException.ToString();
}
} //SmtpClient_OnCompleted