Baru-baru ini, saya perlu memelihara program ASP.NET 1.1 karena pekerjaan. Saya biasa menggunakan namespace C# 2.0 System.Net.Mail untuk mengirim email dengan sangat baik, tetapi ada banyak masalah dengan System.Web.Mail di ASP.NET 1.1, jadi saya memilih yang lain. Strateginya merangkum antarmuka untuk mengirim email, dan kemudian mengimplementasikan pengiriman email dengan cara lain, jadi ada kata-kata berikut.
Tentukan antarmuka abstrak untuk merangkum semua implementasi:
menggunakan Sistem;
menggunakan System.Web.Mail
;
{
kelas abstrak publik MySmtpMail
{
Bidang#wilayah Bidang
string pribadi _defaultCharset = "GB2312";
pribadi int _defaultSmtpPort = 25
;
Properti#wilayah Properti
string yang dilindungi DefaultCharset
{
dapatkan { kembalikan ini._defaultCharset }
}
dilindungi ke dalam DefaultSmtpPort
{
dapatkan { kembalikan ini._defaultSmtpPort;}
}
Wilayah Akhir
#Metode Wilayah
/**//// <ringkasan>
/// Dapatkan instance default
/// </ringkasan>
/// <pengembalian></pengembalian>
MySmtpMail GetDefaultInstance() statis publik
{
// Di sini Anda dapat menentukan tipe implementasi spesifik melalui file konfigurasi eksternal, lalu
// Dapatkan instance tipe melalui Activator.CreateInstance()
}
/**//// <ringkasan>
/// Lakukan beberapa pekerjaan inisialisasi
/// </ringkasan>
abstrak publik batal Buka();
/**//// <ringkasan>
/// Hancurkan objeknya
/// </ringkasan>
abstrak publik batal Tutup();
/**//// <ringkasan>
/// Kirim email
/// </ringkasan>
/// <param nama="pesan"></param>
/// <param nama="smtpServer"></param>
/// <param nama="serverUsername"></param>
/// <param nama="serverPassword"></param>
/// <pengembalian></pengembalian>
bool publik Kirim (Pesan MailMessage, string smtpServer, string serverUsername, string serverPassword)
{
return Kirim(pesan, smtpServer, serverUsername, serverPassword, this._defaultSmtpPort);
}
public abstract bool Kirim(Pesan MailMessage, string smtpServer, string serverUsername, string serverPassword, int smtpPort);
string statis publik[] GetTo(Pesan MailMessage)
{
jika (pesan == nol)
melempar ArgumentNullException("pesan");
if (Globals.IsNullorEmpty(message.To))
baru
return null;
kembalikan pesan.Ke.Split(';');
}
string statis publik[] GetCc(pesan MailMessage)
{
jika (pesan == nol)
melempar ArgumentNullException("pesan");
if (Globals.IsNullorEmpty(message.Cc))
baru
kembalikan null;
kembalikan pesan.Cc.Split(';');
}
string statis publik[] GetBcc(pesan MailMessage)
{
jika (pesan == nol)
melempar ArgumentNullException("pesan");
if (Globals.IsNullorEmpty(message.Bcc))
baru
return null;
kembalikan pesan.Bcc.Split(';');
}
#wilayah akhir
}
}
Catatan: Menurut akal sehat, Open() sebelum digunakan, dan jangan lupa Close() setelah digunakan.
Rencana implementasi pertama (komponen Jmail):
Menggunakan Jmail di .NET memerlukan pengaturan berikut:
1. Instal jmail;
2. Temukan jmail.dll;
3. Untuk mendaftarkan komponen Jmail.dll, salin file jmail.dll ke direktori system32, lalu jalankan perintah "regsvr32 jmail.dll" (tidak termasuk tanda kutip). Untuk uninstall, jalankan "regsvr32 /u jmail.dll" ;
4. Jalankan Program FilesMicrosoft Visual Studio .NETFrameworkSDKBinildasm.exe (Anda dapat menggunakan command prompt Visual Studio .Net 2003),
Formatnya adalah sebagai berikut: tlbimp c:Program FilesDimacw3JMail4jmail.dll /out:MyJmail.dll /namespace:MyJmail
Setelah membuat MyJmail.dll, referensikan ke dalam proyek.
mendownload komponen,
langkah selanjutnya adalah menulis kelas implementasi:
using System;
menggunakan System.Web.Mail
;
{
JMailSmtpMail kelas publik : MySmtpMail
{
Bidang#region Bidang
MyJmail.Message jmail = null;
#Metodeendregion
#Metode wilayah
override publik void Open()
{
jmail = new MyJmail.Pesan();
}
public override bool Kirim (Pesan MailMessage, string smtpServer, string serverUsername, string serverPassword, int smtpPort)
{
jika (jmail == nol)
melempar Pengecualian baru("smtp Ditutup!");
jika (pesan == nol)
throw new ArgumentNullException("message");
DateTime t = DateTime.Now;
//Atribut senyap: Jika disetel ke true, JMail tidak akan memunculkan kesalahan pengecualian. JMail.Send( () akan mengembalikan nilai benar atau salah sesuai dengan hasil operasi
jmail.Silent = false;
//Log dibuat oleh jmail, asalkan atribut logging disetel ke true
jmail.Logging = true;
//Kumpulan karakter, defaultnya adalah "US-ASCII"
jmail.Charset = base.DefaultCharset;
//Jenis isi surat. Defaultnya adalah "text/plain"): String Jika Anda mengirim email dalam format HTML, ubah menjadi "text/html".
if (pesan.BodyFormat == MailFormat.Html)
jmail.ContentType = "teks/html";
jmail.Priority = GetJmailPriority(message.Priority);
//Tambahkan penerima
string[] toArray = MySmtpMail.GetTo(pesan);
jika (toArray != null && toArray.Panjang > 0)
{
bool isAddedRecipient = false;
untuk (int i = 0; i < toArray.Length; i++)
{
if (Global.IsNullorEmpty(toArray[i]))
lanjutkan;
jika (!isAddedRecipient)
{
jmail.AddRecipient(toArray[i], String.Empty, String.Empty);
isAddedRecipient = benar;
}
kalau tidak
{
jmail.AddRecipientCC(toArray[i], String.Empty, String.Empty);
}
}
}
string[] ccArray = MySmtpMail.GetCc(pesan);
jika (ccArray != nol)
{
foreach (string cc di ccArray)
{
if (!Global.IsNullorEmpty(cc))
jmail.AddRecipientCC(cc, String.Empty, String.Empty);
}
}
string[] bccArray = MySmtpMail.GetBcc(pesan);
jika (ccArray != nol)
{
foreach (string bcc di bccArray)
{
if (!Global.IsNullorEmpty(bcc))
jmail.AddRecipientBCC(bcc, String.Empty);
}
}
jmail.From = message.From;
//Nama pengguna email pengirim
jmail.MailServerUserName = nama pengguna server;
//Kata sandi email pengirim
jmail.MailServerPassWord = serverPassword;
//Tetapkan judul email
jmail.Subjek = pesan.Subjek;
//Tambahkan lampiran ke email (jika ada beberapa lampiran, Anda dapat menambahkan jmail.AddAttachment("c:\test.jpg",true,null);) dan itu akan selesai. [Catatan]: Setelah menambahkan lampiran, harap hapus jmail.ContentType="text/html"; di atas. Jika tidak, karakter yang kacau akan muncul di email.
//jmail.AddAttachment("c:\test.jpg", benar, nol);
//Konten email
jmail.Body = pesan.Body;
jika (pesan.BodyFormat == MailFormat.Html)
jmail.Body += "<br><br>";
kalau tidak
jmail.Body += "rnrn";
jmail.Body += DateTime.Sekarang.ToString();
smtpServer = String.Format("{0}:{1}", smtpServer, smtpPort);
//Metode pengiriman Jmail
hasil bool = jmail.Send(smtpServer, false)
;
}
penggantian publik batal Tutup()
{
jmail.Tutup();
}
byte statis pribadi GetJmailPriority (prioritas System.Web.Mail.MailPriority)
{
// Level email, 1 mendesak, 3 normal, 5 level rendah
jika (prioritas == System.Web.Mail.MailPriority.High)
kembalikan 1;
jika (prioritas == Sistem.Web.Mail.MailPriority.Rendah)
kembali 5;
kembali 3;
}
#wilayah akhir
}
}
Rencana implementasi kedua (komponen OpenSmtp.Net):
Bagi yang belum pernah berhubungan dengan OpenSmtp.Net, bisa Google dulu. Saya tidak akan memperkenalkan konsepnya di sini .Net. Sedangkan untuk OpenSmtp.Net, kita dapat mendownloadnya dari http://sourceforge.net/projects/opensmtp-net/ .
Selanjutnya, mari masuk ke topik:
menggunakan Sistem;
menggunakan Sistem.Web.Mail;
menggunakan OpenSmtp.Mail;
namespace YywMail
{
OpenSmtpMail kelas publik : MySmtpMail
{
File#wilayah File
OpenSmtp.Mail.MailMessage pesan = null;
Smtp smtp = null;
#Metode endregion
#Metode wilayah
override publik void Open()
{
pesan = new OpenSmtp.Mail.MailMessage();
smtp = Smtp baru();
}
public override bool Kirim(Pesan System.Web.Mail.MailMessage, string smtpServer, string serverUsername, string serverPassword, int smtpPort)
{
jika (pesan == batal || smtp == batal)
melempar Pengecualian baru("smtp Ditutup!");
if (pesan == null)
melempar ArgumentNullException("pesan");
SmtpConfig.VerifyAddresses baru = false;
Alamat Email dari = Alamat Email baru(pesan.Dari, pesan.Dari);
pesan.Charset = base.DefaultCharset;
pesan.Dari = dari;
msg.Priority = GetOpenSmtpPriority(message.Priority);
//Tambahkan penerima
string[] toArray = MySmtpMail.GetTo(pesan);
jika (toArray!= null)
{
foreach (string ke dalam toArray)
{
if (!Globals.IsNullorEmpty(to))
pesan.AddRecipient(ke, AddressType.To);
}
}
string[] ccArray = MySmtpMail.GetCc(pesan);
jika (ccArray != nol)
{
foreach (string cc di ccArray)
{
if (!Global.IsNullorEmpty(cc))
pesan.AddRecipient(cc, AddressType.Cc);
}
}
string[] bccArray = MySmtpMail.GetBcc(pesan);
jika (ccArray != nol)
{
foreach (string bcc di bccArray)
{
if (!Global.IsNullorEmpty(bcc))
pesan.AddRecipient(bcc, AddressType.Bcc);
}
}
pesan.Subjek = pesan.Subjek;
if (pesan.BodyFormat == Sistem.Web.Mail.MailFormat.Html)
{
msg.HtmlBody = pesan.Body + "<br><br>" + DateTime.Now.ToString();
}
kalau tidak
{
pesan.Body = pesan.Body + "rnrn" + DateTime.Now.ToString();;
}
string str1 = pesan.HtmlBody;
string str2 = pesan.Badan;
smtp.Host = smtpServer;
smtp.Nama Pengguna = serverNama Pengguna;
smtp.Password = serverPassword;
smtp.Port = smtpPort;
smtp.SendMail(pesan)
;
}
penggantian publik batal Tutup()
{
pesan = batal;
smtp = nol;
}
string statis pribadi GetOpenSmtpPriority (prioritas System.Web.Mail.MailPriority)
{
// Level email, 1 mendesak, 3 normal, 5 level rendah
jika (prioritas == System.Web.Mail.MailPriority.High)
kembalikan OpenSmtp.Mail.MailPriority.High;
jika (prioritas == System.Web.Mail.MailPriority.Low)
kembalikan OpenSmtp.Mail.MailPriority.Low;
kembalikan OpenSmtp.Mail.MailPriority.Normal;
}
#wilayah akhir
}
}
Rencana implementasi ketiga:
(Dua rencana implementasi di atas cukup untuk memenuhi kebutuhan saat ini, dan dapat diperluas jika diperlukan)