title: Calendar Invite with HTML body that contains images
body: <p>I am having trouble getting my images to display as part of the HTML body of a mailmessage that also contains a calendar attachment (iCal).</p>
  
  <p>What I am attempting to do is:
  Send a calendar invite which is recognized by outlook and also contains an HTML body (also displayed in Outlook 2013).  That HTML should display a header and footer image inline. </p>
  
  <p>My code works when viewed in gmail, but it will not display the images in Outlook - instead it shows the "header.jpg" and "footer.jpg" in the location of the body where I want the images actually displayed.</p>
  
  <p>I've tried a lot of modifications to this code base - either the calendar invite portion is ignored (and then the images work), or the calendar invite portion works and the images are not displayed but replaced by the "header.jpg" and "screen.jpg" files that open fine when double-clicked.  Can I get around this and display the images inline in Outlook?</p>
  
  <p>Here is the code I am working with (snipped irrelevant stuff):</p>
  
  <pre><code>var header = new LinkedResource("header.jpg", MediaTypeNames.Image.Jpeg);
  header.ContentId = Guid.NewGuid().ToString();
  header.TransferEncoding = TransferEncoding.Base64;
  header.ContentType = new ContentType("image/jpg");
  header.ContentType.Name = "header.jpg";
  header.ContentLink = new Uri(string.Format("cid:{0}", header.ContentId));
  
  var screen = new LinkedResource("screen.jpg", MediaTypeNames.Image.Jpeg);
  screen.ContentId = Guid.NewGuid().ToString();
  screen.TransferEncoding = TransferEncoding.Base64;
  screen.ContentType = new ContentType("image/jpg");
  screen.ContentType.Name = "screen.jpg";
  screen.ContentLink = new Uri(string.Format("cid:{0}", screen.ContentId));
  
  
  var sb = new System.Text.StringBuilder();
  
  var dtStart = appointmentStart;
  var dtEnd = appointmentEnd;
  
  var htmlcontent = string.Format("&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"&gt;" +
      "&lt;HTML&gt;&lt;HEAD&gt;&lt;META http-equiv=Content-Type content=\"multipart/alternative; charset=iso-8859-1\"&gt;&lt;/HEAD&gt;" +
      "&lt;BODY&gt;" +
      "&lt;img src=\"cid:" + header.ContentId + "\"/&gt;" +
      "&lt;div&gt;&lt;strong&gt;The bold works fine, but the header and footer don't work! /strong&gt;&lt;/div&gt;" +
     "&lt;br /&gt;" +
     "&lt;div&gt;&lt;img src=\"cid:" + screen.ContentId + "\"/&gt;&lt;/div&gt;" +
     "&lt;/BODY&gt;&lt;/HTML&gt;"
     );
  
  var plaincontent = String.Format("snip snip");
  
  var av1 = AlternateView.CreateAlternateViewFromString(htmlcontent, new ContentType("text/html"););
  av1.LinkedResources.Add(header);
  av1.LinkedResources.Add(screen);
  
  sb.AppendLine("BEGIN:VCALENDAR");
  sb.AppendLine("VERSION:2.0");
  sb.AppendLine("METHOD:REQUEST");
  sb.AppendLine("BEGIN:VEVENT");
  sb.AppendLine(request.ContactEmail);
  sb.AppendLine("CLASS:PUBLIC");
  sb.AppendLine(string.Format("CREATED:{0:yyyyMMddTHHmmss}", DateTime.Now));
  sb.AppendLine("DESCRIPTION:" + plaincontent);
  sb.AppendLine("X-ALT-DESC;FMTTYPE=text/html:" + htmlcontent);
  sb.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", dtStart.ToUniversalTime()));
  sb.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", dtEnd.ToUniversalTime()));
  sb.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.Now.ToUniversalTime()));
  sb.AppendLine("ORGANIZER;CN=\"TheOrganizer\":mailto:" + "TheOrganizer@foobar.com");
  sb.AppendLine("SEQUENCE:0");
  sb.AppendLine("UID:" + request.EmailNotificationUniqueId);
  sb.AppendLine("LOCATION:" + request.Location + " : " + request.LocationInformation);
  sb.AppendLine("SUMMARY;LANGUAGE=en-us:" + "removed");
  sb.AppendLine("BEGIN:VALARM");
  sb.AppendLine("TRIGGER:-PT1440M");
  sb.AppendLine("ACTION:DISPLAY");
  sb.AppendLine("DESCRIPTION:Reminder");
  sb.AppendLine("END:VALARM");
  sb.AppendLine("END:VEVENT");
  sb.AppendLine("END:VCALENDAR");
  
  var icsView = AlternateView.CreateAlternateViewFromString(sb.ToString(), new ContentType("text/calendar"));
  
  var message = new MailMessage();
  
  message.AlternateViews.Add(body);
  message.AlternateViews.Add(icsView);
  
  return message;
  </code></pre>
  
  <p>Is there something fundamentally wrong?  This seems like it should be pretty simple and straightforward.  I've done this plenty of times with normal email messages, but it seems outlook doesn't like the .ics attachment with images in the body of the HTML alternative view.  The HTML body works fine (the <strong></strong> shows bolded) but the darn embedded images just won't show.</p>
  
  <p>I've tried manually encoding the images using base64 and that didn't help at all.  I've tried with and without the HTML header tags in the htmlContent var, and that didn't make any difference either.</p>
  
  <p>This shouldn't be this difficult - what am I missing?</p>
  
  <p>EDIT: Here is the message source in google. This works fine in the google browser window (displays properly.)  Unfortunately in Outlook the message does not work... Maybe the exchange server is supressing the images for internall messages? Is that even a thing?</p>
  
  <pre><code>Delivered-To: snip@gmail.com
  Received: by 10.182.167.74 with SMTP id zm10csp2847908obb;
          Fri, 7 Oct 2016 15:42:14 -0700 (PDT)
  X-Received: by 10.37.171.105 with SMTP id u96mr17483671ybi.63.1475880134797;
          Fri, 07 Oct 2016 15:42:14 -0700 (PDT)
  Return-Path: &lt;snip@snip.com&gt;
  Received: from msg12.snip.com (msg12.snip.com. [192.195.66.28])
          by mx.google.com with ESMTPS id q11si2985157ywc.340.2016.10.07.15.42.14
          for &lt;snip@gmail.com&gt;
          (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
          Fri, 07 Oct 2016 15:42:14 -0700 (PDT)
  Received-SPF: pass (google.com: domain of snip@snip.com designates 192.195.66.28 as permitted sender) client-ip=192.195.66.28;
  Authentication-Results: mx.google.com;
         spf=pass (google.com: domain of snip@snip.com designates 192.195.66.28 as permitted sender) smtp.mailfrom=snip@snip.com
  Received: from int11.snip.pvt (int11.snip.pvt [153.6.62.222]) by msg12.snip.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.2.2) with ESMTP id u97MgC5a022486 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for &lt;snip@gmail.com&gt;; Fri, 7 Oct 2016 22:42:12 GMT
  Received: from snip.com (snip.com [snip]) by int11.snip.pvt (Sentrion-MTA-4.3.1/Sentrion-MTA-4.2.2) with ESMTP id u97MgBAv016400 for &lt;snip@gmail.com&gt;; Fri, 7 Oct 2016 22:42:12 GMT
  Received: from snip.com with Microsoft SMTPSVC(7.5.7601.17514);
       Fri, 7 Oct 2016 18:42:12 -0400
  MIME-Version: 1.0
  From: snip &lt;snip@snip.com&gt;
  To: snip@gmail.com
  Date: 7 Oct 2016 18:42:12 -0400
  Content-Type: multipart/alternative; boundary=--boundary_0_8278962b-71cf-4ca1-9a64-5fb9629f2042
  Message-ID: &lt;5U9T3T00000050@snip.com&gt;
  X-OriginalArrivalTime: 07 Oct 2016 22:42:12.0895 (UTC) FILETIME=[0BC44AF0:01D220EC]
  X-Flow-Control: Sendmail Flow Controller v2.2.5 int11.snip.pvt u97MgBAv016400
  X-Flow-Control-Info: class=Default rcpts=1 size=37636
  
  ----boundary_0_8278962b-71cf-4ca1-9a64-5fb9629f2042
  Content-Type: multipart/related; boundary=--boundary_1_306bb8e7-fb92-4eab-bf5c-b7393cf499ac; type="text/html"
  
  ----boundary_1_306bb8e7-fb92-4eab-bf5c-b7393cf499ac
  Content-Type: text/html
  Content-Transfer-Encoding: quoted-printable
  
  &lt;img src=3D"cid:443ba735-6376-45a1-a5af-6c679321baa2"/&gt;&lt;div&gt;&lt;strong&gt;The bol=
  d works fine, but the header and footer don't work!&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;di=
  v&gt;&lt;img src=3D"cid:145c43b0-da9e-40c4-b149-3a149fbc4503"/&gt;&lt;/div&gt;
  ----boundary_1_306bb8e7-fb92-4eab-bf5c-b7393cf499ac
  Content-Type: image/jpeg
  Content-Transfer-Encoding: base64
  Content-ID: &lt;443ba735-6376-45a1-a5af-6c679321baa2&gt;
  
  
  ----boundary_1_306bb8e7-fb92-4eab-bf5c-b7393cf499ac
  Content-Type: image/jpeg
  Content-Transfer-Encoding: base64
  Content-ID: &lt;145c43b0-da9e-40c4-b149-3a149fbc4503&gt;
  
  
  ----boundary_1_306bb8e7-fb92-4eab-bf5c-b7393cf499ac--
  ----boundary_0_8278962b-71cf-4ca1-9a64-5fb9629f2042
  Content-Type: text/calendar
  Content-Transfer-Encoding: base64
  
  QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjIuMA0KTUVUSE9EOlJFUVVFU1QNCkJFR0lOOlZFVkVO
  VA0KSmRyYWhsQGdtYWlsLmNvbQ0KQ0xBU1M6UFVCTElDDQpDUkVBVEVEOjIwMTYxMDA3VDE4NDIx
  MQ0KREVTQ1JJUFRJT046DQpYLUFMVC1ERVNDO0ZNVFRZUEU9dGV4dC9odG1sOjxpbWcgc3JjPSJj
  aWQ6NDQzYmE3MzUtNjM3Ni00NWExLWE1YWYtNmM2NzkzMjFiYWEyIi8+PGRpdj48c3Ryb25nPlRo
  ZSBib2xkIHdvcmtzIGZpbmUsIGJ1dCB0aGUgaGVhZGVyIGFuZCBmb290ZXIgZG9uJ3Qgd29yayE8
  L3N0cm9uZz48L2Rpdj48YnIgLz48ZGl2PjxpbWcgc3JjPSJjaWQ6MTQ1YzQzYjAtZGE5ZS00MGM0
  LWIxNDktM2ExNDlmYmM0NTAzIi8+PC9kaXY+DQpEVFNUQVJUOjIwMTYxMDI0VDE0MDAwMFoNCkRU
  RU5EOjIwMTYxMDI0VDE4MDAwMFoNCkRUU1RBTVA6MjAxNjEwMDdUMjI0MjExWg0KT1JHQU5JWkVS
  O0NOPSJEaXNuZXkgUmVmcmVzaCBUZWFtIjptYWlsdG86RGlzbmV5LlJlZnJlc2guVGVhbUBkaXNu
  ZXkuY29tDQpTRVFVRU5DRTowDQpVSUQ6NGE5YjczNWQtOTQwYS00Mzk0LTkzODItMzMyMmQxNDg0
  MTBiDQpMT0NBVElPTjpPcmxhbmRvIDogDQpTVU1NQVJZO0xBTkdVQUdFPWVuLXVzOkNvbXB1dGVy
  IFJlZnJlc2ggQXBwb2ludG1lbnQNCkJFR0lOOlZBTEFSTQ0KVFJJR0dFUjotUFQxNDQwTQ0KQUNU
  SU9OOkRJU1BMQVkNCkRFU0NSSVBUSU9OOlJlbWluZGVyDQpFTkQ6VkFMQVJNDQpFTkQ6VkVWRU5U
  DQpFTkQ6VkNBTEVOREFSDQo=
  ----boundary_0_8278962b-71cf-4ca1-9a64-5fb9629f2042--
  </code></pre>