Przejdź do treści

Programowe wysyłanie maili

Prosty sposób

Aby wysłać maila z kodu C# metody obiektu lub z reguły Schedulera napisz:

API.SendEmail("adres@sente.pl","Tytuł","Treść");

Serwery SMTP różnych dostawców czasem pozwalają różnicować adres konta z którego wysyłamy maila UserName od adresu, jaki zostanie podany w polu nadawca wiadomości SendFrom. Np. u googla możemy tak zrobić pod warunkiem, że mamy to inne konto podlinkowane jako połączone z kontem użytkownika, w przeciwnym wypadku parametr SendFrom będzie ignorowany.

Funkcja zadziała, jeśli w pliku smd zostanie skonfigurowane konto serwera SMTP, przez który będzie wysyłana poczta.

Zaawansowany sposób

Rekomendowany sposób

Rekomendowany sposób opiera się na kupionej przez Sente, specjalistycznej bibliotece Limilabs.Mail i dużo lepiej współpracuje z różnymi serwerami SMTP.

Oto przykład z kodu Neosa.

public static void Email()
{
  MailBuilder mb = new MailBuilder();

  mb.From.Add(new MailBox("adres e-mail adresata"));
  MailAddressParser map = new MailAddressParser();
  foreach (var addr in map.Parse("adres e-mail odbiorcy"))
  mb.To.Add(addr);

  mb.Subject = "Temat wiadomości";
  var text = "Treść wiadomości";

  if (text.Contains("<html>"))
        mb.Html = text;
  else
        mb.Text = text;

  string path = API.GetRepositoryFilePath("nazwa pliku z rozszerzeniem","nazwa repozytorium z tabeli s_storage",true);
  MimeData attachment = mb.AddAttachment(path);

  var res = API.SendEmail(new List<IMail>() { mb.Create() });
}

W Schedulerze trzeba dla kilku obiektów na razie podawać pełen namespace, więc również zamieszczam przykład sprawdzony.

public static void Email()
{
  var mb = new Limilabs.Mail.MailBuilder();
  mb.From.Add(new Limilabs.Mail.Headers.MailBox("powiadomienia.sente@lobos.pl"));
  var map = new Limilabs.Mail.Headers.MailAddressParser();
  foreach (var addr in map.Parse("f.hoffmann@sente.pl"))
  mb.To.Add(addr);
  mb.Subject = "Temat wiadomości";
  var text = "Treść wiadomości";

  if (text.Contains("<html>"))
        mb.Html = text;
  else
        mb.Text = text;

  string path = API.GetRepositoryFilePath("201602_POTWUTARGUSKLEP7_1475.pdf","CRMDOC",true);
  var attachment = mb.AddAttachment(path);

  var res = API.SendEmail(new List<Limilabs.Mail.IMail>() { mb.Create() });

  return "";
}

Stary sposób

Ten sposób został zachowany dla kompatybilności wstecznej z już istniejącymi rozwiązaniami. Opiera się o bibliotekę System.Net.Mail i może nie współpracować z serwerami pocztowymi które w różny pokręcony sposób implementują standard SMTP (u nas np. Lobos, IBS), działa jednak np. dla GMaila.

Aby wysłać maila z załącznikami lub kilka maili na raz, należy wykorzystać bardziej zaawansowany prototyp funkcji SendEmail. Parametrem tej funkcji jest lista elementów klasy MailMessage.

using (System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage())
{ 
  message.From = new System.Net.Mail.MailAddress("ja@mojadomena.pl");
  message.To.Add("ty@twojadomena.pl");
  message.Subject = "Temat wiadomości";
  message.Body = "Treść wiadomości";
  if (message.Body.Contains("<html>")) message.IsBodyHtml = true;//czy treść jest HTMLem?
  //wyciągamy załącznik jako dokument z repozytorium
  string path = API.GetRepositoryFilePath("plik.pdf","CRMDOC",true);
  //jesli chcemy wyciągnąć załącznik z TOWPLIKI, to używamy funkcji API.GetBinaryFilePath(...)
  message.Attachments.Add(new System.Net.Mail.Attachment(path));
  //do funkcji SendEmail przekazujemy listę, gdyż możemy wysłać kilka wiadomości na raz
  var res = API.SendEmail(new List<System.Net.Mail.MailMessage>() { message });
  //wynikiem funkcji jest lista wszystkich wyjątków które wystąpiły
  if (res.Any()) throw res.First();
}

Bardziej zaawansowany sposób

Przy użyciu Neos.API

Jeżeli chcemy wysyłać maile używając innego konta niż skonfigurowane w pliku smd, możemy skorzystać z klas, które oferuje biblioteka Limilabs.Mail.

public static void Email()
{
  string senderMail = "j.kowalski@sente.pl";
  string senderName = "Jan Kowalski";
  string recipientMail = "a.nowak@sente.pl";
  string subject = "Spotkanie kwartalne";
  string content = "Cześć Andrzej! Pamiętaj o uzupełnieniu danych kwartalnych w prezentacji.";
  string accountName = "j.kowalski@sente.pl";
  string accountPass = "szefuncio01";

  var mb = new Limilabs.Mail.MailBuilder();
  var map = new Limilabs.Mail.Headers.MailAddressParser();

  mb.From.Add(new Limilabs.Mail.Headers.MailBox(senderMail, senderName));
  foreach (var addr in map.Parse(recipientMail))
      mb.To.Add(addr);
  mb.Subject = subject;
  mb.Text = content;

  Limilabs.Mail.IMail email = mb.Create();

  using (Limilabs.Client.SMTP.Smtp smtp = new Limilabs.Client.SMTP.Smtp())
  {
    smtp.ConnectSSL("smtp.sente.pl");
    smtp.UseBestLogin(accountName, accountPass);

    Limilabs.Client.SMTP.ISendMessageResult result = smtp.SendMessage(email);

    if (result.Status == Limilabs.Client.SMTP.SendMessageStatus.Success)
    {
        API.ShowMessageBox("Wiadomość została wysłana!", "Info");
    }
    else if (result.Status == Limilabs.Client.SMTP.SendMessageStatus.Failure)
    {
        API.ShowMessageBox("Pojawił się problem z wysłaniem wiadomości!", "Info");
    }

    smtp.Close();
  }
}

Przy użyciu plugina Neos.Email

Plugin daje nam łatwiejszą możliwość wysyłania maili z dowolnych skrzynek i ładnie ukrywa szczegóły implmementacyjne. Instrukcja tutaj

Integracja z GMail

Uwaga!

Google planuje zrezygnować ze wsparcia LSA, dlatego zalecamy konfigurację poprzez hasło aplikacyjne fa2gmail