Introduction
Most independent developers like to include a message sending feature in their application. Well atleast I tried to... Of course it is not a problem for a user with a SMTP server access or a registered domain with a SMTP server access. But unfortunately I had neither of those. I use MSN, GMail and Yahoo for my mailing needs. Unfortunately Yahoo does not offer SMTP or POP access for its general/basic/free users. And MSN is not that reliable because I was expecting a lot of mails to be sent and received and as far as I know, they do not give you POP/SMTP access!
Typical Example You Will Find On the Internet
So I really hunted for a code segment that will help me use my free GMail account to send E-mail from my .NET account. Here is a complete reference library and FAQs regarding the System.Web.Mail
namespace. And my code is basically different pieces joined together. Finally I met with success. Normally you will find thousands of sites offering the code below which has very little use, like:
MailMessage mail = new MailMessage();
mail.To = "xxxx@mailserver.com";
mail.Bcc = "yyyy@mailserver.com; user3@mailserver.net";
mail.From = "your email or name";
mail.Subject = "your subject";
mail.Body = "your subject";
SmtpMail.SmtpServer = "10.4.1.2";
SmtpMail.Send(mail);
Well most SMTP servers require authentication and sometimes SSL connection, so what then? The code above is USELESS. What are the things you need to add? There you go.
How to Use
Copy the above methods and paste in the Visual Studio IDE or any text editor you use. Add a reference to System.Web or System.Web.Mail DLL, change your account info like your mail address, password, etc. and enjoy.
Explanation of the Code
So what is happening in the example? Let's see:
Step 1: Create a mail msg object and assign the basic parts like From, To, Cc, Bcc, Subject, Body.
Step 2: Add some config settings in fields collection of the mailMessage
object. The type of authentication we use is basic authentication and your user name, password, SMTP servers, port number that you will be using. For example: GMail username requires the full GMail address as username and you can use /connect to any of the ports.
mailMsg.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
mailMsg.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/sendusername", "myemail@gmail.com");
mailMsg.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/sendpassword", "mypassword");
mailMsg.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");
Step 3: This is the coolest and most important part that I spent a lot of time to discover.
mailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");
This line says/declares that your SMTP server requires SSL connection which is very much true/necessary for accessing to GMail's SMTP server.
Step 4: Assign the SMTP server name in System.Web.Mail.SmtpMail
class's SMTP server object like:
SmtpMail.SmtpServer = "smtp.gmail.com";
You can also set the priority of your mail by:
mailMsg.Priority = MailPriority.High;
Step 5: Call the send
method of System.Web.Mail.SmtpMail
. For example:
System.Web.Mail.SmtpMail.Send(myMailMsg);
.NET 2.0 Version
Some changes are required for .NET v2.0 as .NET 2.0 Mail is more organised and stable and has many extra features. So in the update, I am including .NET 2.0 version of my code.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.Threading;
namespace SendMailUsingGmail
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static bool mailSent = false;
public void SendMail()
{
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
msg.To.Add("reciver@gmail.com");
msg.To.Add("another.reciver@yahoo.com");
msg.From = new MailAddress(dummy@gmail.com,
"One Ghost",System.Text.Encoding.UTF8);
msg.Subject = "Test mail using .net2.0";
msg.SubjectEncoding = System.Text.Encoding.UTF8;
msg.Body = "This is my msg Body";
msg.BodyEncoding = System.Text.Encoding.UTF8;
msg.IsBodyHtml = false;
msg.Priority = MailPriority.High;
SmtpClient client = new SmtpClient();
client.Credentials = new System.Net.NetworkCredential
("dummy@gmail.com", "SecretPass");
client.Port = 587;
client.Host = "smtp.gmail.com";
client.EnableSsl = true;
client.SendCompleted += new SendCompletedEventHandler
(client_SendCompleted);
object userState=msg;
try
{
client.SendAsync(msg, userState);
}
catch (System.Net.Mail.SmtpException ex)
{
MessageBox.Show(ex.Message, "Send Mail Error");
}
}
void client_SendCompleted(object sender, AsyncCompletedEventArgs e)
{
MailMessage mail = (MailMessage)e.UserState;
string subject = mail.Subject;
if (e.Cancelled)
{
string cancelled = string.Format("[{0}] Send canceled.", subject);
MessageBox.Show(cancelled);
}
if (e.Error != null)
{
string error = String.Format("[{0}] {1}", subject, e.Error.ToString());
MessageBox.Show(error);
}
else
{
MessageBox.Show("Message sent.");
}
mailSent = true;
}
private void button1_Click(object sender, EventArgs e)
{
this.SendMail();
}
}
}
Limitation of this Code
This code may/may not work with .NET Framework v1.0 because the MailMessage
object of .NETv1.0 does not have the MailMessage.Fields
Collection. This was added in .NETv1.1. So it works fine with .NETv1.1 and v2.0.
Conclusion
The send
method does not return anything. But you can add some mechanism (like a counter) to keep track of send
message or even keep the return type of your method as a mailmessage
type so that you can save to database for security reasons.
The reason I could not provide a complete send
and receive
example is because I am very busy with my thesis project. But I also wanted to publish the code sample on The Code Project as someone may find it helpful. I will publish a complete article about sending and receiving mail using GMail account from your Gmail account.
Future Upgrade Plan
I am planning to upload another complete article for both sending and receiving E-mail from GMail account from a single application with the complete source code. I need some feedback about which to choose, ASP.NET code or Windows programming sample or both? Moreover, I am going to add some config file to dynamically change mail settings like sender mail account, SMTP server name, default port number and priority, etc. Please send feedback to moshiur.m@gmail.com.
public string sendMail (string from, string to, string cc,
string bcc, string subject, string body) {
MailMessage mailMsg = new MailMessage();
mailMsg.From = from;
mailMsg.To = to;
mailMsg.Cc = cc;
mailMsg.Bcc = bcc;
mailMsg.Subject = subject;
mailMsg.BodyFormat = MailFormat.Text;
mailMsg.Body = body;
mailMsg.Priority = MailPriority.High;
SmtpMail.SmtpServer = "smtp.gmail.com";
mailMsg.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
mailMsg.Fields.Add(http:
"myemail@gmail.com");
mailMsg.Fields.Add(http:
"mypassword");
mailMsg.Fields.Add
(http:
mailMsg.Fields.Add
("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");
try
{
SmtpMail.Send(mailMsg);
return "";
}
catch (Exception ex)
{
return ex.Message;
}
}