在ASP.NET中使用HTTP处理程序生成要在电子邮件中显示的图像
我正在生成条形码图像作为来自HTTP处理程序的响应,如下所示:
public void ProcessRequest(HttpContext context) { context.Response.Clear(); context.Response.ContentType = "image/Jpeg"; MemoryStream ms = new MemoryStream(); Bitmap objBitmap = GenerateBarcode(context.Request.Params["Code"]); objBitmap.Save(ms, ImageFormat.Jpeg); context.Response.BinaryWrite(ms.GetBuffer()); }
我去了http://www.MyWebsite.com/MyProject/BarCode.aspx?code=12345678 ,效果很好。 同样地,我在我的网页上粘贴了 ,效果很好。 但是我在HTML电子邮件中粘贴了相同的图像标记并且没有显示(至少在MS Outlook 2007中没有显示;我还没有测试过其他电子邮件客户端。)
我猜这在某种程度上与我正在使用HTTP处理程序有关,因为电子邮件中的其他静态图像显示正常。 如何修复此图像以便显示图像? (我不能只使用静态图像,因为代码是在发送电子邮件时确定的。)
更新:
事实certificate我没有注意到关键的细节。 图像不仅没有出现; 相反,图像src属性被替换为“ http://portal.mxlogic.com/images/transparent.gif ”。 我已经确定使用.aspx或.ashx扩展名触发了这个替换(或者除了那些预期用于.gif或.jpg等图像的扩展名),并且包含URL中的查询字符串也触发了这个,即使它是标准图像扩展。 我想这是一些过于热心的安全function。 所以包括像BarCode.aspx?code = 12345678这样的图像是行不通的。
我发现我可以执行类似 ,然后为名为BarCode.jpg的所有文件创建处理程序。 这里12345678 /不是一个实际的路径,但是因为我将请求重定向到处理程序,所以我可以从URL中的伪造路径中删除代码值。 但是,我可能不得不改变一些IIS设置来处理ASP.NET处理的.jpg文件的请求,并且我还想确保除了我的BarCode.jpg之外的其他 JPEG正常加载。
老实说,我不确定这是否值得麻烦。
Microsoft Office Outlook 2007使用Microsoft Office Word 2007中的HTML解析和呈现引擎来显示HTML邮件正文。 更多
这留给我们一些毛茸茸的点
Word 2007所施加的限制在文章中有详细描述,但这里有一些亮点:
- 不支持背景图像(HTML或CSS)
- 不支持表格
- 不支持Flash或其他插件
- 不支持CSS浮动
- 不支持用无序列表中的图像替换子弹
- 不支持CSS定位
- 不支持动画GIF
我认为你最好的选择是使用LinkedResource类嵌入图像
//create the mail message MailMessage mail = new MailMessage(); //set the addresses mail.From = new MailAddress("..."); mail.To.Add("..."); //set the content mail.Subject = "Test mail"; AlternateView htmlView = AlternateView.CreateAlternateViewFromString("Here is an embedded image." ", null, "text/html"); //create the LinkedResource (embedded image) LinkedResource logo = new LinkedResource(GenerateBarcode(Code))); logo.ContentId = "logo"; htmlView.LinkedResources.Add(logo); mail.AlternateViews.Add(htmlView); //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail);
我不知道为什么它不起作用,但如果你说来自托管处理程序的站点的静态图像工作正常,这可能是一个稍微修改过的版本:
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "image/jpeg"; using (var image = GenerateBarcode(context.Request.Params["Code"])) { image.Save(context.Response.OutputStream, ImageFormat.Jpeg); } }
- 无需在通用处理程序中清除响应,因为尚未编写任何内容
- Content-Type是
image/jpeg
- 不需要中间内存流,您可以直接写入响应
- 确保正确处理位图
您必须将图像作为附件,或在邮件中使用html。 可能你的错误是由于Outlook而发生的。
此链接表明问题,因为您建议使用安全/反垃圾邮件function导致问题(mxlogic.com指向McAfee产品)
- 找不到方法:’!! 0 System.Array.Empty()’
- __doPostBack仅在页面上有LinkButton,Calendar或WizardStep控件时才有效
- 使用validation器在Asp.netfunction中是否存在任何电子邮件?
- 在ASP.NET MVC中调用Visual Studio 2013中的“全部中断”时,有没有办法隐藏“源不可用”选项卡?
- 我是否需要保留对FileSystemWatcher的引用?
- 将列表插入表
- 正则表达式只接受波斯字符
- RegularExpressionValidator不在空白条目上触发
- SPA – Firebase和.Net WebApi 2身份validation