sending mail along with embedded image using asp.net

sending mail along with embedded image using asp.net

I have already used following but it can't work

Dim EM As System.Net.Mail.MailMessage = New System.Net.Mail.MailMessage(txtFrom.Text, txtTo.Text)
        Dim A As System.Net.Mail.Attachment = New System.Net.Mail.Attachment(txtImagePath.Text)
        Dim RGen As Random = New Random()
        A.ContentId = RGen.Next(100000, 9999999).ToString()
        EM.Attachments.Add(A)
        EM.Subject = txtSubject.Text
        EM.Body = "<body>" + txtBody.Text + "<br><img src='cid:" + A.ContentId +"'></body>"
        EM.IsBodyHtml = True
        Dim SC As System.Net.Mail.SmtpClient = New System.Net.Mail.SmtpClient(txtSMTPServer.Text)
        SC.Send(EM)

Solution 1:

If you are using .NET 2 or above you can use the AlternateView and LinkedResource classes like this:

string html = @"<html><body><img src=""cid:YourPictureId""></body></html>";
AlternateView altView = AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html);

LinkedResource yourPictureRes = new LinkedResource("yourPicture.jpg", MediaTypeNames.Image.Jpeg);
yourPictureRes.ContentId = "YourPictureId";
altView.LinkedResources.Add(yourPictureRes);

MailMessage mail = new MailMessage();
mail.AlternateViews.Add(altView);

Hopefully you can deduce the VB equivalent.

Solution 2:

After searching and trying must be four or five 'answers' I felt I had to share what I finally found to actually work as so many people seem to not know how to do this or some give elaborate answers that so many others have issues with, plus a few do and only give a snippet answer which then has to be interpreted. As I don't have a blog but I'd like to help others here is some full code to do it all. Big thanks to Alex Peck, as it's his answer expanded on.

inMy.aspx asp.net file

<div>
    <asp:LinkButton ID="emailTestLnkBtn" runat="server" OnClick="sendHTMLEmail">testemail</asp:LinkButton>
</div>

inMy.aspx.cs code behind c# file

protected void sendHTMLEmail(object s, EventArgs e)
{
    /* adapted from http://stackoverflow.com/questions/1113345/sending-mail-along-with-embedded-image-using-asp-net 
       and http://stackoverflow.com/questions/886728/generating-html-email-body-in-c-sharp */

    string myTestReceivingEmail = "[email protected]"; // your Email address for testing or the person who you are sending the text to.
    string subject = "This is the subject line";
    string firstName = "John";
    string mobileNo = "07711 111111";

    // Create the message.
    var from = new MailAddress("[email protected]", "displayed from Name");
    var to = new MailAddress(myTestReceivingEmail, "person emailing to's displayed Name");
    var mail = new MailMessage(from, to);
    mail.Subject = subject;

    // Perform replacements on the HTML file (which you're using as a template).
    var reader = new StreamReader(@"c:\Temp\HTMLfile.htm");
    string body = reader.ReadToEnd().Replace("%TEMPLATE_TOKEN1%", firstName).Replace("%TEMPLATE_TOKEN2%", mobileNo); // and so on as needed...

    // replaced this line with imported reader so can use a templete .... 
    //string html = body; //"<html><body>Text here <br/>- picture here <br /><br /><img src=""cid:SACP_logo_sml.jpg""></body></html>";

    // Create an alternate view and add it to the email. Can implement an if statement to decide which view to add //
    AlternateView altView = AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html);

    // Logo 1 //
    string imageSource = (Server.MapPath("") + "\\logo_sml.jpg");
    LinkedResource PictureRes = new LinkedResource(imageSource, MediaTypeNames.Image.Jpeg);
    PictureRes.ContentId = "logo_sml.jpg";
    altView.LinkedResources.Add(PictureRes);

    // Logo 2 //
    string imageSource2 = (Server.MapPath("") + "\\booking_btn.jpg");
    LinkedResource PictureRes2 = new LinkedResource(imageSource2, MediaTypeNames.Image.Jpeg);
    PictureRes2.ContentId = "booking_btn.jpg";
    altView.LinkedResources.Add(PictureRes2);

    mail.AlternateViews.Add(altView);

    // Send the email (using Web.Config file to store email Network link, etc.)
    SmtpClient mySmtpClient = new SmtpClient();
    mySmtpClient.Send(mail);
}

HTMLfile.htm

<html>
<body>
    <img src="cid:logo_sml.jpg">
    <br />
    Hi %TEMPLATE_TOKEN1% .
    <br />
    <br/>
    Your mobile no is %TEMPLATE_TOKEN2%
    <br />
    <br />
    <img src="cid:booking_btn.jpg">
</body>
</html>

in your Web.Config file, inside your < configuration > block you need the following to allow testing in a TempMail folder on your c:\drive

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory" from="[email protected]">
            <specifiedPickupDirectory pickupDirectoryLocation="C:\TempMail"/>
        </smtp>
    </mailSettings>
</system.net>

the only other things you will need at the top of your aspx.cs code behind file are the Using System includes (if I've missed one out you just right click on the unknown class and choose the 'Resolve' option)

using System.Net.Mail;
using System.Text;
using System.Reflection;
using System.Net.Mime; // need for mail message and text encoding
using System.IO;

Hope this helps someone and big thanks to the above poster for giving the answer needed to get the job done (as well as the other link in my code).

It works but im open to improvements.

cheers.