C # отправка писем с изображениями, встроенными с помощью SmtpClient - PullRequest
37 голосов
/ 31 июля 2009

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

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

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

Ответы [ 6 ]

78 голосов
/ 12 июня 2012

Одним из часто упоминаемых решений является добавление изображения в виде 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.

13 голосов
/ 31 июля 2009

Электронное письмо в формате 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 +"'>" 

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

12 голосов
/ 31 июля 2009

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

System.Net.Mail.Attachment inline = new System.Net.Mail.Attachment(@"imagepath\filename.png");
inline.ContentDisposition.Inline = true;
2 голосов
/ 31 июля 2009

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

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

0 голосов
/ 19 сентября 2017

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

        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);
                }
            }
        });

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

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

0 голосов
/ 31 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...