Вставьте изображения в шаблон электронной почты - PullRequest
0 голосов
/ 09 ноября 2018

Я создаю метод, который будет отправлять электронную почту с некоторыми изображениями. Мой шаблон представляет собой частичное представление, основанное на коллекции его модели представления. Изображения являются строками 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;
    }

Заранее спасибо.

...