Использование обработчика HTTP в ASP.NET для генерации изображения для отображения в электронной почте - PullRequest
6 голосов
/ 12 сентября 2010

Я генерирую изображение штрих-кода как ответ от обработчика 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, поскольку другие статические изображения в электронном письме отображаются нормально. Как я могу это исправить, чтобы изображение появилось? (Я не могу просто использовать статическое изображение, потому что код определяется во время отправки электронного письма.)

Обновление:

Оказывается, я не заметил ключевой детали. Изображение не просто не появляется; скорее атрибут image 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, чтобы запросы на файлы .jpg обрабатывались ASP.NET, и я все же хотел бы убедиться, что другие JPEG, помимо моего BarCode.jpg, загружаются нормально .

Честно говоря, я не уверен, стоит ли это хлопот.

Ответы [ 4 ]

5 голосов
/ 12 сентября 2010

Microsoft Office Outlook 2007 использует механизм анализа и рендеринга HTML из Microsoft Office Word 2007 для отображения тел сообщений HTML. подробнее

, что оставляет нас с волосатыми точками

Ограничения, налагаемые Word 2007, подробно описаны в статье , но здесьВот несколько важных моментов:

  • без поддержки фоновых изображений (HTML или CSS)
  • без поддержки форм
  • без поддержки Flash или других плагинов
  • нет поддержки CSS float
  • нет поддержки замены маркеров изображениями в неупорядоченных списках
  • нет поддержки позиционирования 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);
3 голосов
/ 12 сентября 2010

Я не знаю, почему это не работает, но если вы говорите, что статические изображения с сайта, на котором размещен обработчик, работают нормально, вот немного измененная версия, которую вы можете попробовать:

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. Убедитесь, что правильно расположили растровое изображение
0 голосов
/ 01 августа 2012

Эта ссылка указывает на проблему, так как вы предложили использовать функцию безопасности / защиты от СПАМА (mxlogic.com указывает на продукт McAfee)

0 голосов
/ 12 сентября 2010

Вам нужно будет поместить изображение в качестве вложения или использовать html в почте. Вероятно, ваша ошибка происходит из-за Outlook, хотя.

...