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

StackOverflow https://stackoverflow.com/questions/1212838

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

РЕДАКТИРОВАТЬ: я не использую веб-сайт или что-либо, даже IP-адрес. Изображения находятся на жестком диске. При отправке они должны быть частью почты. Итак, я думаю, что я мог бы использовать тег ... но я не слишком уверен, так как мой компьютер не вещает.

Это было полезно?

Решение

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

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

using (var client = new SmtpClient())
{
    MailMessage newMail = new MailMessage();
    newMail.To.Add(new MailAddress("you@your.address"));
    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(@"
            <p>Lorum Ipsum Blah Blah</p>
            <img src=""cid:{0}"" />
            <p>Lorum Ipsum Blah Blah</p>
        ", 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 = "<img src='cid:" + A.ContentId +"'>" 

Здесь приведены подробные примеры: Отправить электронное письмо со встроенными изображениями

Когда вы произносите 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<LinkedResource> imgResourceList = new List<LinkedResource>();
        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);
                }
            }
        });

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

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

Процесс создания изображения на клиенте при открытии почты является клиентской функцией. Пока клиент знает, как отобразить изображение & amp; не заблокировал ни одного изображения, он сразу же откроется. Вам не нужно делать ничего особенного при отправке электронного письма, чтобы открыть его на клиенте, если вы правильно указали тип вложения изображения MIME.

scroll top