Asp.net mvc 使用MVCMailer将MemoryStream中的图像嵌入电子邮件
我将MVCMailer与asp.net MVC 3一起使用。 这是一个很棒的图书馆,但我有个问题 我发现可以像这样在电子邮件中嵌入图像: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(); 资源[“图
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上发布了这个请求:这次修改会不会