.net 如何使用剃刀引擎的电子邮件模板与图像源

wmomyfyw  于 2023-05-19  发布在  .NET
关注(0)|答案(2)|浏览(168)

我在www.example.com上找到了这个关于如何使用Razor Engine作为电子邮件模板的linkasp.net,它工作得很好。但我试着在电子邮件模板中有一个带有图像的标志。
就像这样:
EmailTemplate.cshtml(顺便说一下,这是一个强类型视图)

<html>
<body>
  <img src="logo.jpg" />
</body>
</html>

而当我试图通过电子邮件提交时,似乎图像路径没有被读取,它只在内容中渲染了一个X。
我在考虑将图像路径作为模型的一部分传递,但这种方式似乎很奇怪。有没有办法做到这一点?
任何帮助将不胜感激。谢谢

3vpjnl9f

3vpjnl9f1#

要在任何地方查看图像,您可以使用以下选项:

绝对网址

您可以简单地使用图像的完整绝对路径,例如"http://example.com/images/logo.png"
IMO这是最简单的选择,并建议为您的问题。

附件

正如Mason在评论中提到的,您可以将图像附加到邮件中,然后放置图像标签并使用附件的ContentId

//(Thanks to Mason for comment and Thanks to  Bartosz Kosarzyck for sample code)
string subject = "Subject";
string body = @"<img src=""$CONTENTID$""/> <br/> Some Content";

MailMessage mail = new MailMessage();
mail.From = new MailAddress("from@example.com");
mail.To.Add(new MailAddress("to@example.com"));
mail.Subject = subject;
mail.Body = body;
mail.Priority = MailPriority.Normal;

string contentID = Guid.NewGuid().ToString().Replace("-", "");
body = body.Replace("$CONTENTID$", "cid:" + contentID);

AlternateView htmlView = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
//path of image or stream
LinkedResource imagelink = new LinkedResource(@"C:\Users\R.Aghaei\Desktop\outlook.png", "image/png");
imagelink.ContentId = contentID;
imagelink.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
htmlView.LinkedResources.Add(imagelink);
mail.AlternateViews.Add(htmlView);

SmtpClient client = new SmtpClient();
client.Host = "mail.example.com";
client.Credentials = new NetworkCredential("from@example.com", "password");
client.Send(mail);

数据URI

你可以使用数据URI(data:image/png; base64,....)。

  • 不推荐 * 由于大多数邮件客户端的支持较弱,我用Outlook.com(web)OutlookWebAccess(web)Office Outlook(Windows)Outlook(windows 8.1)测试了它,不幸的是它只在OutlookWebAccess(web)上工作。
7eumitmz

7eumitmz2#

GraphAPI自上次答案被接受后已更改。当你读到这篇文章的时候,它可能已经改变了。祝你成功
你说你正在使用Razor,并且可接受的解决方案包括一些find\replace,这就是Razor所做的。我们就从这里开始吧。
EmailTemplate.cshtml中,您可以使用Razor语法调用徽标路径:

<img src="@Model.MainLogo" />

在构建模板时在数据模型中设置:

string contentIDlogo = "logo.png";
string templateName = "EmailTemplate.cshtml";

object dataModel = new
{
    MainLogo = $"cid:{contentIDlogo}"
};

// This is where you render the Razor to HTML body string.
string emailTemplate = _razorTemplateCache.RenderBasicTemplate(templateName, dataModel);

// Define a simple e-mail message.
var mailMessage = new Message
{
    Subject = subject,
    Body = new ItemBody
    {
        ContentType = BodyType.Html,
        Content = emailTemplate
    },
    ToRecipients = toRecipients.ToList()
};

// Add the image as an attachment to the email.
mailMessage.HasAttachments = true;
byte[] logoBytes = System.IO.File.ReadAllBytes(contentIDlogo);
mailMessage.Attachments = new List<Attachment>
{
    new FileAttachment
    {
        ContentBytes = logoBytes,
        ContentType = "image/png",
        Name = contentIDlogo,
        IsInline = true,
        ContentId = contentIDlogo,
        Size = logoBytes.Length
    }
};

现在你已经有了一条消息,你可以使用Graph API发布它。我的例子是使用Microsoft.Graph (5.9.0)

// Define our new Microsoft Graph client. 
GraphServiceClient graphServiceClient = new GraphServiceClient(_credentials, _scopes, Endpoint);

var requestBody = new SendMailPostRequestBody
{
    Message = theEmail,
    SaveToSentItems = true
};

// Send mail as the given user. 
var fromUser = graphServiceClient.Users[_sendAsUserObjectId];
await fromUser.SendMail.PostAsync(mailMessage, null, cancelToken).ConfigureAwait(false);

相关问题