1

asp.net MVC 3 で MVCMailer を使用しています。これは優れたライブラリですが、問題があります。

次のようにメールに画像を埋め込むことが可能であることがわかりました。

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

したがって、「リソース」はファイルシステムからのイメージへのパスを期待しているように見えますが、私のイメージはメモリストリームにあります。

実際にディスクにファイルを書き込んでからパスを渡すことなく、画像を base64 としてすぐに埋め込むことは可能でしょうか?

ご協力いただきありがとうございます!

4

1 に答える 1

1

Baucause MVCMailer は System.Net.Mail に基づいているため、LinkedResource をストリームとして簡単に追加できます。

これが修正です:

ILinkedResourceProvider.cs に次を追加します。

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 リリースの一部になることを願っています。

于 2012-01-10T09:17:30.410 に答える