Sending an Email in C# with or without attachments: generic routine.






4.88/5 (52 votes)
Sending an email is not a real problem, but I am fed up with answering the question "How do I do it?" in Q&A . So, here is the generic routine I use to send an email, with or without attachments, so I can just point people at it!
/// <summary> /// Send an email from [DELETED] /// </summary> /// <param name="to">Message to address</param> /// <param name="body">Text of message to send</param> /// <param name="subject">Subject line of message</param> /// <param name="fromAddress">Message from address</param> /// <param name="fromDisplay">Display name for "message from address"</param> /// <param name="credentialUser">User whose credentials are used for message send</param> /// <param name="credentialPassword">User password used for message send</param> /// <param name="attachments">Optional attachments for message</param> public static void Email(string to, string body, string subject, string fromAddress, string fromDisplay, string credentialUser, string credentialPassword, params MailAttachment[] attachments) { string host = ConfigurationManager.AppSettings["SMTPHost"]; body = UpgradeEmailFormat(body); try { MailMessage mail = new MailMessage(); mail.Body = body; mail.IsBodyHtml = true; mail.To.Add(new MailAddress(to)); mail.From = new MailAddress(fromAddress, fromDisplay, Encoding.UTF8); mail.Subject = subject; mail.SubjectEncoding = Encoding.UTF8; mail.Priority = MailPriority.Normal; foreach (MailAttachment ma in attachments) { mail.Attachments.Add(ma.File); } SmtpClient smtp = new SmtpClient(); smtp.Credentials = new System.Net.NetworkCredential(credentialUser, credentialPassword); smtp.Host = host; smtp.Send(mail); } catch (Exception ex) { StringBuilder sb = new StringBuilder(1024); sb.Append("\nTo:" + to); sb.Append("\nbody:" + body); sb.Append("\nsubject:" + subject); sb.Append("\nfromAddress:" + fromAddress); sb.Append("\nfromDisplay:" + fromDisplay); sb.Append("\ncredentialUser:" + credentialUser); sb.Append("\ncredentialPasswordto:" + credentialPassword); sb.Append("\nHosting:" + host); ErrorLog(sb.ToString(), ex.ToString(), ErrorLogCause.EmailSystem); } }"
UpgradeEmailFormat
" and "ErrorLog
" are generic routines; you don't need the former, and can write the later yourself!
"MailAttachment
" is a simple class you only need if you want to send attachments:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; using System.Net.Mime; using System.Net.Mail; public class MailAttachment { #region Fields private MemoryStream stream; private string filename; private string mediaType; #endregion #region Properties /// <summary> /// Gets the data stream for this attachment /// </summary> public Stream Data { get { return stream; } } /// <summary> /// Gets the original filename for this attachment /// </summary> public string Filename { get { return filename; } } /// <summary> /// Gets the attachment type: Bytes or String /// </summary> public string MediaType { get { return mediaType; } } /// <summary> /// Gets the file for this attachment (as a new attachment) /// </summary> public Attachment File{ get {return new Attachment(Data, Filename, MediaType); } } #endregion #region Constructors /// <summary> /// Construct a mail attachment form a byte array /// </summary> /// <param name="data">Bytes to attach as a file</param> /// <param name="filename">Logical filename for attachment</param> public MailAttachment(byte[] data, string filename) { this.stream = new MemoryStream(data); this.filename = filename; this.mediaType = MediaTypeNames.Application.Octet; } /// <summary> /// Construct a mail attachment from a string /// </summary> /// <param name="data">String to attach as a file</param> /// <param name="filename">Logical filename for attachment</param> public MailAttachment(string data, string filename) { this.stream = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(data)); this.filename = filename; this.mediaType = MediaTypeNames.Text.Html; } #endregion }