Email with digital signature and embedded image
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);
}
}
}
}
Related videos on Youtube
fishmong3r
Coding some tools in C# and VBscript for my company and my pleasure. :)
Updated on October 21, 2022Comments
-
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 beLinkedResource
withAlternateView
to embed my image, but I actually failed to get it work with the below code. I already have anAlternateView
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.