inutan
inutan

Reputation: 10888

Sending mhtml emails - C#

I have a requirement to send emails containing both text and Images.
So, I have .mhtml file that contains the content that needs to be emailed over.

I was using Chilkat for this, but in outlook 2007 it is showing the mhtml file as different attachments(html+images).

Can anyone suggest me some other component for sending mhtml emails.
FYI, I am using .Net 3.5

Also, I do not want to save the images on server before sending them.

Thank you!

Upvotes: 16

Views: 5221

Answers (4)

Moslem Ben Dhaou
Moslem Ben Dhaou

Reputation: 7005

You need to explicitly set the MIME type to multipart/related. Change the MailMessage.Body to include the content of the MHTML file in it. Finally add a new item to the MailMessage.AlternateViews collection to define the correct MIME type. The following link from MSDN has a very good example how to set it up:

MailMessage.AlternateViews Property

Upvotes: 0

Hiren Desai
Hiren Desai

Reputation: 1091

System.Net would be the one that you are looking for.<br/>
MailMessage is used to compose new mail.<br/>
SMTPClient is used to send mail.
NetworkCredentials would be used to attach username and password for making request to sending mail.


Coming to your question how to add images.
You need to set isHtml=true for MailMessage
Since you want to send mail relative paths in the html won't work like ../directory/imagename.formate
in such case you need to give completed path to the image location that's websiteUrl/directory/imagename.formate
To get complete Url dynamically you can use like this Request.Uri.GetLeftParth(URIPartial.Authority)+VitrtualToAbsolute.getAbsolute("~")

I'm not sure about last line since I have wrote directly over here. You just need to use it and have good luck ;-)

Upvotes: 2

Tom Brothers
Tom Brothers

Reputation: 6007

Here is an example using an image as an embedded resource.

MailMessage message = new MailMessage();
message.From = new MailAddress(fromEmailAddress);
message.To.Add(toEmailAddress);
message.Subject = "Test Email";
message.Body = "body text\nblah\nblah";

string html = "<body><h1>html email</h1><img src=\"cid:Pic1\" /><hr />" + message.Body.Replace(Environment.NewLine, "<br />") + "</body>";
AlternateView alternate = AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html);
message.AlternateViews.Add(alternate);

Assembly assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream("SendEmailWithEmbeddedImage.myimage.gif")) {
    LinkedResource picture = new LinkedResource(stream, MediaTypeNames.Image.Gif);

    picture.ContentId = "pic1"; // a unique ID 
    alternate.LinkedResources.Add(picture);

    SmtpClient s = new SmtpClient();
    s.Host = emailHost;
    s.Port = emailPort;
    s.Credentials = new NetworkCredential(emailUser, emailPassword);
    s.UseDefaultCredentials = false;

    s.Send(message);
}
}

Upvotes: 4

Rubens Farias
Rubens Farias

Reputation: 57936

I use plain old native MailMessage class. This previous answer can point you in right direction

EDIT: I built a similiar code some time ago, which captures an external HTML page, parse it's content, grab all external content (css, images, etc) and to send that through email, without saving anything on disk.

Upvotes: 11

Related Questions