Click here to Skip to main content
Click here to Skip to main content

Sending complex emails in .NET 1.1

By , 15 Mar 2006
 

Introduction

System.Web.Mail can be used to send emails from .NET 1.1 applications. Sending simple emails is very easy. It is more complicated when you try to send emails using a SMTP server that requires authentication, or even when you just need to format the From name of the email you want to send.

Background

Here is the most simple piece of code that will send an email using C#:

// build the email message
MailMessage msg = new MailMessage();

msg.From = "from.email@domain.com";
msg.To = "to.email@domain.com";
msg.Subject = "Subject";
msg.Body = "Body";

// send the message
SmtpMail.SmtpServer = "smtp.server.com";
SmtpMail.Send(msg);

Problems and the immediate solution

Things need to get more complicated if instead of displaying the From email address, you want to display a name that the recipient of the email will see. For that, a custom header needs to be added:

string sFromName = "From display name";
string sFromAddress = "from.email@domain.com";
msg.Headers.Add("From", string.Format("{0} <{1}>", 
                sFromName, sFromAddress));

Even more complicated will be to send an email using a SMTP server that requires authentication. For that, the Fields collection of the MailMessage object needs to be used. Here is the sample piece of code that will help you solve your problems:

// set SMTP server name
msg.Fields["http://schemas.microsoft.com" + 
    "/cdo/configuration/smtpserver"] = "smtp.server.com";
// set SMTP server port
msg.Fields["http://schemas.microsoft.com/" + 
    "cdo/configuration/smtpserverport"] = 25;
msg.Fields["http://schemas.microsoft.com/" + 
    "cdo/configuration/sendusing"] = 2;

msg.Fields["http://schemas.microsoft.com/cdo/" + 
    "configuration/smtpauthenticate"] = 1;
// set SMTP username
msg.Fields["http://schemas.microsoft.com/cdo" + 
    "/configuration/sendusername"] = "username";
// set SMTP user password
msg.Fields["http://schemas.microsoft.com/" + 
    "cdo/configuration/sendpassword"] = "password";

The better solution

A better solution for the enhancements described above would be to create a new class that is inherited from MailMessage and has the extra features. Here is the content of the new class:

/// <summary>
/// EnhancedMailMessage is a class that provides
/// more features for email sending in .NET
/// </summary>
public class EnhancedMailMessage : MailMessage
{
    private string fromName;
    private string smtpServerName;
    private string smtpUserName;
    private string smtpUserPassword;
    private int smtpServerPort;
    private bool smtpSSL;

    public EnhancedMailMessage()
    {
        fromName = string.Empty;
        smtpServerName = string.Empty;
        smtpUserName = string.Empty;
        smtpUserPassword = string.Empty;
        smtpServerPort = 25;
        smtpSSL = false;
    }

    /// <summary>
    /// The display name that will appear
    /// in the recipient mail client
    /// </summary>
    public string FromName 
    {
        set 
        {
            fromName = value;
        }
        get 
        {
            return fromName;
        }
    }

    /// <summary>
    /// SMTP server (name or IP address)
    /// </summary>
    public string SMTPServerName 
    {
        set 
        {
            smtpServerName = value;
        }
        get 
        {
            return smtpServerName;
        }
    }

    /// <summary>
    /// Username needed for a SMTP server
    /// that requires authentication
    /// </summary>
    public string SMTPUserName 
    {
        set 
        {
            smtpUserName = value;
        }
        get 
        {
            return smtpUserName;
        }
    }
    
    /// <summary>
    /// Password needed for a SMTP server
    /// that requires authentication
    /// </summary>
    public string SMTPUserPassword 
    {
        set 
        {
            smtpUserPassword = value;
        }
        get 
        {
            return smtpUserPassword;
        }
    }
    
    /// <summary>
    /// SMTP server port (default 25)
    /// </summary>
    public int SMTPServerPort 
    {
        set 
        {
            smtpServerPort = value;
        }
        get 
        {
            return smtpServerPort;
        }
    }
    
    /// <summary>
    /// If SMTP server requires SSL
    /// </summary>
    public bool SMTPSSL
    {
        set 
        {
            smtpSSL = value;
        }
        get 
        {
            return smtpSSL;
        }
    }

    public void Send() 
    {
        if (smtpServerName.Length == 0) 
        {
            throw new Exception("SMTP Server not specified");
        }

        if (fromName.Length > 0) 
        {
            this.Headers.Add("From", 
                 string.Format("{0} <{1}>", 
                 FromName, From));            
        }

        // set SMTP server name
        this.Fields["http://schemas.microsoft.com/" + 
                    "cdo/configuration/smtpserver"] = smtpServerName;
        // set SMTP server port
        this.Fields["http://schemas.microsoft.com/cdo" + 
                    "/configuration/smtpserverport"] = smtpServerPort;
        this.Fields["http://schemas.microsoft.com/" + 
                    "cdo/configuration/sendusing"] = 2;

        if (smtpUserName.Length >0 && smtpUserPassword.Length > 0) 
        {
            this.Fields["http://schemas.microsoft.com/" + 
                        "cdo/configuration/smtpauthenticate"] = 1;
            
            // set SMTP username
            this.Fields["http://schemas.microsoft.com" + 
                 "/cdo/configuration/sendusername"] = smtpUserName;
            // set SMTP user password
            this.Fields["http://schemas.microsoft.com/" + 
                 "cdo/configuration/sendpassword"] = smtpUserPassword;
        }

        // ssl if needed
        if (smtpSSL) 
        {
            this.Fields.Add("http://schemas.microsoft" + 
                 ".com/cdo/configuration/smtpusessl", "true");
        }

        SmtpMail.SmtpServer = smtpServerName;
        SmtpMail.Send(this);
    }

    public static void QuickSend(
        string SMTPServerName, 
        string ToEmail, 
        string FromEmail, 
        string Subject, 
        string Body, 
        MailFormat BodyFormat) 
    {
        EnhancedMailMessage msg = new EnhancedMailMessage();

        msg.From = FromEmail;
        msg.To = ToEmail;
        msg.Subject = Subject;
        msg.Body = Body;
        msg.BodyFormat = BodyFormat;

        msg.SMTPServerName = SMTPServerName;
        msg.Send();
    }
}

As you can see from the code above, you can send emails using SMTP servers that require authentication. Here is a sample usage code:

EnhancedMailMessage msg = new EnhancedMailMessage();

msg.From = "from.email@domain.com";
msg.FromName = "From display name";
msg.To = "to.email@domain.com";
msg.Subject = "Subject";
msg.Body = "Body";

msg.SMTPServerName = "smtp.server.com";
msg.SMTPUserName = "username";
msg.SMTPUserPassword = "password";

msg.Send();

There are SMTP servers that require SSL. One very well known example is Gmail. In order to send emails using the Gmail SMTP server, you need to specify that and also set the correct port. The following example can be used to send emails using the Gmail SMTP:

EnhancedMailMessage msg = new EnhancedMailMessage();

msg.From = "your.address@gmail.com";
msg.FromName = "Your name";
msg.To = "to.email@domain.com";
msg.Subject = "Test email from gmail";
msg.Body = "Gmail is great";

msg.SMTPServerName = "smtp.gmail.com";
msg.SMTPUserName = "your.address@gmail.com";
msg.SMTPUserPassword = "yourpassword";
msg.SMTPServerPort = 465;
msg.SMTPSSL = true;

msg.Send();

Also, you can send emails using just one line of code:

EnhancedMailMessage.QuickSend("smtp.server.com", 
    "to.email@domain.com", 
    "from.email@domain.com",
    "Subject",
    "Body",
    MailFormat.Html);

Conclusion

Complex things can be done using simple .NET Framework classes. I will explain more things about email sending in one of my next articles.

History

  • 27 Feb 2006 - first draft of the article.
  • 28 Feb 2006 - created a wrapper class for all the code, and created properties.
  • 01 Mar 2006 - more comments in the class, performance and coding style improvements.
  • 16 Mar 2006 - added support for SMTP servers that require SSL.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Florentin BADEA
Web Developer
Romania Romania
I am a software developer from Bucharest, Romania. I am the founder of Outside Software Inc., a software company that offers outsourcing services to partners all over the world.

If you want to help me improve the quality of my articles, Click here to take a survey now. Create your own online surveys using eSurveysPro.

Outside Software Inc. recently launched v1.6 of our charting control. If you need ASP.NET Charts or Windows Forms .NET Charts, then ChartingControl.NET is for you.

Other products: html to pdf converter. If you need a library that can convert from html to pdf, then ExpertPDF HtmlToPdf Converter is for you.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Questionmsg.From vs smtpUserNamememberMember 434388810-Mar-11 11:40 
QuestionHow to send Mail AttachmentsmemberAnirudha_baba1-Nov-10 23:12 
GeneralMy vote of 2membersoheilabm2-Jul-10 22:01 
Generalsending mail...if it happened pls let me seememberBEDEK334-Mar-10 10:56 
GeneralError tracingmemberRiverNet5-Dec-09 8:08 
GeneralGood Good...Thanks.!!!memberki mu park7-Aug-09 23:01 
GeneralMail with Voting Buttonsmember.NET Follower10-Mar-09 3:36 
QuestionSending mails to external domains from the internal exchange servermemberzuellah2-Mar-08 22:36 
GeneralProblem with sample mailmemberparvu200413-Feb-08 1:49 
GeneralProblem with MailFormat.Htmlmembervccsee7-Oct-07 21:57 
Questionhow to add voting buttons to the mail ...membertechpali10-Jul-07 0:49 
Questionhow do I know my email has been sentmemberDongMT28-Jun-07 17:00 
Generalpleaseeeee helppp:(:(memberMuruvet Kaplan17-May-07 5:04 
I need the send mail c# source code in smtp. Do yo know it??
please help me Frown | :( (Frown | :(
 
mkn

Questionwhy the mail is going to BulkMail box?memberkirrik8-Feb-07 21:27 
GeneralE-mail with attachmentsmemberFredy9927-Nov-06 6:48 
GeneralRe: E-mail with attachmentsmemberrbcardona27-Jun-07 7:37 
GeneralRe: E-mail with attachmentsmemberimresoft17-Nov-09 10:04 
QuestionThanks But How attachment work ...?memberaniya200010-Jul-06 23:58 
JokeThanks!memberHareth16-May-06 22:59 
GeneralhhhaaaaaaaaaaaamemberBasdub3-May-06 10:46 
GeneralExceptionmember_BlackLine_2-Apr-06 3:20 
AnswerRe: ExceptionmemberFlorentin BADEA2-Apr-06 8:51 
Question.NET 2.0 Update?memberwconnors21-Mar-06 22:16 
AnswerRe: .NET 2.0 Update?memberNickHD10-Jul-06 1:11 
GeneralRe: .NET 2.0 Update?memberscozzard28-Sep-06 15:50 
GeneralGood jobmemberMircea Puiu16-Mar-06 4:37 
Questionexception here..help plzmembercoolshad15-Mar-06 15:42 
AnswerRe: exception here..help plzmemberFlorentin BADEA15-Mar-06 22:12 
Questionthank u very much..its workingmembercoolshad18-Mar-06 2:35 
GeneralRe: thank u very much..its workingmemberahmed_anter29-Oct-07 4:32 
GeneralThanks for this !memberBillWoodruff8-Mar-06 15:39 
GeneralRe: Thanks for this !memberFlorentin BADEA8-Mar-06 20:47 
GeneralHelpful in sending internal e-mailsmemberJoel S.8-Mar-06 8:28 
GeneralRe: Helpful in sending internal e-mailsmemberFlorentin BADEA9-Mar-06 3:39 
QuestionSame Thing in VB .NET ?memberMehdiAnis7-Mar-06 4:25 
AnswerRe: Same Thing in VB .NET ?memberFlorentin BADEA7-Mar-06 5:39 
AnswerRe: Same Thing in VB .NET ?memberMehdiAnis7-Mar-06 9:51 
GeneralRe: Same Thing in VB .NET ?memberFlorentin BADEA7-Mar-06 10:51 
AnswerRe: Same Thing in VB .NET ?memberAnders Dalvander15-Mar-06 22:15 
GeneralRe: Same Thing in VB .NET ?memberjimpar20-Mar-06 11:19 
GeneralFunnymembersoimu28-Feb-06 5:32 
GeneralRe: FunnymemberFlorentin BADEA28-Feb-06 7:50 
GeneralRe: Funnymembersoimu28-Feb-06 12:46 
GeneralRe: FunnymemberFlorentin BADEA28-Feb-06 22:04 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130617.1 | Last Updated 16 Mar 2006
Article Copyright 2006 by Florentin BADEA
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid