Использование MVCMailer для встраивания изображения из MemoryStream в электронную почту - PullRequest
1 голос
/ 09 января 2012

Я использую MVCMailer с asp.net MVC 3. Это отличная библиотека, но у меня есть проблема.

Я видел, что возможно вставить изображение в электронное письмо, например:

var resources = new Dictionary<string, string>();
resources["image"] = imagePath;
PopulateBody(mailMessage, "WelcomeMessage", resources);

Поэтому похоже, что «ресурсы» ожидают путь к изображению из файловой системы, однако мое изображение находится в потоке памяти.

Можно ли сразу встроить образ в base64 без необходимости записывать файл на диск, а затем передавать путь?

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 10 января 2012

Baucause MVCMailer основан на System.Net.Mail, легко добавить LinkedResource в виде потока.

Вот исправление:

в ILinkedResourceProvider.cs add:

List<LinkedResource> GetAll(Dictionary<string, MemoryStream> resources);
LinkedResource Get(string contentId, MemoryStream stream);

в LinkedResourceProvider добавить:

public virtual List<LinkedResource> GetAll(Dictionary<string, MemoryStream> resources)
{
    var linkedResources = new List<LinkedResource>();
    foreach (var resource in resources)
    {
        linkedResources.Add(Get(resource.Key, resource.Value));
    }
    return linkedResources;
}
public virtual LinkedResource Get(string contentId, MemoryStream stream)
{
    LinkedResource resource = new LinkedResource(stream);
    resource.ContentId = contentId;
    return resource;
}

В MailerBase.cs добавить:

public virtual void PopulateBody(MailMessage mailMessage, string viewName, Dictionary<string, MemoryStream> linkedResources)
{
    PopulateBody(mailMessage, viewName, null, linkedResources);
}
public virtual void PopulateBody(MailMessage mailMessage, string viewName, string masterName = null, Dictionary<string, MemoryStream> linkedResources = null)
{
    if (mailMessage == null)
    {
        throw new ArgumentNullException("mailMessage", "mailMessage cannot be null");
    }

    masterName = masterName ?? MasterName;

    var linkedResourcesPresent = linkedResources != null && linkedResources.Count > 0;
    var textExists = TextViewExists(viewName, masterName);

    //if Text exists, it always goes to the body
    if (textExists)
    {
        PopulateTextBody(mailMessage, viewName, masterName);
    }

    // if html exists
    if (HtmlViewExists(viewName, masterName))
    {
        if (textExists || linkedResourcesPresent)
        {
            PopulateHtmlPart(mailMessage, viewName, masterName, linkedResources);
        }
        else
        {
            PopulateHtmlBody(mailMessage, viewName, masterName);
        }
    }
}
public virtual AlternateView PopulateHtmlPart(MailMessage mailMessage, string viewName, string masterName, Dictionary<string, MemoryStream> linkedResources)
{
    var htmlPart = PopulatePart(mailMessage, viewName, "text/html", masterName);
    if (htmlPart != null)
    {
        PopulateLinkedResources(htmlPart, linkedResources);
    }
    return htmlPart;
}
public virtual List<LinkedResource> PopulateLinkedResources(AlternateView mailPart, Dictionary<string, MemoryStream> resources)
{
    if (resources == null || resources.Count == 0)
        return new List<LinkedResource>();

    var linkedResources = LinkedResourceProvider.GetAll(resources);
    linkedResources.ForEach(resource => mailPart.LinkedResources.Add(resource));
    return linkedResources;
}

Надеюсь, это будет частью следующего выпуска MVCMailer.

...