Консультация № 175622
26.12.2009, 13:12
35.00 руб.
0 6 1
Здравствуйте.

Есть некая функция которая возвращает Bitmap.

Вопрос - как включить этот Bitmap в электронное письмо не сохраняя его предварительно на ЖД ?

Пытался делать вот так:

MemoryStream ms = new MemoryStream();
bitmap.Save(ms, ImageFormat.Jpeg);
LinkedResource lr = new LinkedResource(ms, "image/jpeg");

Но Bitmap таким образом вставляться в письмо не захотел (письмо пришло без него).

Если же сохраняю на ЖД его и в new LinkedResource() передаю его URL, то всё замечательно работает.

Проблема в том, что писем этих в день может быть до нескольких сотен, а в перспективе и тысяч.

Хотелось бы избежать лишней нагрузки на ЖД, да и сэкономить время необходимое на запись/чтение на/с ЖД.

Спасибо всем заранее.

Обсуждение

Неизвестный
26.12.2009, 15:25
общий
это ответ
Здравствуйте, Иоффе Мэир Вэлевич.
Не совсем ясно как Вы отправляли сообщение. Я использовал SmtpClient.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Net.Mail;
using System.IO;
using System.Drawing.Imaging;
using System.Net.Mime;
using System.Net;


namespace Test_CS
{
class Program
{
static void Main(string[] args)
{
using(Bitmap bm = (Bitmap)Bitmap.FromFile(@"e:\intel_002.png"))
using (MemoryStream ms = new MemoryStream())
{
bm.Save(ms, ImageFormat.Jpeg);

// Если закомментировать эту строку то придет письмо с битым изображением.
ms.Seek(0, SeekOrigin.Begin);

SmtpClient smtpClient = new SmtpClient("smtp.mail.ru", 25);
smtpClient.Credentials = new NetworkCredential("login", "password");

// Создаем сообщение
MailMessage message = new MailMessage();
message.From = new MailAddress("micren@mail.ru");
message.To.Add(new MailAddress("micren@mail.ru"));
message.Subject = "Test Photo";
message.Body = "<b>Test Photo</b>";
message.Priority = MailPriority.Normal;
message.IsBodyHtml = true;

// Наше вложение
using (Attachment attach = new Attachment(ms, new ContentType(MediaTypeNames.Image.Jpeg)))
{
// Если мы хотим задать имя файла для нашего вложения
ContentDisposition disposition = attach.ContentDisposition;
disposition.FileName = "image.jpg";
message.Attachments.Add(attach);

smtpClient.Send(message);
}
}
}
}
}

После нескольких неудачных экспериментов пришел к выводу, что проблема в том, что после записи в MemoryStream указатель потока остается в конце. Т.е. за Вашим изображением. Решил принудительно перед тем как прикрепить аттач к письму установить этот указатель на начало. Сработало. Письмо пришло с картинкой.
5
Вы немного не поняли. Я не прикрепляю изображение в качестве Attachment, я встариваю её в само письмо (не зря же я указал строку LinkedResource lr = new LinkedResource(ms, "image/jpeg");<br><br>Но идея с переносом указателя сработало и письма начали приходить с изображениями, а не красными иксами. Я видел, что указатель находится в конце stream, но мне и в голову не пришло, что это может как-то повлеять. Хотя, сейчас это кажется абсолютно логичным и правильны - невозможно считать данные из потока, если указатель находится в конце его.<br><br>За это и оценка 5. <br><br>Огромное спасибо.
Неизвестный
26.12.2009, 15:30
общий
Иоффе Мэир Вэлевич:
LinkedResource не использовал.
Неизвестный
26.12.2009, 15:37
общий
я бы тоже не испльзовал. сам не люблю, когда приходять письма с уже встроеными изображениями и ты обязан смотреть что тебе спамеры понаприсылали. Да и тежелее они, нежели те в которых просто ссылки на картинки прописаны. Но у моего начальства свой взгляд на эту проблему. :-)
Неизвестный
26.12.2009, 15:39
общий
будем считать, что я комментарий к оценке отредактировал и исправил орфографические ошибки :-)
Неизвестный
26.12.2009, 21:04
общий
Иоффе Мэир Вэлевич:
Ссылки на картинки спамеры присылают гораздо чаще, чем добросовестные пользователи. Поэтому они часто режутся без вопросов. Ссылка позволяет отследить, кто и когда посмотрел картинку, так что кпд последующего спама резко возрастает.
Неизвестный
26.12.2009, 21:12
общий
Цитата: 268417
Ссылки на картинки спамеры присылают гораздо чаще, чем добросовестные пользователи


Может быть. Сам я спамом не балуюсь.



Цитата: 268417
Ссылка позволяет отследить, кто и когда посмотрел картинку


Знаю. Использую это для статистики, когда делаю рассылку по клиентским БД, чтобы потом клиенту показать сколько его клиентов вообще смотрели то, что он им там пытается впихнуть.
Форма ответа