簡體   English   中英

在ASP.NET中使用HTTP處理程序生成要在電子郵件中顯示的圖像

[英]Using an HTTP handler in ASP.NET to generate an image for display in email

我正在生成條形碼圖像作為來自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 ,效果很好。 同樣,我在我的網頁上粘貼了<img alt="" src="http://www.MyWebsite.com/MyProject/BarCode.aspx?code=12345678"> ,效果很好。 但是我在HTML電子郵件中粘貼了相同的圖像標記並且沒有顯示(至少在MS Outlook 2007中沒有顯示;我還沒有測試過其他電子郵件客戶端。)

我猜這在某種程度上與我使用HTTP處理程序這一事實有關,因為電子郵件中的其他靜態圖像顯示正常。 如何修復此圖像以便顯示圖像? (我不能只使用靜態圖像,因為代碼是在發送電子郵件時確定的。)

更新:

事實證明我沒有注意到關鍵的細節。 圖像不僅沒有出現; 相反,圖像src屬性被替換為“ http://portal.mxlogic.com/images/transparent.gif ”。 我已經確定使用.aspx或.ashx擴展名觸發了這個替換(或者可能是任何擴展名,除了那些預期用於.gif或.jpg之類的圖像),並且包含URL中的查詢字符串觸發了這個,即使它是標准圖像擴展。 我想這是一些過於熱心的安全功能。 所以包括像BarCode.aspx?code = 12345678這樣的圖像是行不通的。

我發現我可以執行類似<img alt="" src="http://www.MyWebsite.com/MyProject/12345678/BarCode.jpg"> ,然后為名為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);
    }
}
  1. 無需在通用處理程序中清除響應,因為還沒有編寫任何內容
  2. Content-Type是image/jpeg
  3. 不需要中間內存流,您可以直接寫入響應
  4. 確保正確處理位圖

鏈接表明問題,因為您建議使用安全/反垃圾郵件功能導致問題(mxlogic.com指向McAfee產品)

您必須將圖像作為附件,或在郵件中使用html。 可能你的錯誤是由於Outlook而發生的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM