Email with digital signature and embedded image

10,055

I do think that it is not possible to sign the entire message using System.Net.Mail. But this might also help you:- Send Email in C# Tutorial - SSL, HTML, Embedded Image, S/MIME

Also check this:-(Send Email with Embedded Images - ImportHtml - Example):-

using System;
using System.Collections.Generic;
using System.Text;
using EASendMail; //add EASendMail namespace

namespace mysendemail
{
    class Program
    {
        static void Main(string[] args)
        {
            SmtpMail oMail = new SmtpMail("TryIt");
            SmtpClient oSmtp = new SmtpClient();

            // Set sender email address, please change it to yours
            oMail.From = "[email protected]";

            // Set recipient email address, please change it to yours
            oMail.To = "[email protected]";

            // Set email subject
            oMail.Subject = "test html email with attachment";

            // Your SMTP server address
            SmtpServer oServer = new SmtpServer("smtp.emailarchitect.net");

            // User and password for ESMTP authentication, if your server doesn't require
            // User authentication, please remove the following codes.            
            oServer.User = "[email protected]";
            oServer.Password = "testpassword";

            // If your SMTP server requires SSL connection, please add this line
            // oServer.ConnectType = SmtpConnectType.ConnectSSLAuto;

            try
            {
               // Import html body and also import linked image as embedded images.
               oMail.ImportHtml( "<html><body>test <img src=\"test.gif\"> importhtml</body></html>",
                    "c:\\my picture", //test.gif is in c:\\my picture
                    ImportHtmlBodyOptions.ImportLocalPictures | ImportHtmlBodyOptions.ImportCss );

                Console.WriteLine("start to send email with embedded image...");
                oSmtp.SendMail(oServer, oMail);
                Console.WriteLine("email was sent successfully!");
            }
            catch (Exception ep)
            {
                Console.WriteLine("failed to send email with the following error:");
                Console.WriteLine(ep.Message);
            }
        }
    }
}
Share:
10,055

Related videos on Youtube

fishmong3r
Author by

fishmong3r

Coding some tools in C# and VBscript for my company and my pleasure. :)

Updated on October 21, 2022

Comments

  • fishmong3r
    fishmong3r over 1 year

    I have the below working code for sending digitally signed emails. I have to insert a html based signature with a gif logo which should be pulled from the assembly resources. I have googled around and found Convert.ToBase64String() as possible solution but Outlook does not display the image. The 2nd approach would be LinkedResource with AlternateView to embed my image, but I actually failed to get it work with the below code. I already have an AlternateView to send the email with the digital signature. Is it possible to somehow add the image as well?

    So mailer(to, from, from_name, relay, subject, body, cc1, cc2);.

    private void mailer(string toaddress, string fromaddress, string fromaddress_disp, string relays, string mailsubject, string bodytext, string ccman, string cccct)
    {
        string certname = "";
    
        MailAddress from = new MailAddress(fromaddress, fromaddress_disp);
        MailAddress to = new MailAddress(toaddress);
        MailAddress cc_man = new MailAddress(ccman);
        MailAddress cc_cct = new MailAddress(cccct);
        MailMessage message = new MailMessage(from, to);
        message.CC.Add(cc_man);
        message.CC.Add(cc_cct);
        message.Subject = mailsubject;
        message.IsBodyHtml = true;
        string body = "Content-Type: text/html; charset=iso-8859-1 \r\nContent-Transfer-Encoding: 8bit\r\n\r\n" + bodytext;
        byte[] messageData = Encoding.ASCII.GetBytes(body);
        ContentInfo content = new ContentInfo(messageData);
    
        SignedCms Cms = new SignedCms(new ContentInfo(messageData));
        X509Store store = new X509Store(StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);
    
        RSACryptoServiceProvider csp = null;
        X509Certificate2Collection certCollection = store.Certificates;
        X509Certificate2 cert = null;
        foreach (X509Certificate2 c in certCollection)
        {
            if ((c.Subject.Contains("myEmailAddress")) && (c.FriendlyName.Contains("CompanyEmailDigSig")))
            {
                cert = c;
                break;
            }
        }
    
        if (cert != null)
        {
                csp = (RSACryptoServiceProvider)cert.PrivateKey;
        }
        else
        {
            throw new Exception("Valid certificate was not found");
        }
    
        CmsSigner Signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, cert);
        Cms.ComputeSignature(Signer);
        byte[] SignedBytes = Cms.Encode();
        MemoryStream signedStream = new MemoryStream(SignedBytes);
        AlternateView signedView = new AlternateView(signedStream, "application/pkcs7-mime; smime-type=signed-data; name=sig.p7m");
        message.AlternateViews.Add(signedView);
        SmtpClient client = new SmtpClient(relays);
        store.Close();
    
        try
        {
            client.Send(message);
        }
        catch (Exception ex)
        {
        //exception
        }
    }
    

    EDIT: I had to re-open this thread as the previously accepted answer is not good enough.