C # отправка писем со встроенными изображениями с использованием SmtpClient

SmtpClient () позволяет добавлять вложения в ваши письма, но что делать, если вы хотите сделать изображение, когда почта открывается, а не прикреплять его?

Как я помню, это можно сделать примерно с 4 строками кода, но я не помню, как и не могу найти его на сайте MSDN.

EDIT: я не использую веб-сайт или что-то еще, даже не IP-адрес. Изображение (ы) расположены на жестком диске. При отправке они должны быть частью почты. Итак, я думаю, я мог бы использовать тег … но я не уверен, потому что мой компьютер не транслирует.

Одним из решений, которое часто упоминается, является добавление изображения в качестве Attachment в почту, а затем ссылка на него в почтовом ящике HTML с помощью ссылки cid:

Однако, если вы используете коллекцию LinkedResources , встроенные изображения будут по-прежнему отображаться просто отлично, но не отображаться в качестве дополнительных вложений для почты. Это то, что мы хотим , и вот что я здесь делаю:

 using (var client = new SmtpClient()) { MailMessage newMail = new MailMessage(); newMail.To.Add(new MailAddress("[email protected]")); newMail.Subject = "Test Subject"; newMail.IsBodyHtml = true; var inlineLogo = new LinkedResource(Server.MapPath("~/Path/To/YourImage.png"), "image/png"); inlineLogo.ContentId = Guid.NewGuid().ToString(); string body = string.Format(@" 

Lorum Ipsum Blah Blah

Lorum Ipsum Blah Blah

", inlineLogo.ContentId); var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html"); view.LinkedResources.Add(inlineLogo); newMail.AlternateViews.Add(view); client.Send(newMail); }

ПРИМЕЧАНИЕ. Это решение добавляет AlternateView к вашему MailMessage типа text/html . Для полноты вы также должны добавить AlternateView типа text/plain , содержащего текстовую версию электронной почты для почтовых клиентов, отличных от HTML.

Электронная почта HTML и изображения являются вложениями, поэтому это всего лишь случай обращения к изображениям (-ами) их идентификаторами содержимого, т.е.

  Dim A As System.Net.Mail.Attachment = New System.Net.Mail.Attachment(txtImagePath.Text) Dim RGen As Random = New Random() A.ContentId = RGen.Next(100000, 9999999).ToString() EM.Body = "" 

Здесь, по-видимому, есть исчерпывающие примеры: Отправить письмо с встроенными изображениями

Когда вы говорите 4 строки кода, вы имеете в виду это ?

 System.Net.Mail.Attachment inline = new System.Net.Mail.Attachment(@"imagepath\filename.png"); inline.ContentDisposition.Inline = true; 

Как преобразовать изображения в строки Base64? AFAIK это может быть легко встроено в тело письма.

Взгляните сюда .

Решение уже опубликовано – это лучшее, что я нашел, я просто собираюсь его завершить, например, если у вас несколько изображений.

  string startupPath = AppDomain.CurrentDomain.RelativeSearchPath; string path = Path.Combine(startupPath, "HtmlTemplates", "NotifyTemplate.html"); string body = File.ReadAllText(path); //General tags replacement. body = body.Replace("[NOMBRE_COMPLETO]", request.ToName); body = body.Replace("[ASUNTO_MENSAJE]", request.Subject); //Image List Used to replace into the template. string[] imagesList = { "h1.gif", "left.gif", "right.gif", "tw.gif", "fb.gif" }; //Here we create link resources one for each image. //Also the MIME type is obtained from the image name and not hardcoded. List imgResourceList = new List(); foreach (var img in imagesList) { string imagePath = Path.Combine(startupPath, "Images", img); var image = new LinkedResource(imagePath, "image/" + img.Split('.')[1]); image.ContentId = Guid.NewGuid().ToString(); image.ContentType.Name = img; imgResourceList.Add(image); body = body.Replace("{" + Array.IndexOf(imagesList, img) + "}", image.ContentId); } //Altern view for managing images and html text is created. var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html"); //You need to add one by one each link resource to the created view foreach (var imgResorce in imgResourceList) { view.LinkedResources.Add(imgResorce); } ThreadPool.QueueUserWorkItem(o => { using (SmtpClient smtpClient = new SmtpClient(servidor, Puerto)) { smtpClient.EnableSsl = true; smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.Timeout = 50000; smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new System.Net.NetworkCredential() { UserName = UMail, Password = password }; using (MailMessage mailMessage = new MailMessage()) { mailMessage.IsBodyHtml = true; mailMessage.From = new MailAddress(UMail); mailMessage.To.Add(request.ToEmail); mailMessage.Subject = "[NAPNYL] " + request.Subject; mailMessage.AlternateViews.Add(view); smtpClient.Send(mailMessage); } } }); 

Как вы видите, у вас есть массив имен изображений, важно, чтобы изображения находились в одной папке, потому что они указывали на одну и ту же выходную папку.

Наконец, электронное письмо отправляется как асинхронное, поэтому пользователю не нужно ждать его отправки.

Процесс создания изображения на клиенте при открытии почты – это клиентская функция. Пока клиент знает, как отображать изображение и не блокировал какое-либо изображение, он сразу откроет его. Вам не нужно делать ничего особенного, отправляя электронное письмо, чтобы оно было открыто на клиенте, если вы правильно указали тип прикрепления изображения mime.

  • Поиск эффективного целочисленного алгоритма с квадратным корнем для ARM Thumb2
  • Как интегрировать Xromium Embedded Framework (CEF) с java
  • Насколько значительная часть обработки исключений C ++ добавляет
  • реализация rand ()
  • Давайте будем гением компьютера.