Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C#

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

4.88/5 (54 votes)
3 Mar 2011CPOL 189.9K  
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
    }

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)