How to embed multiple images in email body using .NET

后端 未结 7 2203
孤城傲影
孤城傲影 2020-11-29 06:26

I\'m writing a program that sends emails to users with multiple images (charts) embedded in the Email message body (HTML).

When I tried the sample located here..whic

相关标签:
7条回答
  • 2020-11-29 06:36

    if you have the images online, meaning sending from a hosted site, i suggest you just reference those images simply by putting their url in the src.

    <!-- using artplastika  examples -->
    <IMG SRC="http://www.ietf.cnri.reston.va.us/images/ietflogo.gif" ALT="IETF logo" />
    

    most of the newsletters use this method, and i believe it's lighter and can consume less resources than embedding itself.

    hope this helps

    0 讨论(0)
  • 2020-11-29 06:42

    The other way to embed images in E-mail when using System.Net.Mail is

    Attach image from local drive to email and assign a contentID to it and later use this contentID in the image URL.

    This can be done by:

    var contentID = "Image";
    var inlineLogo = new Attachment(@"C:\Desktop\Image.jpg");
    inlineLogo.ContentId = contentID;
    inlineLogo.ContentDisposition.Inline = true;
    inlineLogo.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
    
    msg.IsBodyHtml = true;
    msg.Attachments.Add(inlineLogo);
    msg.Body = "<htm><body> <img src=\"cid:" + contentID + "\"> </body></html>";
    
    0 讨论(0)
  • 2020-11-29 06:43

    My alternatie:

    First of all, a little extension:

    public static class RegexExtensions
    {
        public static string GetPattern(this IEnumerable<string> valuesToSearch)
        {
            return string.Format("({0})", string.Join("|", valuesToSearch));
        }
    }
    

    then get image names from folder:

        private string[] GetFullNamesOfImages()
        {
            string images = Path.Combine(_directoryName, "Images");
            if (!Directory.Exists(images))
                return new string[0];
            return Directory.GetFiles(images);
        }
    

    then replacing image names by cid:

        private string InsertImages(string body)
        {
            var images = GetFullNamesOfImages().Select(Path.GetFileName).ToArray();
            return Regex.Replace(body, "(Images/)?" + images.GetPattern(), "cid:$2", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        }
    

    where body - is HTML body, and for example, <img src="Images/logo_shadow.png" alt="" style="width: 100%;" /> will be replaced by <img src="cid:logo_shadow.png" alt="" style="width: 100%;" />

    then last action: adding images itselfs to mail:

        private MailMessage CreateMail(SmtpClient smtp, string toAddress, string body)
        {
            var images = GetFullNamesOfImages();
    
            string decodedBody = WebUtility.HtmlDecode(body);
            var text = AlternateView.CreateAlternateViewFromString(decodedBody, null, MediaTypeNames.Text.Plain);
            var html = AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html);
            foreach (var image in images)
            {
                html.LinkedResources.Add(new LinkedResource(image, new ContentType("image/png"))
                                         {
                                             ContentId = Path.GetFileName(image)
                                         });
            }
    
    
            var credentials = (NetworkCredential) smtp.Credentials;
    
            var message = new MailMessage(new MailAddress(credentials.UserName), new MailAddress(toAddress))
                          {
                              Subject = "Some subj",
                              Body = decodedBody
                          };
            message.AlternateViews.Add(text);
            message.AlternateViews.Add(html);
            return message;
        }
    
    0 讨论(0)
  • 2020-11-29 06:48

    So, I think figured out what the actual problem is Its in this line

    // Alternate view for embedded images
        AlternateView avText = AlternateView.CreateAlternateViewFromString(metric.Name, null, MediaTypeNames.Text.Html);
        AlternateView avImages = AlternateView.CreateAlternateViewFromString(htmlBody, null, MediaTypeNames.Text.Html);
    

    As you can see, both my views are specified as Text.Html, so the the 1st one is overriding the next one and so I only see text and images are sent as attachments

    I made the following change and it worked as expected

    AlternateView avText = AlternateView.CreateAlternateViewFromString(metric.Name, null, **MediaTypeNames.Text.Plain**);
    AlternateView avImages = AlternateView.CreateAlternateViewFromString(htmlBody, null, MediaTypeNames.Text.Html);
    
    0 讨论(0)
  • 2020-11-29 06:53

    First, you could try to use absolute URIs to embedded images. Here is example from RFC-2557:

      From: foo1@bar.net
      To: foo2@bar.net
      Subject: A simple example
      Mime-Version: 1.0
      Content-Type: multipart/related; boundary="boundary-example";
              type="text/html"; start="<foo3@foo1@bar.net>"
    
      --boundary-example
      Content-Type: text/html;charset="US-ASCII"
      Content-ID: <foo3@foo1@bar.net>
    
      ... text of the HTML document, which might contain a URI
      referencing a resource in another body part, for example
      through a statement such as:
      <IMG SRC="http://www.ietf.cnri.reston.va.us/images/ietflogo.gif" ALT="IETF logo">
    
      --boundary-example
      Content-Location:
         http://www.ietf.cnri.reston.va.us/images/ietflogo.gif
      Content-Type: IMAGE/GIF
      Content-Transfer-Encoding: BASE64
    
      R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5
      NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A
      etc...
    
      --boundary-example--
    

    You just need to assign LinkedResource.ContentLink property instead of ContentId.

    Second, you could embed images directly to your html with the "data" URL scheme.

        <IMG
        SRC="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw
        AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz
        ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp
        a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl
        ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis
        F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH
        hhx4dbgYKAAA7"
        ALT="Larry">
    

    BTW, your html markup is not well-formed. You may also be interested in “foreach” vs “ForEach”

    0 讨论(0)
  • 2020-11-29 06:53
            AlternateView avHtml = AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html);
            LinkedResource inline = new LinkedResource(System.Web.HttpContext.Current.Server.MapPath("~/Images/e1.jpg"), MediaTypeNames.Image.Jpeg);
            inline.ContentId = "1";
            inline.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
            avHtml.LinkedResources.Add(inline);
    
            LinkedResource inline1 = new LinkedResource(System.Web.HttpContext.Current.Server.MapPath("~/CImages/2.jpg"), MediaTypeNames.Image.Jpeg);
            inline1.ContentId = "2";
            inline1.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
            avHtml.LinkedResources.Add(inline1);
    
            LinkedResource inline2 = new LinkedResource(System.Web.HttpContext.Current.Server.MapPath("~/Images/3.jpg"), MediaTypeNames.Image.Jpeg);
            inline2.ContentId = "3";
            inline2.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
            avHtml.LinkedResources.Add(inline2);
    
            LinkedResource inline3 = new LinkedResource(System.Web.HttpContext.Current.Server.MapPath("~/Content/Images/4.jpg"), MediaTypeNames.Image.Jpeg);
            inline3.ContentId = "4";
            inline3.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
            avHtml.LinkedResources.Add(inline3);
    
            MailMessage mail = new MailMessage();
            mail.AlternateViews.Add(avHtml);
    

    HTML:

           <img src="cid:1" alt="" />
           <img src="cid:2" alt="" />
           <img src="cid:3" alt="" /`
           <img src="cid:4" alt="" />
    
    0 讨论(0)
提交回复
热议问题