Gunakan Klien SMTP untuk Mengirim Email, Meneruskan Pesan & Melakukan Mail Merge di C#
Mengirim Email
Kirim Email dengan Kelas SmtpClient
The SmtpClient kelas memungkinkan aplikasi mengirim email melalui Simple Mail Transfer Protocol (SMTP).
Salah satu fitur utamanya adalah kemampuan untuk mengirim pesan secara massal.
Ini juga sepenuhnya mendukung sinkron dan asinkron model pemrograman. Untuk mengirim email yang memblokir thread utama sampai operasi selesai, pengembang dapat menggunakan salah satu cara sinkron Kirim metode. Sebagai alternatif, untuk memungkinkan thread utama terus berjalan saat email sedang dikirim, pengembang dapat menggunakan SendAsync metode.
Selain itu, SmtpClient mendukung pengiriman pesan dalam Transport Neutral Encapsulation Format (TNEF).
Kirim Email Secara Sinkron
Pesan email dapat dikirim secara sinkron menggunakan Kirim metode dari SmtpClient kelas. Ia mengirim pesan email yang ditentukan melalui server SMTP untuk pengiriman. Untuk mengirim pesan email secara sinkron, ikuti langkah-langkah berikut:
- Buat sebuah instance dari MailMessage kelas dan atur propertinya.
- Buat sebuah instance dari SmtpClient kelas dan tentukan Host, port, nama pengguna & Kata Sandi.
- Kirim Pesan menggunakan Kirim metode dari SmtpClient kelas dan melewatkan MailMessage instance.
Potongan kode C# berikut menunjukkan cara mengirim email outlook secara sinkron.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Declare msg as MailMessage instance
MailMessage msg = new MailMessage();
// Create an instance of SmtpClient class
SmtpClient client = new SmtpClient();
// Specify your mailing host server, Username, Password, Port # and Security option
client.Host = "mail.server.com";
client.Username = "username";
client.Password = "password";
client.Port = 587;
client.SecurityOptions = SecurityOptions.SSLExplicit;
try
{
// Client.Send will send this message
client.Send(msg);
Console.WriteLine("Message sent");
}
catch (Exception ex)
{
Trace.WriteLine(ex.ToString());
}
Kirim Email secara Asinkron
Kadang-kadang, Anda mungkin ingin mengirim email secara asinkron agar program dapat melanjutkan operasi lain sementara email dikirim di latar belakang. Mulai .NET Framework 4.5, Anda dapat menggunakan metode asinkron yang diimplementasikan sesuai TAP model. Potongan kode C# di bawah ini menunjukkan cara mengirim pesan email Outlook menggunakan metode berbasis pola asinkron tugas:
-
SendAsync Mengirim pesan yang ditentukan.
-
IAsyncSmtpClient - Memungkinkan aplikasi mengirim pesan dengan menggunakan Simple Mail Transfer Protocol (SMTP).
-
SmtpClient.CreateAsync - Membuat instance baru dari kelas Aspose.Email.Clients.Smtp.SmtpClient
-
SmtpSend - Set parameter metode Aspose.Email.Clients.Smtp.IAsyncSmtpClient.SendAsync(Aspose.Email.Clients.Smtp.Models.SmtpSend).
-
SmtpForward - Argumen Aspose.Email.Clients.Smtp.IAsyncSmtpClient.ForwardAsync(Aspose.Email.Clients.Smtp.Models.SmtpForward).
// Authenticate the client to obtain necessary permissions
static readonly string tenantId = "YOU_TENANT_ID";
static readonly string clientId = "YOU_CLIENT_ID";
static readonly string redirectUri = "http://localhost";
static readonly string username = "username";
static readonly string[] scopes = { "https://outlook.office.com/SMTP.Send" };
// Use the SmtpAsync method for asynchronous operations
static async Task Main(string[] args)
{
await SmtpAsync();
Console.ReadLine();
}
static async Task SmtpAsync()
{
// Create token provider and get access token
var tokenProvider = new TokenProvider(clientId, tenantId, redirectUri, scopes);
var client = SmtpClient.CreateAsync("outlook.office365.com", username, tokenProvider, 587).GetAwaiter().GetResult();
// Create a message to send
var eml = new MailMessage("from@domain.com", "to@domain.com", "test subj async", "test body async");
// send message
var sendOptions = SmtpSend.Create();
sendOptions.AddMessage(eml);
await client.SendAsync(sendOptions);
Console.WriteLine("message was sent");
// forward message
var fwdOptions = SmtpForward.Create();
fwdOptions.SetMessage(eml);
fwdOptions.AddRecipient("rec@domain.com");
await client.ForwardAsync(fwdOptions);
Console.WriteLine("message was forwarded");
}
// Token provider implementation
public class TokenProvider : IAsyncTokenProvider
{
private readonly PublicClientApplicationOptions _pcaOptions;
private readonly string[] _scopes;
public TokenProvider(string clientId, string tenantId, string redirectUri, string[] scopes)
{
_pcaOptions = new PublicClientApplicationOptions
{
ClientId = clientId,
TenantId = tenantId,
RedirectUri = redirectUri
};
_scopes = scopes;
}
public async Task<OAuthToken> GetAccessTokenAsync(bool ignoreExistingToken = false, CancellationToken cancellationToken = default)
{
var pca = PublicClientApplicationBuilder
.CreateWithApplicationOptions(_pcaOptions).Build();
try
{
var result = await pca.AcquireTokenInteractive(_scopes)
.WithUseEmbeddedWebView(false)
.ExecuteAsync(cancellationToken);
return new OAuthToken(result.AccessToken);
}
catch (MsalException ex)
{
Console.WriteLine($"Error acquiring access token: {ex}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex}");
}
return null;
}
public void Dispose()
{
}
}
Kirim Pesan dari Disk
File EML berisi header, body pesan, dan lampiran. Aspose.Email memungkinkan pengembang bekerja dengan file EML dalam berbagai cara. Bagian ini menunjukkan cara memuat file EML dari disk dan mengirimnya sebagai email dengan SMTP. Anda dapat memuat file .eml dari disk atau stream ke dalam MailMessage kelas dan mengirim pesan email menggunakan SmtpClient kelas. The MailMessage kelas adalah kelas utama untuk membuat pesan email baru, memuat file pesan email dari disk atau stream, dan menyimpan pesan. Potongan kode C# berikut menunjukkan cara mengirim pesan yang disimpan dari disk.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Load an EML file in MailMessage class
var message = MailMessage.Load(dataDir + "test.eml");
// Send this message using SmtpClient
var client = new SmtpClient("host", "username", "password");
try
{
client.Send(message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Kirim Email dalam Teks Biasa
The Body properti, properti dari MailMessage kelas, digunakan untuk menentukan konten teks biasa dari isi pesan. Untuk mengirim pesan email teks biasa, ikuti langkah-langkah berikut:
- Buat sebuah instansi dari MailMessage kelas.
- Tentukan alamat email pengirim dan penerima dalam MailMessage instance.
- Tentukan Body konten, digunakan untuk pesan teks biasa.
- Buat sebuah instansi dari SmtpClient kelas dan mengirim email.
Potongan kode berikut menunjukkan cara mengirim email teks biasa.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
//Create an instance of the MailMessage class
var message = new MailMessage();
// Set From field, To field and Plain text body
message.From = "sender@sender.com";
message.To.Add("receiver@receiver.com");
message.Body = "This is Plain Text Body";
// Create an instance of the SmtpClient class
var client = new SmtpClient();
// And Specify your mailing host server, Username, Password and Port
client.Host = "smtp.server.com";
client.Username = "Username";
client.Password = "Password";
client.Port = 25;
try
{
//Client.Send will send this message
client.Send(message);
Console.WriteLine("Message sent");
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
}
Kirim Email dengan Body HTML
Contoh pemrograman di bawah ini menunjukkan cara Anda dapat mengirim pesan email HTML sederhana. HtmlBody, properti dari MailMessage kelas, digunakan untuk menentukan konten HTML dari isi pesan. Untuk mengirim email HTML sederhana, ikuti langkah-langkah berikut:
- Buat sebuah instansi dari MailMessage kelas.
- Tentukan alamat email pengirim dan penerima dalam MailMessage instance.
- Tentukan HtmlBody konten.
- Buat sebuah instansi dari SmtpClient kelas dan mengirim email menggunakan Kirim metode.
Untuk keperluan artikel ini, konten HTML email bersifat sederhana:
This is the HTML body Kebanyakan email HTML akan lebih kompleks. Potongan kode berikut menunjukkan cara mengirim email dengan body HTML.// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public static void Run()
{
// Declare msg as MailMessage instance
var msg = new MailMessage();
// Use MailMessage properties like specify sender, recipient, message and HtmlBody
msg.From = "newcustomeronnet@gmail.com";
msg.To = "asposetest123@gmail.com";
msg.Subject = "Test subject";
msg.HtmlBody = "<html><body>This is the HTML body</body></html>";
var client = GetSmtpClient();
try
{
// Client will send this message
client.Send(msg);
Console.WriteLine("Message sent");
}
catch (Exception ex)
{
Trace.WriteLine(ex.ToString());
}
Console.WriteLine(Environment.NewLine + "Email sent with HTML body.");
}
private static SmtpClient GetSmtpClient()
{
var client = new SmtpClient("smtp.gmail.com", 587, "your.email@gmail.com", "your.password");
client.SecurityOptions = SecurityOptions.Auto;
return client;
}
Kirim Email HTML dengan Teks Alternatif
Gunakan AlternateView kelas untuk menentukan salinan pesan email dalam format yang berbeda. Misalnya, jika Anda mengirim pesan dalam HTML, Anda mungkin juga ingin menyediakan versi teks biasa untuk penerima yang menggunakan pembaca email yang tidak dapat menampilkan konten HTML. Atau, jika Anda mengirim buletin, Anda mungkin ingin menyediakan salinan teks biasa untuk penerima yang memilih menerima versi teks biasa. Untuk mengirim email dengan teks alternatif, ikuti langkah-langkah berikut:
- Buat sebuah instansi dari MailMessage kelas.
- Tentukan alamat email pengirim dan penerima dalam MailMessage instance.
- Buat sebuah instansi dari AlternateView kelas.
Ini membuat tampilan alternatif untuk pesan email menggunakan konten yang ditentukan dalam string.
- Tambahkan instansi dari AlternateView kelas ke MailMessage objek.
- Buat sebuah instansi dari SmtpClient kelas dan mengirim email menggunakan Kirim metode.
Potongan kode berikut menunjukkan cara mengirim email dengan teks alternatif.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Declare message as MailMessage instance
var message = new MailMessage();
// Creates AlternateView to view an email message using the content specified in the //string
var alternate = AlternateView.CreateAlternateViewFromString("Alternate Text");
// Adding alternate text
message.AlternateViews.Add(alternate);
Kirim Email Massal
Kita dapat mengirim sekumpulan email menggunakan SmtpClient kelas dari Kirim overload metode yang menerima sebuah MailMessageCollection:
- Buat sebuah instance dari SmtpClient kelas.
- Tentukan SmtpClient properti kelas.
- Buat sebuah instansi dari MailMessage kelas.
- Tentukan pengirim, penerima, subjek email, dan pesan dalam instansi dari MailMessage kelas.
- Ulangi dua langkah di atas lagi, jika Anda ingin mengirim email ke orang lain.
- Buat sebuah instance dari MailMessageCollection kelas.
- Tambahkan sebuah instansi dari MailMessage kelas dalam objek dari MailMessageCollection kelas.
- Sekarang kirim email Anda menggunakan SmtpClient kelas Kirim metode dengan melewatkan instansi dari MailMessageCollection kelas di dalamnya.
Potongan kode berikut menunjukkan cara mengirim email massal.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create SmtpClient as client and specify server, port, user name and password
var client = new SmtpClient("mail.server.com", 25, "Username", "Password");
// Create instances of MailMessage class and Specify To, From, Subject and Message
var message1 = new MailMessage("msg1@from.com", "msg1@to.com", "Subject1", "message1, how are you?");
var message2 = new MailMessage("msg1@from.com", "msg2@to.com", "Subject2", "message2, how are you?");
var message3 = new MailMessage("msg1@from.com", "msg3@to.com", "Subject3", "message3, how are you?");
// Create an instance of MailMessageCollection class
var manyMsg = new MailMessageCollection();
manyMsg.Add(message1);
manyMsg.Add(message2);
manyMsg.Add(message3);
try
{
// Send Messages using Send method
client.Send(manyMsg);
Console.WriteLine("Message sent");
}
catch (Exception ex)
{
Trace.WriteLine(ex.ToString());
}
Lacak Keberhasilan Email Massal
Saat Anda mengirim pesan secara massal, Anda dapat memperoleh informasi tentang jumlah pesan yang berhasil dikirim dan bahkan mendapatkan daftar pesan tersebut. SucceededSending event untuk tujuan ini.
Contoh kode:
using (var client = new SmtpClient(host, SecurityOptions.Auto))
{
int messageCount = 0;
client.SucceededSending += (sender, eventArgs) =>
{
Console.WriteLine("The message '{0}' was successfully sent.", eventArgs.Message.Subject);
messageCount++;
};
client.Send(messages);
Console.WriteLine("{0} messages were successfully sent.", messageCount);
}
Kirim Email dengan MultiConnection
The UseMultiConnection properti dapat digunakan untuk membuat beberapa koneksi bagi operasi berat. Anda juga dapat mengatur jumlah koneksi yang akan digunakan selama mode multikoneksi dengan menggunakan SmtpClient.ConnectionsQuantity. Potongan kode berikut menunjukkan penggunaan mode multikoneksi untuk mengirim beberapa pesan.
var smtpClient = new SmtpClient();
smtpClient.Host = "<HOST>";
smtpClient.Username = "<USERNAME>";
smtpClient.Password = "<PASSWORD>";
smtpClient.Port = 587;
smtpClient.SupportedEncryption = EncryptionProtocols.Tls;
smtpClient.SecurityOptions = SecurityOptions.SSLExplicit;
var messages = new List<MailMessage>();
for (int i = 0; i < 20; i++)
{
MailMessage message = new MailMessage(
"<EMAIL ADDRESS>",
"<EMAIL ADDRESS>",
"Test Message - " + Guid.NewGuid().ToString(),
"SMTP Send Messages with MultiConnection");
messages.Add(message);
}
smtpClient.ConnectionsQuantity = 5;
smtpClient.UseMultiConnection = MultiConnectionMode.Enable;
smtpClient.Send(messages);
Kirim Pesan sebagai TNEF
Email TNEF memiliki format khusus yang mungkin hilang jika dikirim menggunakan API standar. SmtpClient kelas UseTnef properti dapat diatur untuk mengirim email sebagai TNEF. Potongan kode berikut menunjukkan cara mengirim pesan sebagai TNEF.
var emlFileName = RunExamples.GetDataDir_Email() + "Message.eml"; // A TNEF Email
// Load from eml
var eml1 = MailMessage.Load(emlFileName, new EmlLoadOptions());
eml1.From = "somename@gmail.com";
eml1.To.Clear();
eml1.To.Add(new MailAddress("first.last@test.com"));
eml1.Subject = "With PreserveTnef flag during loading";
eml1.Date = DateTime.Now;
var client = new SmtpClient("smtp.gmail.com", 587, "somename", "password");
client.SecurityOptions = SecurityOptions.Auto;
client.UseTnef = true; // Use this flag to send as TNEF
client.Send(eml1);
Kirim Permintaan Pertemuan
Aspose.Email memungkinkan pengembang menambahkan fungsi kalender ke email Anda.
Kirim Permintaan melalui Email
Untuk mengirim permintaan pertemuan via email, ikuti langkah-langkah berikut:
- Buat sebuah instansi dari MailMessage kelas.
- Tentukan alamat pengirim dan penerima menggunakan sebuah instance dari MailMessage kelas.
- Inisialisasi sebuah instance dari Appointment kelas dan berikan nilainya.
- Tentukan ringkasan dan deskripsi dalam Calendar instance.
- Tambahkan Calendar ke MailMessage instance dan meneruskannya Appointment instance.
|Permintaan pertemuan iCalendar yang dikirim via email| | :- | |
| Potongan kode berikut menunjukkan cara mengirim permintaan melalui Email.
// Create an instance of the MailMessage class
var msg = new MailMessage();
// Set the sender, recipient, who will receive the meeting request. Basically, the recipient is the same as the meeting attendees
msg.From = "newcustomeronnet@gmail.com";
msg.To = "person1@domain.com, person2@domain.com, person3@domain.com, asposetest123@gmail.com";
// Create Appointment instance
var app = new Appointment("Room 112", new DateTime(2015, 7, 17, 13, 0, 0), new DateTime(2015, 7, 17, 14, 0, 0), msg.From, msg.To);
app.Summary = "Release Meetting";
app.Description = "Discuss for the next release";
// Add appointment to the message and Create an instance of SmtpClient class
msg.AddAlternateView(app.RequestApointment());
var client = GetSmtpClient();
try
{
// Client.Send will send this message
client.Send(msg);
Console.WriteLine("Message sent");
}
catch (Exception ex)
{
Trace.WriteLine(ex.ToString());
}
Teruskan Pesan
Teruskan Pesan dengan Klien SMTP
Meneruskan email adalah praktik umum. Email yang diterima dapat diteruskan ke penerima tertentu. Teruskan metode dapat digunakan untuk meneruskan email yang diterima atau disimpan ke penerima yang diinginkan. Potongan kode berikut menunjukkan cara meneruskan email menggunakan Klien SMTP.
//Create an instance of SmtpClient class
var client = new SmtpClient();
// Specify your mailing host server, Username, Password, Port and SecurityOptions
client.Host = "mail.server.com";
client.Username = "username";
client.Password = "password";
client.Port = 587;
client.SecurityOptions = SecurityOptions.SSLExplicit;
var message = MailMessage.Load(dataDir + "Message.eml");
client.Forward("Recipient1@domain.com", "Recipient2@domain.com", message);
Teruskan Pesan tanpa MailMessage
API juga mendukung penerusan pesan EML tanpa harus memuatnya terlebih dahulu ke MailMessage. Ini berguna dalam kasus di mana sumber daya sistem terbatas dalam hal memori.
using (var client = new SmtpClient(host, smtpPort, username, password, SecurityOptions.Auto))
{
using (var fs = File.OpenRead(@"test.eml"))
{
client.Forward(sender, recipients, fs);
}
}
Teruskan Pesan secara Asinkron tanpa MailMessage
using (var client = new SmtpClient(host, smtpPort, username, password))
{
using (var fs = File.OpenRead(@"test.eml"))
{
await client.ForwardAsync(sender, recipients, fs);
}
}
Mail Merge
Cara Menggabungkan Email
Mail merge membantu Anda membuat dan mengirim sekumpulan pesan email serupa. Inti dari email tersebut sama, tetapi kontennya dapat dipersonalisasi. Biasanya, detail kontak penerima (nama depan, nama belakang, perusahaan, dll) digunakan untuk mempersonalisasi email.
|Ilustrasi cara kerja mail merge:| | :- | |
| Aspose.Email memungkinkan pengembang mengatur mail merge yang mencakup data dari berbagai sumber data.
Untuk melakukan mail merge dengan Aspose.Email, ikuti langkah-langkah berikut:
- Buat fungsi dengan tanda nama
- Buat sebuah instansi dari MailMessage kelas.
- Tentukan pengirim, penerima, subjek, dan isi.
- Buat tanda tangan untuk bagian akhir email.
- Buat sebuah instansi dari TemplateEngine kelas dan berikan kepadanya MailMessage instance.
- Ambil tanda tangan dalam TemplateEngine instance.
- Buat instance dari kelas DataTable.
- Tambahkan kolom Receipt, FirstName, dan LastName sebagai sumber data dalam kelas DataTable.
- Buat instance dari kelas DataRow.
- Tentukan alamat penerima, nama depan dan belakang dalam objek DataRow.
- Buat sebuah instansi dari MailMessageCollection kelas
- Tentukan TemplateEngine dan instance DataTable dalam MailMessageCollection instance.
- Buat sebuah instansi dari SmtpClient kelas dan tentukan server, port, nama pengguna, dan kata sandi.
- Kirim email menggunakan SmtpClient kelas Kirim metode.
Dalam contoh di bawah, #FirstName# menunjukkan kolom DataTable, yang nilainya ditetapkan oleh pengguna. Potongan kode berikut menunjukkan cara melakukan Mail Merge.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public static void Run()
{
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_SMTP();
string dstEmail = dataDir + "EmbeddedImage.msg";
// Create a new MailMessage instance
MailMessage msg = new MailMessage();
// Add subject and from address
msg.Subject = "Hello, #FirstName#";
msg.From = "sender@sender.com";
// Add email address to send email also Add mesage field to HTML body
msg.To.Add("your.email@gmail.com");
msg.HtmlBody = "Your message here";
msg.HtmlBody += "Thank you for your interest in <STRONG>Aspose.Email</STRONG>.";
// Use GetSignment as the template routine, which will provide the same signature
msg.HtmlBody += "<br><br>Have fun with it.<br><br>#GetSignature()#";
// Create a new TemplateEngine with the MSG message, Register GetSignature routine. It will be used in MSG.
TemplateEngine engine = new TemplateEngine(msg);
engine.RegisterRoutine("GetSignature", GetSignature);
// Create an instance of DataTable and Fill a DataTable as data source
DataTable dt = new DataTable();
dt.Columns.Add("Receipt", typeof(string));
dt.Columns.Add("FirstName", typeof(string));
dt.Columns.Add("LastName", typeof(string));
DataRow dr = dt.NewRow();
dr["Receipt"] = "abc<asposetest123@gmail.com>";
dr["FirstName"] = "a";
dr["LastName"] = "bc";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Receipt"] = "John<email.2@gmail.com>";
dr["FirstName"] = "John";
dr["LastName"] = "Doe";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Receipt"] = "Third Recipient<email.3@gmail.com>";
dr["FirstName"] = "Third";
dr["LastName"] = "Recipient";
dt.Rows.Add(dr);
MailMessageCollection messages;
try
{
// Create messages from the message and datasource.
messages = engine.Instantiate(dt);
// Create an instance of SmtpClient and specify server, port, username and password
SmtpClient client = new SmtpClient("smtp.gmail.com", 587, "your.email@gmail.com", "your.password");
client.SecurityOptions = SecurityOptions.Auto;
// Send messages in bulk
client.Send(messages);
}
catch (MailException ex)
{
Debug.WriteLine(ex.ToString());
}
catch (SmtpException ex)
{
Debug.WriteLine(ex.ToString());
}
Console.WriteLine(Environment.NewLine + "Message sent after performing mail merge.");
}
// Template routine to provide signature
static object GetSignature(object[] args)
{
return "Aspose.Email Team<br>Aspose Ltd.<br>" + DateTime.Now.ToShortDateString();
}
Cara Melakukan Mail Merge Baris per Baris
Pengguna dapat menggabungkan baris data individual serta mendapatkan yang lengkap dan siap MailMessage objek. The TemplateEngine.Merge metode dapat digunakan untuk melakukan mail merge per baris.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create message from the data in current row.
message = engine.Merge(currentRow);