我有一个邮寄广告系列,可以生成定期发送给客户的HTML电子邮件。
最近,我更改了系统,以允许最终用户配置邮件中的某些图像元素,而不是静态配置。这些图像使用GUID Id存储在数据库中,并通过Controller Action加载,如下所示:
[HttpGet]
[OutputCache(Duration = 3600, Location = OutputCacheLocation.Client, VaryByParam = "id")]
public virtual ActionResult Image(Guid id)
{
FileItem picture = FileService.GetItem(id);
return picture != null ? File(picture.FileData, picture.ContentType) : null;
}
如果电子邮件无法在电子邮件客户端中正确呈现,则有一个链接可在浏览器中查看相同的邮件。
在浏览器中,所有图像都正确加载和显示,但我的问题出在电子邮件客户端(在本例中为Outlook 2013和Outlook 2010)中,上面方法引用的图像不会仅加载静态图像。
作为示例,加载精细的图像元素将是静态文件,如:
<img src="http://www.foo.com/es/spacer6.gif" width="1" height="8" border="0" alt="" />
无法正常加载的元素如下:
<img src="http://www.foo.com/Packages/Image/0c6d126d-8f62-4e28-9963-7377e73c0482" style="border-style:solid;border-bottom-width:1;border-right-width:1;border-top-width:1;border-left-width:1;border-color:#333;" alt="..." />
因此,两个来自同一个域只有一个是静态的,一个是通过上面的控制器动作加载的。我猜测Outlook客户端不喜欢这是一个链接到外部“资源”的事实,因为它不知道它是基于URL的图像。
无论如何都要改变我的控制器操作以“欺骗”Outlook认为这只是一个静态图像URL,或者只是一种更好的方法来做到这一点。
答案 0 :(得分:0)
我使用下一个代码prom puresourcecod.com:
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
...
public ActionResult Hello(string text)
{
//Create new image
Image img = new Bitmap(100, 50);
Graphics g = Graphics.FromImage(img);
//Do some drawing
Font font = new Font("Arial", 24);
PointF drawingPoint = new PointF(10, 10);
g.DrawString(text, font, Brushes.Black, drawingPoint);
//Return Image
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Png);
ms.Position = 0;
return new FileStreamResult(ms, "image/png");
}
答案 1 :(得分:0)
首先,请确保picture.ContentType
包含它应包含的内容(例如&#34; image / png&#34;如果图片是PNG)。
否则,Outlook可能取决于拥有&#39;权利&#39;扩展。要找出你可以为你的guid-URL添加适当的扩展名,然后使用它:
public virtual ActionResult Image(string id)
{
string s = id.Substring(0, id.IndexOf(".")); // a "." is now required
Guid guid = Guid.Parse(s);
FileItem picture = FileService.GetItem(guid);
return picture != null ? File(picture.FileData, picture.ContentType) : null;
}