Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用MVCMailer将MemoryStream中的图像嵌入电子邮件_Asp.net Mvc_Asp.net Mvc 3_Memorystream_Mvcmailer - Fatal编程技术网

Asp.net mvc 使用MVCMailer将MemoryStream中的图像嵌入电子邮件

Asp.net mvc 使用MVCMailer将MemoryStream中的图像嵌入电子邮件,asp.net-mvc,asp.net-mvc-3,memorystream,mvcmailer,Asp.net Mvc,Asp.net Mvc 3,Memorystream,Mvcmailer,我将MVCMailer与asp.net MVC 3一起使用。 这是一个很棒的图书馆,但我有个问题 我发现可以像这样在电子邮件中嵌入图像: var resources = new Dictionary<string, string>(); resources["image"] = imagePath; PopulateBody(mailMessage, "WelcomeMessage", resources); var resources=newdictionary(); 资源[“图

我将MVCMailer与asp.net MVC 3一起使用。 这是一个很棒的图书馆,但我有个问题

我发现可以像这样在电子邮件中嵌入图像:

var resources = new Dictionary<string, string>();
resources["image"] = imagePath;
PopulateBody(mailMessage, "WelcomeMessage", resources);
var resources=newdictionary();
资源[“图像”]=图像路径;
PopulateBody(mailMessage,“WelcomeMessage”,参考资料);
因此,“资源”似乎期望从文件系统中找到映像的路径,但是,我的映像在memorystream中

是否可以直接将映像作为base64嵌入,而不必实际将文件写入磁盘,然后传递路径


谢谢你的帮助

因为MVCMailer基于System.Net.Mail,很容易将LinkedResource添加为流

以下是修复方法:

在ILinkedResourceProvider.cs中添加:

List<LinkedResource> GetAll(Dictionary<string, MemoryStream> resources);
LinkedResource Get(string contentId, MemoryStream stream);
List GetAll(字典资源);
LinkedResource获取(字符串contentId、MemoryStream流);
在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;
}
公共虚拟列表GetAll(字典资源)
{
var linkedResources=新列表();
foreach(资源中的var资源)
{
Add(Get(resource.Key,resource.Value));
}
返回链接资源;
}
公共虚拟LinkedResource获取(字符串contentId、MemoryStream流)
{
LinkedResource资源=新的LinkedResource(流);
resource.ContentId=ContentId;
返回资源;
}
在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;
}
public-virtual-void-PopulateBody(MailMessage-MailMessage、string-viewName、Dictionary-linkedResources)
{
PopulateBody(mailMessage、viewName、null、linkedResources);
}
公共虚拟void PopulateBody(MailMessage MailMessage,string viewName,string masterName=null,Dictionary linkedResources=null)
{
if(mailMessage==null)
{
抛出新ArgumentNullException(“mailMessage”,“mailMessage不能为null”);
}
masterName=masterName??masterName;
var linkedResourcesPresent=linkedResources!=null&&linkedResources.Count>0;
var textExists=TextViewExists(视图名称、主名称);
//如果文本存在,它将始终转到正文
如果(文本存在)
{
PopulateTextBody(邮件消息、视图名、主机名);
}
//如果html存在
if(HtmlViewExists(视图名、主名))
{
if(textExists | | linkedResourcesPresent)
{
PopulateHtmlPart(邮件消息、视图名、主机名、链接资源);
}
其他的
{
PopulateHtmlBody(邮件、视图名、主名);
}
}
}
公共虚拟AlternateView PopulateHtmlPart(MailMessage MailMessage、字符串viewName、字符串masterName、字典链接资源)
{
var htmlPart=PopulatePart(mailMessage,viewName,“text/html”,masterName);
if(htmlPart!=null)
{
大众链接资源(htmlPart、链接资源);
}
返回htmlPart;
}
公共虚拟列表PopulateLink资源(可选查看邮件部分、字典资源)
{
if(resources==null | | resources.Count==0)
返回新列表();
var linkedResources=linkedresourcesprovider.GetAll(资源);
ForEach(resource=>mailPart.linkedResources.Add(resource));
返回链接资源;
}

希望它将成为下一个MVCMailer版本的一部分。

因为MVCMailer基于System.Net.Mail,很容易将LinkedResource添加为流

以下是修复方法:

在ILinkedResourceProvider.cs中添加:

List<LinkedResource> GetAll(Dictionary<string, MemoryStream> resources);
LinkedResource Get(string contentId, MemoryStream stream);
List GetAll(字典资源);
LinkedResource获取(字符串contentId、MemoryStream流);
在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;
}
公共虚拟列表GetAll(字典资源)
{
var linkedResources=新列表();
foreach(资源中的var资源)
{
Add(Get(resource.Key,resource.Value));
}
返回链接资源;
}
公共虚拟LinkedResource获取(字符串contentId、MemoryStream流)
{
LinkedResource资源=新的LinkedResource(流);
resource.ContentId=ContentId;
返回资源;
}
在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;
}
public-virtual-void-PopulateBody(MailMessage-MailMessage、string-viewName、Dictionary-linkedResources)
{
PopulateBody(mailMessage、viewName、null、linkedResources);
}
公共虚拟void PopulateBody(MailMessage MailMessage,string viewName,string masterName=null,Dictionary linkedResources=null)
{
if(mailMessage==null)
{
抛出新ArgumentNullException(“mailMessage”,“mailMessage不能为null”);
}
masterName=masterName??masterName;
var linkedResourcesPresent=linkedResources!=null&&linkedResources.Count>0;
var textExists=TextViewExists(视图名称、主名称);
//如果文本存在,它将始终转到正文
如果(文本存在)
{
PopulateTextBody(邮件消息、视图名、主机名);
}
//如果html存在
if(HtmlViewExists(视图名、主名))
{
if(textExists | | linkedResourcesPresent)
{
PopulateHtmlPart(邮件消息、视图名、主机名、链接资源);
}
其他的
{
PopulateHtmlBody(邮件、视图名、主名);
}
}
}
公共虚拟AlternateView PopulateHtmlPart(MailMessage MailMessage、字符串viewName、字符串masterName、字典链接资源)
{
var htmlPart=PopulatePart(mailMessage,viewName,“text/html”,masterName);
if(htmlPart!=null)
{
大众链接资源(htmlPart、链接资源);
}
返回htmlPart;
}
公共虚拟列表PopulateLink资源(可选查看邮件部分、字典资源)
{
if(resources==null | | resources.Count==0)
返回新列表();
var linkedResources=linkedresourcesprovider.GetAll(资源);
ForEach(resource=>mailPart.linkedResources.Add(resource));
返回链接资源;
}

希望它能成为下一个MVCMailer版本的一部分。

@作者我在github上发布了这个请求:这次修改会不会