Trong bài viết này, mình sẽ hướng dẫn các bạn sử dụng MailGun để gửi email bằng cả 2 cách: SMTP và API
MailGun là gì?
Mailgun Technologies, Inc. là một dịch vụ gửi email để gửi, nhận và theo dõi email.
Các dịch vụ tương tự khác: SendGrid, Sendinblue, MailerSend, ...
MailGun hỗ trợ 2 hình thức gởi email: smtp và Mail API
SMTP
SMTP (Simple Mail Transfer Protocol) là giao thức chuẩn TCP/IP được dùng để truyền tải thư điện tử (e-mail) trên mạng internet.
SMTP là giao thức tiêu chuẩn để gửi email. Nó thiết lập kênh kết nối giữa mail client và mail server, và thiết lập kênh liên lạc giữa mail server gửi và mail server nhận. Email sẽ được đẩy từ mail client lên mail server và từ mail server nó sẽ được server này gửi đi đến mail server nhận.
Các cổng kết nối:
- 25: Port 25 được dùng từ năm 1982, đây là port lâu đời nhất và thường bị chặn vì lý do spam email
- 587: cổng mặc định để gửi SMTP trên web hiện nay
- 465: cổng 465 hiện là cổng được khuyến nghị để gửi qua TLS.
- 2525: Cổng 2525 không phải là cổng SMTP chính thức (được IETF hoặc IANA công nhận). Tuy nhiên, nó vẫn được sử dụng phổ biến như một sự thay thế cho cổng 587 để gửi SMTP và hầu hết các ISP và nhà cung cấp dịch vụ lưu trữ đám mây đều hỗ trợ cổng 2525 cho SMTP.
Nếu cổng 587 bị chặn, cổng 2525 là một giải pháp thay thế khác.
Để gửi email bằng SMTP, bạn có thể sử dụng 1 email provider như Gmail, Yahoo, Outlook hoặc 1 email service. Hiện tại mình thấy chỉ có Outlook cho phép kết nối từ WebServer và cho phép gởi SMTP. Các provider khác cần yêu cầu xác thực 2 bước. Mình sử dụng MailGun để demo.
Đầu tiên, bạn cần đăng nhập vào MailGun, nhấp vào Sending -> Overview
Sau đó bạn chọn SMTP. Bên dưới là thông tin SMTP, bao gồm: hostname, port, username, password. Bạn sẽ sử dụng các thông tin này để đăng nhập và gởi email.
Xác thực SMTP
Xác thực SMTP (SMTP Authentication hoặc SMTP AUTH), là một phần mở rộng của SMTP. Theo đó, các client (có thể hiểu là những phần mềm sử dụng email hoặc là chương trình mà bạn tự viết) có thể đăng nhập bằng cơ chế xác thực được SMTP server hỗ trợ
SmtpClient SmtpServer = new SmtpClient("<SMTP hostname>");//smtp.mailgun.org, smtp.gmail.com, smtp-mail.outlook.com
SmtpServer.Port = 587;//465,25
SmtpServer.Credentials = new System.Net.NetworkCredential("<your-email>", "<your-password>");
Dưới đây là đoạn code sử dụng thư viện System.Net.Mail
public class MailGunSmtp
{
private static readonly string _from = "<your-email";
private static readonly string _pass = "<your-password>";
public static string Send(string sendto, string subject, string content)
{
try
{
var mail = new MailMessage();
var SmtpServer = new SmtpClient("<SMTP hostname>");
mail.From = new MailAddress(_from);
mail.To.Add(sendto);
mail.Subject = subject;
mail.IsBodyHtml = true;
mail.Body = content;
mail.Priority = MailPriority.High;
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential(_from, _pass);
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
return "OK";
}
catch (Exception ex)
{
return ex.ToString();
}
}
}
MailKit
Để project có thể chạy được trên môi trường .NET (hỗ trợ Windows, Linux, Mac), bạn nên sử dụng thư viện khác. Trong trường hợp này, mình sử dụng thư viện MailKit
Github: https://github.com/jstedfast/MailKit
Install nuget package:
Install-Package MailKit
Khai báo static class để lưu giữ thông tin đăng nhập server
/// Using a static class to store sensitive credentials
/// for simplicity. Ideally these should be stored in
/// configuration files
public static class Constants
{
public static string SenderName => "Nhatkyhoctap";
public static string SenderEmail => "<your-email";
public static string EmailPassword => "<your-password>";
public static string SmtpHost => "smtp.mailgun.org";
public static int SmtpPort => 587;
}
Setup IEmailSender
public interface IEmailSender
{
Task SendEmailAsync(string recipientEmail, string subject, string message)
}
Implement interface IMailService
public class MailKitService : IEmailSender
{
public Task SendEmailAsync(string recipientEmail, string subject, string message)
{
var mimeMessage = new MimeMessage();
mimeMessage.From.Add(new MailboxAddress(Constants.SenderName, Constants.SenderEmail));
mimeMessage.To.Add(new MailboxAddress("", recipientEmail));
mimeMessage.Subject = subject;
mimeMessage.Body = new TextPart(TextFormat.Html)
{
Text = message,
};
using (var client = new SmtpClient())
{
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect(Constants.SmtpHost, Constants.SmtpPort, false);
client.AuthenticationMechanisms.Remove("XOAUTH2");
// Note: only needed if the SMTP server requires authentication
client.Authenticate(Constants.SenderEmail, Constants.EmailPassword);
client.Send(mimeMessage);
client.Disconnect(true);
return Task.FromResult(0);
}
}
}
Mail API
Gửi email bằng C # qua API Mailgun nhanh hơn khoảng 3 lần so với thông qua SMTP.
Cài đặt nuget package:
RestSharp.Authenticators
Trên trang web Overview của MailGun, chọn API mà bạn cần phải thêm email vào list để đảm bảo email sẽ được gửi đi.
Copy code C#. Lần lượt thay thế thông tin tương ứng từ (3) sang (4)static IRestResponse SendSimpleMessage()
{
RestClient client = new RestClient();
client.BaseUrl = new Uri("https://api.mailgun.net/v3");
client.Authenticator = new HttpBasicAuthenticator("api","https://api.mailgun.net/v3",
"<API Key>");
RestRequest request = new RestRequest();
request.AddParameter("domain", "<Domain name>", ParameterType.UrlSegment);
request.Resource = "{domain}/messages";
request.AddParameter("from", "<your-email-from");
request.AddParameter("to", "<your-email-to");
request.AddParameter("subject", "MailGun test api");
request.AddParameter("text", "Testing some Mailgun awesomness!");
request.Method = Method.POST;
return client.Execute(request);
}
Hi vọng với bài viết nhỏ này, các bạn sẽ có thể gửi được email dễ dàng
Nhận xét
Đăng nhận xét