views:

1861

answers:

3

I'm attempting to send HTML formatted emails using C# 3 via Outlook.MailItem

Outlook.MailItem objMail = (Outlook.MailItem)olkApp.CreateItem(Outlook.OlItemType.olMailItem);
objMail.To = to;
objMail.Subject = subject;
objMail.HTMLBody = htmlBody;

The email is generated externally by saving from an RTF control (TX Text Control), which yields HTML with links to images stored in a <<FileName>>_files subdirectory. Example:

<img border="0" src="file:///C:/Documents%20and%20Settings/ItsMe/Local%20Settings/Temp/2/zbt4dmvs_Images/zbt4dmvs_1.png" width="94" height="94" alt="[image]">

Sending the email this way generates a mail with broken links.

Using Outlook 2007 as the email client with Word as the email editor, switching to RTF (Options tab, Format tab group) preserves the layout and inlines the images.

Programmatically doing this via:

var oldFormat = objMail.BodyFormat;
objMail.BodyFormat = Outlook.OlBodyFormat.olFormatRichText;
objMail.BodyFormat = oldFormat;

loses the formatting and mangles the images (the image becomes a [image] link marker on screen which is clickable but no longer shows the image). This isn't a surprise given that the documentation for MailItem.BodyFormat Property says "All text formatting will be lost when the BodyFormat property is switched from RTF to HTML and vice-versa".

Sadly there doesnt seem to be an easy way to change the Type of each Attachment in the MailItem.Attachements to OlAttachmentType.olByValue, as it's a read-only property that's set when you create the Attachment.

An approach that comes to mind is to walk the HTML, replacing the <img> tags with markers and programatically walking the MailItem text, inserting an Outlook.Attachment of Type OlAttachmentType.olByValue.

Another option is to convert the <img> links to use src="cid:uniqueIdN" and add the images as attachments with the referenced identities.

So, to the question... Is there a way to get the linked images converted to embedded images, ideally without getting into third party tools like Redemption? Converting to RTF happens to yield the outcome, but doing it that way is by no means a pre-requisite, and obviously may lose fidelity - I Just Want It to Just Work :D Neither of my existing ideas sound Clean to me.

+1  A: 

Since you are using .net > 2.0, you may want to look into the System.Net.Mail namespace for the creation of mail messages. I have found that its quite customizable and was very easy to use for a task similar to yours. The only problems that I had was making sure I was using the right encoding, and I had to use HTML tables for layouts (css would not work right). Here are some links to show you how this works...

If that's not an option, then I would recommend going the Content ID route and embedding the images as attachments. Your other option is to host the images publicly on a website, and change the image links in the html to the public images.

Something that you should be cognizant about is that HTML emails can easily look like spam and can be treated as such by email servers and clients. Even ones that are just for in-house usage (its happened to me) can end up in Outlook's Junk Mail folder..

StingyJack
Thanks for the response, and sorry for the fact that my recent sheepish response makes all but invalidates the need for my asking the question.
Ruben Bartelink
Very good point re keeping a beady eye on the junk mail folder when developing (or the Sent Mail folder in my case would have been a good idea :D)Re the using S.N.M point, were I starting from fresh, I'd definitely take that route alright, but the code is as the code is!.Thanks very much.
Ruben Bartelink
A: 

DOH!, actually sending the email in Outlook 2007 forces the images to become embedded.

The Sent Item size of 8K is a lot smaller than the draft size of 60K (RTF) I was seeing vs the draft size of 1K (HTML that hadn't been converted to RTF and back again).

So it was Doing What I Mean all the time. Grr.

I'll leave the Q and the A up here in case it helps someone of a similarly confused state of mind.

BTW some useful links I found on my journey:

Sending emails example

General Q&A site with other examples of varying quality

Ruben Bartelink
+1  A: 

If you got your C# code (embed image - not attach) to work for Outlook 2007, would you pls post your snippets online? Thanks!

Hi Gerardo, Unfortunately the code isnt in a form that lends itself to posting. http://aspalliance.com/1354_Sending_HTML_Mail_with_Embedded_Image_in_NET.all pretty much explains it though?
Ruben Bartelink