Sending emails is a common requirement in ASP.NET Core web applications. In this article we will learn how to send emails with attachments using a popular and open source component - MailKit. Let's get going.
Step 1 : Add MailKit NuGet package to ASP.NET Core project
MailKit is available as a NuGet package. Right click on your ASP.NET Core project and click on Manage NuGet packages. Then search for MailKit.
Then add the following imports in code (it could be either a controller code or any standalone class).
using MailKit.Net.Smtp;
using MimeKit;
Step 2 : Prepare an email message to be sent
Now that you have added MailKit to your ASP.NET Core project, it's time to build the email message that we want to send. An email message consists of several things such as from addresses, to address, message body and so on. Let's begin by adding from address, to address, subject, and message boxy.
A message is represented by MimeMessage class. The following code how the MimeMessage can be configured.
MimeMessage message = new MimeMessage();
MailboxAddress from = new MailboxAddress("Admin",
"admin@example.com");
message.From.Add(from);
MailboxAddress to = new MailboxAddress("User",
"user@example.com");
message.To.Add(to);
message.Subject = "This is email subject";
The above code creates in instance of MimeMessage, a class that represents an email message. It also uses MailboxAddress class to build a from address and a to address. The first parameter to MailboxAddress constructor is the display name of an email address whereas the second parameter is the email address itself. You should change them as per your setup.
The Subject property indicates the email subject.
Step 3 : Add email body and file attachments
Next, we need to set the message body and optionally add email attachments. The following code shows how this can be done:
BodyBuilder bodyBuilder = new BodyBuilder();
bodyBuilder.HtmlBody = "<h1>Hello World!</h1>";
bodyBuilder.TextBody = "Hello World!";
As you can see, we make use of BodyBuilder class. It has two properties namely HtmlBody and TextBox that hold the email's HTML version and text version respectively.
To attach one or more files to our message we need their physical file system paths. Instead of hard-coding the paths we will compute them using IHostingEnvironment object as shown below:
IHostingEnvironment env = null;
public HomeController(IHostingEnvironment env)
{
this.env = env;
}
bodyBuilder.Attachments.Add(env.WebRootPath + "\\file.png");
As you can see, we wish to attach file.png to our message that resides under wwwroot. So, we injected an IHostingEnvironment object and use it's WebRootPath property to get the physical path. Then we add the file to Attachments collection of the BodyBuilder object we created earlier.
Once the BodyBuilder is ready we can generate a MimeMessage body from it as follows:
message.Body = bodyBuilder.ToMessageBody();
The ToMessageBody() method creates a message body with HTML/Text content and attachments.
Step 4 : Connect and authenticate with the SMTP server
In order to send the email message we just created we need to connect with an SMTP server. In most of the cases you will also need security credentials to connect with the server. The following code shows how connection can be established with an SMTP server.
SmtpClient client = new SmtpClient();
client.Connect("smtp_address_here", port_here, true);
client.Authenticate("user_name_here", "pwd_here");
Here, we created an instance of SmtpClient class that represents a client to an SMTP server. We call its Connect() method and pass the SMTP server address and SMTP port. Use these settings as per your environment. The third Boolean parameter indicates whether the connection requires SSL or not.
We then proceed to call Authenticate() method that authenticates a user account with the SMTP server. The Authenticate() method accepts a user name and a password as its parameters. Change these values to suit your environment.
Step 5 : Send email message
After configuring the SMTP server connection we can now send a message and then disconnect from the server.
client.Send(message);
client.Disconnect(true);
client.Dispose();
The Send() message accepts an MimeMessage as a parameter and attempts to send that message. Once a message has been sent, we can disconnect from the server using Disconnect() method. The Boolean parameter to Disconnect() indicates that we want to issue QUIT command to the server. Finally, we Displose() the SmtpClient object.
Resource: binaryintellect.net
The Tech Platform
Bình luận