I have a system that generates emails, including embedded iCalendar events, which are sent to the relevant people.
The event is created from a task.
The task can be edited, which in turn updates the meeting times etc.
The task can also be cancelled, which again updates the meeting, by cancelling it.
This had all been working fine for over a year.
But then about 6 weeks ago office updated, including a very noticeable update to outlook (the way meetings/events requests are displayed is drastically different now, so some significant work has gone on in that area by the outlook team) - the problem is this update has broken iCalendar event cancellations.
The initial meeting still works fine, as does editing. But when cancelling instead of the embedded iCalendar event doing it's thing, I now just get an attachment titled : "not supported calendar message.ics"
I am using PHPMailer to send the emails, and use the ical feature provided by this library to attach the generated iCalendar event to an email.
I have tried to debug as best I can, which isn't easy as they also seem to have removed any way to view full email source.
However I have tried to streamline the iCalendar event down to it's absolute barebones, with no luck.
So I have instructed PHPMailer to dump the full email. for debugging purposes - output below:
Event Creation :
Content-Type: multipart/alternative;
boundary="b1_ee3827bf9d86f19f6cb13cbcbc05bb33"
Content-Transfer-Encoding: 8bit^M
^M
This is a multi-part message in MIME format.
--b1_ee3827bf9d86f19f6cb13cbcbc05bb33
Content-Type: text/plain; charset=us-ascii
[test] testing iCal
--b1_ee3827bf9d86f19f6cb13cbcbc05bb33
Content-Type: text/html; charset=us-ascii
Details:</b></u><br /><i>Off-Site</i><br /><u><b>Technical Contact Name:</b></u> Test User<br /><u><b>Technical Contact Number:</b></u> 12345<br /><u><b>Technical Contact e-mail:</b></u> anothertest#test.com<br /><u><b>Work to be done:</b></u><br /><p>[test] testing iCal</p>
--b1_ee3827bf9d86f19f6cb13cbcbc05bb33
Content-Type: text/calendar; method=REQUEST; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VTIMEZONE
TZID:Europe/London
BEGIN:STANDARD
DTSTART:20091101T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:+0100
TZOFFSETTO:+0000
TZNAME:GMT
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:20090301T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
TZOFFSETFROM:+0000
TZOFFSETTO:+0100
TZNAME:BST
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
LAST-MODIFIED:20190902T151649
UID:d7f4bed92a83499c81392678cd655aeb
DTSTAMP:20190902T151649
DTSTART;TZID="Europe/London":20190906T090000
DTEND;TZID="Europe/London":20190906T170000
TRANSP:OPAQUE
SEQUENCE:0
SUMMARY:"test task"
LOCATION:
STATUS:CONFIRMED
ORGANIZER;CN="xxxx#xxxx.com":MAILTO:xxxx#xxxx.com
ATTENDEE;CN="xxxx#xxxx.com";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED;MAILTO:xxxx#xxxx.com
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MS-OLK-CONFTYPE:0
CLASS:PUBLIC
PRIORITY:5
END:VEVENT
END:VCALENDAR
--b1_ee3827bf9d86f19f6cb13cbcbc05bb33--
Update event:
Content-Type: multipart/alternative;
boundary="b1_23a19fb87bb01c1c2ae6e3fede170549"
Content-Transfer-Encoding: 8bit^M
^M
This is a multi-part message in MIME format.
--b1_23a19fb87bb01c1c2ae6e3fede170549
Content-Type: text/plain; charset=us-ascii
[test] testing iCal - updated
--b1_23a19fb87bb01c1c2ae6e3fede170549
Content-Type: text/html; charset=us-ascii
<b>Delivery Details:</b></u><br /><i>Off-Site</i><br /><u><b>Technical Contact Name:</b></u> Test User<br /><u><b>Technical Contact Number:</b></u> 12345<br /><u><b>Technical Contact e-mail:</b></u> anothertest#test.com<br /><u><b>Work to be done:</b></u><br /><p>[test] testing iCal - updated</p>
--b1_23a19fb87bb01c1c2ae6e3fede170549
Content-Type: text/calendar; method=REQUEST; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VTIMEZONE
TZID:Europe/London
BEGIN:STANDARD
DTSTART:20091101T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:+0100
TZOFFSETTO:+0000
TZNAME:GMT
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:20090301T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
TZOFFSETFROM:+0000
TZOFFSETTO:+0100
TZNAME:BST
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
CATEGORIES:Louis Marchant
LAST-MODIFIED:20190902T152651
UID:d7f4bed92a83499c81392678cd655aeb
DTSTAMP:20190902T152651
DTSTART;TZID="Europe/London":20190907T090000
DTEND;TZID="Europe/London":20190907T170000
TRANSP:OPAQUE
SEQUENCE:2
SUMMARY:"test event"
LOCATION:
STATUS:CONFIRMED
ORGANIZER;CN="xxxx#xxxx.com":MAILTO:xxxx#xxxx.com
ATTENDEE;CN="xxxx#xxxx.com";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED;MAILTO:xxxx#xxxx.com
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MS-OLK-CONFTYPE:0
CLASS:PUBLIC
PRIORITY:5
END:VEVENT
END:VCALENDAR
--b1_23a19fb87bb01c1c2ae6e3fede170549--
Cancellation event - the one no longer working :
Content-Type: multipart/alternative;
boundary="b1_87ddce1a469e89e0c0caa7b0a82efd5e"
Content-Transfer-Encoding: 8bit^M
^M
This is a multi-part message in MIME format.
--b1_87ddce1a469e89e0c0caa7b0a82efd5e
Content-Type: text/plain; charset=us-ascii
Meeting Cancelled
--b1_87ddce1a469e89e0c0caa7b0a82efd5e
Content-Type: text/html; charset=us-ascii
Meeting Cancelled
--b1_87ddce1a469e89e0c0caa7b0a82efd5e
Content-Type: text/calendar; method=REQUEST; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN
VERSION:2.0
METHOD:CANCEL
BEGIN:VTIMEZONE
TZID:Europe/London
BEGIN:STANDARD
DTSTART:20091101T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
TZOFFSETFROM:+0100
TZOFFSETTO:+0000
TZNAME:GMT
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:20090301T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
TZOFFSETFROM:+0000
TZOFFSETTO:+0100
TZNAME:BST
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
CATEGORIES:Louis Marchant
LAST-MODIFIED:20190902T152921
UID:d7f4bed92a83499c81392678cd655aeb
DTSTAMP:20190902T152921
DTSTART;TZID="Europe/London":20190907T090000
DTEND;TZID="Europe/London":20190907T170000
TRANSP:OPAQUE
SEQUENCE:2
SUMMARY:"Louis Marchant - Offsite - 2 Circles Communication Limited 602"
LOCATION:
STATUS:CANCELLED
ORGANIZER;CN="xxxx#xxxx.com":MAILTO:xxxx#xxxx.com
ATTENDEE;CN="xxxx#xxxx.com";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED;MAILTO:xxxx#xxxx.com
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MS-OLK-CONFTYPE:0
CLASS:PUBLIC
PRIORITY:5
END:VEVENT
END:VCALENDAR
--b1_87ddce1a469e89e0c0caa7b0a82efd5e--
Any insights would be helpful, as I am fresh out of ideas. Although I suspect it may just simply no longer be possible, although I obviosuly hope this is not the case.
PHPMailer's iCal support has some limitations, some related to the horribly inconsistent way that it's supported in different clients. This issue discusses some of those problems.
A separate problem relates to iCal events other than REQUEST, specifically in Outlook. This problem is visible in your examples:
Content-Type: text/calendar; method=REQUEST; charset=iso-8859-1
METHOD:CANCEL
Notice that the two method names do not match; this is because PHPMailer currently only supports REQUEST-type messages, and it's likely that Outlook doesn't like this mismatch. What I suggested in that second issue was that PHPMailer could scan the content of the iCal data provided in the ICal property and extract the method value, and then use it in the content-type header used for that element.
PHPMailer doesn't currently do this - but if you'd care to add support for it and submit a pull request, it would be very welcome.
After outlook update I had the same issue. I was able to create event successfully but when i try to cancel the event, cal_event is not embedded within mail like how it was happening before. Instead sending the mail with an unsupported .ics attachment.
I got the solution for this. This worked for me.
Issue:
$mail->addCustomHeader('Content-type',"text/calendar; name=event.ics; method=REQUEST; charset=UTF-8;");
Change the method type from REQUEST to CANCEL
Resolution:
$mail->AddStringAttachment($ical, "event.ics", "7bit", "text/calendar; charset=utf-8; method=CANCEL");
Related
I've upgraded an existing email sending program from Indy 9 to Indy 10. This works fine in our test environment but on a clients site the attachments are appearing in the body of the email. Their SMTP server is adding a footer to the email and adding <html> ... </html> tags around the whole thing, which is causing this issue. The previous version on Indy 9 worked fine for this client.
Here is an example of the email we are sending:
Content-Type: multipart/mixed; boundary="gcJJK3Qk5C6XIV9FEwfRcK=_EH4Oq32hqE"
MIME-Version: 1.0
Date: Thu, 1 Oct 2020 00:02:29 +0100
Message-Id: <20201001000278.SM78660#B-P-S0308-APP1>
This is a multi-part message in MIME format
--gcJJK3Qk5C6XIV9FEwfRcK=_EH4Oq32hqE
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Body text appears here.
--gcJJK3Qk5C6XIV9FEwfRcK=_EH4Oq32hqE
Content-Type: application/octet-stream;
name="PDA Audit.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="PDA Audit.pdf"
JVBERi0xLjINCjEgMCBvYmoNCjw8IC9UeXBlIC9DYXRhbG9nIA0KL1BhZ2VzIDMgMCBSIA0KL1Zp
ZXdlclByZWZlcmVuY2VzIDw8IA0KPj4NCj4+IA0KZW5kb2JqDQo1IDAgb2JqDQo8PCAvVHlwZSAv
<more lines here>
--gcJJK3Qk5C6XIV9FEwfRcK=_EH4Oq32hqE--
Is there anything wrong with this?
I note that the boundary no longer contains the =_NextPart, so I'm wondering if the code on the server has been badly written and is expecting to find this. Has anyone else had a similar issue?
Issue solved. We were allowing Indy to decide on the Content-Type which worked if we only sent an email with an attachment. If a previous email was just text the Content-Type was set to text/plain. When the email with the attachment was then sent Indy thought the Content-Type was already set so did not change it. Setting the Content-Type correctly solved the problem.
We are creating meeting in o365 using APIs from our application running in AWS. Now when o365 tries to send the meeting invitation mail to the attendees, it is failing with the following message
"Your message wasn't delivered because the recipient's email provider rejected it."
Accept-Language: en-IN, en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator: <MA1PR01MB05367FFBBDA3D3428394F137EA940#MA1PR01MB0536.INDPRD01.PROD.OUTLOOK.COM>
MIME-Version: 1.0
X-Originating-IP: [x.x.x.x]
X-MS-PublicTrafficType: Email
X-Microsoft-Exchange-Diagnostics: 1;MA1PR01MB0536;35:xxkBmbXtXVZGwsiEiilEbeHIi2ZfWIEmurkPr5sPyonpPJb4Few1njcGEXmLtoIRRPDQzZ0MGBpVxEBs5k+NHQ==
Return-Path: ravi#wizergos.onmicrosoft.com
X-MS-Office365-Filtering-Correlation-Id: bff8840d-3e84-4e15-2467-08d4f5e3332a
X-Microsoft-Antispam:
UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(2017082002075)(300000503095)(300135400095)(2017052603199)(2017052602031)(201703131423075)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:MA1PR01MB0423;
X-Microsoft-Exchange-Diagnostics:
1;MA1PR01MB0423;3:Xef52NLXLwX4Of/x+cHPnQu37UGGPZubrpQKrlol422+XrwEXRRTZSVc/dNSXnhf8zx/T3Ve+GWXWow34lClcPGYw2XJOww+LnbbazzBaUpH+7AZ7hxerQvITqaoRBJ+O8BwlgPm5N66JQ/x8OzvOrfEyLfy5wHMyfkpOdUQcjNjk3WwA/UqEYLnw0Bi8+sNzuRv9KYmy3e/ecsoKufxTGIxhUvkzscdXkJzmIcFxSj1U8oe7gu1ju+UfLIlRAAz;25:zlxV3kOuhuB0AiZji3QcQYsFZJ4gM6V/ScR+fcNLjRVTqC9vhwucbQbjtW9XROTGixbi6P1XnxZYIfYY/vthmVoXWErFHLAMoGrCz7UBGJW0KLn7PdMUXYBjcRqJYe+4D/I2VYW0lIpLOBkrgjrcrbHtNN/0vH38fGyNPhbMzLccW+Tqo3xYzqobZxenetGqBon1tI06pDOrTLn6djWYhXdZlqNFpXXY/C8DnZKwSejoPER6L5SAGK0RuDKxROrHqNXw3lUsIuhRpHl83jVXbvg+wT9LxcgODN738IbttbxOeXI7TO8MJwnF0RcQqwXJgg4g6lwDP9eG4eZ5DkK09w==;31:XbLZ42S1mgULCldfxD4tdswCKMK1cS7vfLD+FG9nWiDnId97lqaiEjqhMJKODPQ6D2wqtFthn6QmcsMJdibizsyvlxn8M7Wk/R+nn1Te+T4cT2ngQ4M67NizCLL2r8XnhNj+mOss4l84OUb5/R7JRLBVwJ1EVqvzsorjhJrP+5lC/yp+RCiNXQOM3u+FYorruWbYJRnKgyO6nss45/v195R/sk+gxArKezWR5DMLZGs=
X-MS-TrafficTypeDiagnostic: MA1PR01MB0423:
X-Exchange-Antispam-Report-Test: UriScan:;
X-Microsoft-Antispam-PRVS:
<MA1PR01MB042315699A93C8516E927B2DEA940#MA1PR01MB0423.INDPRD01.PROD.OUTLOOK.COM>
X-Exchange-Antispam-Report-CFA-Test:
BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3002001)(100000703101)(100105400095)(6002118)(6000006)(6041248)(20161123555025)(20161123564025)(20161123558100)(20161123560025)(201703131423075)(201703061421075)(20161123562025)(2016111802025)(6072148)(6043046)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:MA1PR01MB0423;
X-Microsoft-Exchange-Diagnostics:
1;MA1PR01MB0423;4:0/9bOsP2nGypeImKrp94rgcadobyGcmHZZJcrZkUYWm/njcJgwcAQCN9lUpXScM1V1xJ/OgUpsN0XumAc26tB9p2PxVh8ZlKLsUr6MekfDwIgTesUobWI0vz2H/dPFNXeyT3EB9c4kzNmL7eUFW1nzT6FbvB/T1EdCjWFT75Lys44X5fHMNv/7YyFYJMvNYFNi6+ZAVD0it+y54F+eHtUUfsCTW3evk+1+ifzP81C1MKGvgHgMXdexgwoZzp/zDL;23:OjwAxMC42eaZnBXh0jG8s6hWVMNwT3CLZvnFC1FffQMfC4yvFvyCPQwRol0ZIja9qcSK4H3e7okBP7qRbkbBmd92pefGIx1Zk8LERY0D3nZgrSyxljJCahO18B/96ypzTDc4pfMD4aU6wZskaNb09+jWANhMoUfSpjO6cWVmhLaaCSFtnF3oq6vVgdG20iQCAkV8vhAyH7kmV1pt17VLLzAmJe2qJ5IVb0Sr74FbXVc=;6:cnMNa1KjnOzQAMEYkQl2HnBDwhs0VUa2lJy07jV0iWa1fzIvHJKOUQcVCA1m17JigjidHTvENe91KEkVekLBJ9zVKi61ZVZ1oLTtx73RZdqUFJz8M2RYv0JcqYG36q+p53xrrW6vto/Y82nNWc30PIEBUcHUnyc9eiXugSjtgu08Rpj0RLJoxs2iHVzE3tskn1u45ll/c3J6+DCqAB3L+V1yWT76OvSjXBaI5GMAzvZQP3vjCzTz2SztNBKf8RDpVFsO1UcN6wuzNWIbRrPfwFH58VAlzf7Ua9jopR+nlPBVOsjnyS9Yrloz8qPIwl9mOEb4Tn1psCuxwTyhdLnHgQ==
X-Forefront-PRVS: 04238CD941
I'm using googlerequest object to retrieve notification data for a certain serial-number in sandbox environment.
POST argument (xml) I send to google:
<?xml version="1.0" encoding="UTF-8"?><notification-history-request xmlns="http://checkout.google.com/schema/2"><serial-number>631274667786221-00005-6</serial-number></notification-history-request>
Response from curl:
HTTP/1.1 500 Internal Server Error
Content-Type: application/xml; charset=UTF-8
Date: Mon, 03 Jun 2013 12:28:57 GMT
Expires: Mon, 03 Jun 2013 12:28:57 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Set-Cookie: S=payments_api=P4yzgVwZyqdAb7S_BUtJXw; Expires=Mon, 03-Jun-2013 12:58:57 GMT; Path=/; Secure; HttpOnly
Server: GSE
Transfer-Encoding: chunked
<?xml version="1.0" encoding="UTF-8"?>
<error xmlns="http://checkout.google.com/schema/2" serial-number="f9338a0b-b14a-4afc-956b-5618b9741245">
<error-message>Internal error in server</error-message>
</error>
Can't answer for Google but it seems Google Checkout sandbox seems to have been shutdown / deprecated (already). This is my guess/perception as I cannot login to my Google Checkout sandbox which was at https://sandbox.gogle.com/checkout/sell for sandbox related activity like integration settings, debug console, etc.
I do see that the former sandbox Merchant center is accessible at:
https://wallet-web.sandbox.google.com/manage
So you can check sandbox orders (across different APIs) but as stated, it doesn't have the knobs/switches relevant to Google Checkout (other APIs have different "consoles" for API settings).
I don't know why (if it's early deprecation)...perhaps it's late in the game as it pertains to Google Checkout retirement to start debugging now....
See Google Checkout deprecation/retirement in November 2013 announcement and more info.
Update
Q: issue happens when I set the following options and send them via curl(): $options['shopping-cart.buyer-messages.include-gift-receipt-1'] = 1; $options['shopping-cart.buyer-messages.special-instructions-1'] = '';
You mean in the initial Checkout POST you sent to Google? If so, that instruction tells Google to offer those screens at the Google Checkout web site (not yours). I believe you shouldn't provide values for one field only - you'll have to provide all fields if you want to pre-populate from your web site.
Sorry, really tough to debug without Integration Console (which was part of the original Google Checkout console/UI in both sandbox and production) - which likely would have shown more error detail....
I'm currently working on an application that will send the user a selected coupon via email or MMS. The problem that I am running into is with the display of the MMS when the customer receives it. on Android, the image is being displayed as a video, and on iOS, everything is wrong about the message.
Here's an example of the headers that are being sent:
User-Agent: none
Date: Tue, 5 Mar 2013 10:45:12 -0500
From:
Return-Path:
Subject: =?utf-8?Q?Your_Requested_Coupon?=
To: ###########txt.att.net
Reply-To: "webadministrator#domain.com"
X-Sender: webadministrator#domain.com
X-Mailer: none
X-Priority: 3 (Normal)
Message-ID: <51361308f1651#domain.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="B_ATC_51361309002f2"
This is a multi-part message in MIME format.
Your email application may not support this format.
--B_ATC_51361309002f2
Content-Type: multipart/alternative; boundary="B_ALT_51361308f3595"
--B_ALT_51361308f3595
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
--B_ALT_51361308f3595
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
--B_ALT_51361308f3595--
--B_ATC_51361309002f2
Content-type: image/jpeg; name="promo3.jpg"
Content-Disposition: attachment;
Content-Transfer-Encoding: base64
....
IMAGE ENCODING HERE
....
--B_ATC_51361309002f2--
And the CI Code:
$this->email->from('webadministrator#domain.com');
$this->email->to('XXXXXXXXXX#PHONE_MESSAGE_CENTER.COM');
$this->email->subject('Your Requested Coupon');
$this->email->message($this->load->view('sms_email', '', TRUE));
$this->email->attach('/path/to/image.jpg'); //I've also tried passing a second param 'inline' to change the Content-Disposition to inline
Does anyone know if it is possible to use the built in email class to accomplish this, or do I need to write specific headers to make picture messaging display properly?
Also is there a proper message format for MMS: text or html?, is there a proper way to attach an image for the iOS to view?
trying to send mms from the web using an email address, example #mms.att.com, will get you blocked by the network eventually. there is not a clean way to get around this problem without support of the network or mms partner. the best solution these days is to just send an sms with a link to a mobile ad on the web.
and by the way, i'd recommend a provider like cdyne or twilio for sms (dont try to send sms via email address either!) you might also try to simply connect a 3g/4g modem and modifying the driver to programmatically shoot sms/mms messages. go at your own risk on that one ..
I'm programming an email newsletter with a couple of embedded images. The headers look like:
... (snip)
MIME-Version: 1.0
Content-type: multipart/related;
boundary="xyzzy1220091"
This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.
--xyzzy1220091
Content-type: text/html; charset=iso-8859-1; name="tempE924AAC7.html"
Content-description: html
Content-transfer-encoding: 7bit
Content-disposition: INLINE
(HTML newsletter here)
--xyzzy1220091
Content-type: image/jpeg; name="cabecera.jpg"
Content-description: cabecera
Content-transfer-encoding: base64
Content-disposition: inline; filename="cabecera.jpg";
Content-ID: <cabecera>
This works correctly in Gmail, Hotmail, Apple Mail... everything I tested it on, except Outlook 2010. In it, it will show an empty message and the HTML and JPG files as attachments in separate tabs; if you click on the HTML, it will show you a preview button with a warning about showing previews only from trusted sources.
If I send the newsletter not as a multipart/related attachment, but just as a HTML email:
Content-type: text/html
Content-transfer-encoding: quoted-printable
Then it displays perfectly in Outlook... but of course, then I can't add inline images.
As for the original problem, I solved it by using "multipart/alternative" and not attaching the HTML part as a file