Я создаю метод, который будет отправлять электронную почту с некоторыми изображениями. Мой шаблон представляет собой частичное представление, основанное на коллекции его модели представления. Изображения являются строками base64, которые я помещаю в src тега img (встроенные изображения), и когда частичное представление полностью построено, я анализирую представление в строку с помощью RazorEngine, потому что функция, которую я использую для отправки электронной почты (с NotificationHubClient) отправит HTML-строку в качестве параметра шаблона SendGrid.
Однако когда я получаю электронное письмо, изображения не отображаются ни в одном клиенте, я думаю, почтовые клиенты блокируют встроенные изображения. Поэтому я думаю об использовании CID для привязки изображений. Я использовал этот метод некоторое время назад, но для правильной работы CID мне необходимо создать AlternateView, но AlternateView работает только с MailMessage (System.Net.Mail).
Я нашел эту тему: Как преобразовать альтернативные представления EmailMessage в SendGrid Html и Text
И я попытался построить нечто подобное:
public static string GenerateHTML(AlternateView alternateView, string template)
{
MailMessage messageTemp = new MailMessage{ Body = template, IsBodyHtml = true };
messageTemp.AlternateViews.Add(alternateView);
var stream = messageTemp.AlternateViews[0].ContentStream;
using(var rd = new StreamReader(stream))
{
return rd.ReadToEnd();
}
}
Я передаю возвращенную строку в качестве параметра функции Send, но когда я получаю почту, изображения снова не отображаются, и даже мой css пропадает.
Знаете ли вы, как преобразовать MailMessage с его AlternateView в HTML-строку с привязанными изображениями?
Если они вам нужны, это функции отправки электронной почты и создания AlternateView.
public static void SendNotification(List<string> recipients, Dictionary<string, string> customParams, string template)
{
string hubURL = ConfigurationManager.AppSettings["NotificationHubUrl"];
string apiKey = ConfigurationManager.AppSettings["NotificationHubApiKey"];
NotificationHubClient.NotificationHubClient client = new NotificationHubClient.NotificationHubClient(hubURL, apiKey);
Dictionary<string, string> authParams = new Dictionary<string, string>();
authParams["username"] = ConfigurationManager.AppSettings["SendGridUser"];
authParams["password"] = ConfigurationManager.AppSettings["SendGridPassword"];
NotificationHubModels.NotificationResponse response = client.SendNotification(new NotificationHubModels.NotificationMessage()
{
Type = "EMAIL",
Provider = "SENDGRID",
Template = template,
CustomParams = customParams,
Recipients = recipients,
ProviderAuthParams = authParams,
});
}
public static AlternateView InsertImages(AlternateView alternateView, IList<Tuple<MemoryStream, string>> images)
{
foreach(var item in images)
{
LinkedResource linkedResource = new LinkedResource(item.Item1, "image/jpg");
linkedResource.ContentId = item.Item2;
linkedResource.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
alternateView.LinkedResources.Add(linkedResource);
}
return alternateView;
}
Заранее спасибо.