pátek 5. prosince 2014

Razor a email

V přechozím příspěvku jsem ukázal, jak využít Razor i mimo web aplikace. Nyní popíši, jak tohoto přístupu využít v případě, že chceme v aplikaci vytvořit email a ten poslat uživateli. Email bude obsahovat i obrázky a přílohu.

Vytvoření šablony pro email

Šablony jsou vlastně dvě. V první je vlastní obsah mailu a tato šablona využívá jinou jako svoji obálku - to je vhodné pro případy, kdy bude potřeba více emailů a všechny by měly mít například jednotný vzhled.


email.cshtml
@* Generator: Template *@

@functions{
    public string Recipient { get; set; }

    public string Sender { get; set; }

    public string Content { get; set; }
}

@{ Layout = new emailLayout();}

<img alt="Logo" src="cid:logo" />

<table width="550" class="headerText">
    <tr><td>Hello Mr.@Recipient</td></tr>
    <tr><td>This is my message for you: @Content</td></tr>
    <tr><td>Regards, @Sender</td></tr>
</table>

emailLayout.cshtml
@* Generator: Template *@

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
    <style type="text/css">
        body {
            font-family: "Lucida Grande","Helvetica Neue",sans-serif;
            font-size: 12px;
            color: #333333;
            background: White;
        }
    </style>
</head>
<body>
    @RenderBody()
</body>
</html>

Vygenerování emailu

Získání HTML mailu je jednoduché - jak ze šablony vyrobit text už bylo ukázáno v předchozím díle, nyní jen použijeme metodu třídy AlternateView k získání HTML obsahu:

Code:
MailMessage mail = new MailMessage();

var htmlContent = (new email { Sender = "Martin", Recipient = "John", Content = "You win!!!" }).TransformText().Trim();
var htmlView = AlternateView.CreateAlternateViewFromString(htmlContent, new ContentType("text/html"));

mail.AlternateViews.Add(htmlView);

Vkládání obrázků

V kódu šablon si můžete všimnout i značek pro zobrazení obrázků. Pokud má email obsahovat obrázky, máte tyto tři možnosti:

  • v tagu img odkázát na existující, veřejně dostupný obrázek na sítí 
  • vložit obrázek do emailu  a odkázat na něj v tagu img pomoci cid:název 
  • vložit obrázek jako base64

Z textu šablon vyplývá, že použiji druhou možnost - jako hodnotu ContentId použijeme hodnotu zadanou za cid: v src atributu příslušeného img tagu:

var attachResource = new LinkedResource(new MemoryStream(<byte[]>));
attachResource.ContentId = <resourceID>;
htmlView.LinkedResources.Add(attachResource);

Vkládání příloh

Pokud chceme k emailu přiložit i přílohu, jde to podobně jednoduše - nejprve si vytvoříme příslušný objekt a pak je přidáme do kolekce příloh mailu:


Attachment att = new Attachment(new MemoryStream(<byte[]>), attachmentName);

mail.Attachments.Add(att); 

Tipy

Pro testování posílání emailů lze použít utilitku Smtp4Dev a    do config souboru aplikace přidáme následující nastavení:

<system.net>
   <mailSettings>
      <smtp from="mail@test.com">
         <network host="localhost" port="25"/>
      </smtp>
   </mailSettings>
</system.net>

Výsledek

Po spuštění pak obdržíme  email, který nás informuje o výhře:



A na závěr snad jen upozornění na možnost podívat a získat celý (zahrnuje i kód z prvního příspěvku na toto téma) funkční kód na Codeplex a jako v předchozím díle je zde i poster (stránka ve formátu A4 v pdf), který stručně shrnuje vše z tohoto příspěvku.

1 komentář: