Недавно мне нужно было поддерживать программу ASP.NET 1.1 по работе. Раньше я очень хорошо использовал пространство имен C# 2.0 System.Net.Mail для отправки электронных писем, но с System.Web.Mail в ASP.NET возникает много проблем. 1.1, поэтому я выбрал другой. Стратегия инкапсулирует интерфейс отправки писем, а затем реализует отправку писем другими способами, поэтому есть следующие слова.
Определите абстрактный интерфейс для инкапсуляции всех реализаций:
используя System;
использование пространства имен System.Web.Mail
YywMail
;
{
общедоступный абстрактный класс MySmtpMail
{
Fields#region Fields
частная строка _defaultCharset = "GB2312";
частный int _defaultSmtpPort = 25
#endregion
;
Свойства#регион Свойства
защищенная строка DefaultCharset
{
получить {вернуть это._defaultCharset};
}
protected int DefaultSmtpPort
{
получить {вернуть это._defaultSmtpPort;}
}
#endregion
Methods#region Methods
/**////
/// Получаем экземпляр по умолчанию
/// сводка>
/// <возвращается>возвращается>
общедоступный статический MySmtpMail GetDefaultInstance()
{
// Здесь вы можете определить конкретный тип реализации через внешний файл конфигурации, а затем
// Получаем экземпляр типа через Activator.CreateInstance()
}
/**//// <сводка>
/// Выполняем некоторую работу по инициализации
/// сводка>
публичный абстрактный void Open();
/**////
/// Уничтожить объект
/// сводка>
публичный абстрактный void Close();
/**////
/// Отправить письмо
/// сводка>
///
///
///
///
/// <возвращается>возвращается>
public bool Send (сообщение MailMessage, строка smtpServer, строка serverUsername, строка serverPassword)
{
return Send(message, smtpServer, serverUsername, serverPassword, this._defaultSmtpPort);
}
Public Abstract bool Send (сообщение MailMessage, строка smtpServer, строка serverUsername, строка serverPassword, int
public static string [] GetTo (сообщение MailMessage)
;
{
если (сообщение == ноль)
выдать новое ArgumentNullException("сообщение");
if (Globals.IsNullorEmpty(message.To))
вернуть ноль
вернуть сообщение.To.Split(';');
}
общедоступная статическая строка [] GetCc (сообщение MailMessage)
{
если (сообщение == ноль)
выдать новое ArgumentNullException("сообщение");
if (Globals.IsNullorEmpty(message.Cc))
вернуть ноль
вернуть сообщение.Cc.Split(';');
}
общедоступная статическая строка [] GetBcc (сообщение MailMessage)
{
если (сообщение == ноль)
выдать новое ArgumentNullException("сообщение");
if (Globals.IsNullorEmpty(message.Bcc))
вернуть ноль
вернуть сообщение.Bcc.Split(';');
}
#конечныйрегион
}
}
Примечание. Согласно здравому смыслу, используйте Open() перед использованием и не забудьте Close() после использования.
Первый план реализации (компонент Jmail):
Использование Jmail в .NET требует следующих настроек:
1. Установите jmail;
2. Найдите jmail.dll;
3. Чтобы зарегистрировать компонент Jmail.dll, скопируйте файл jmail.dll в каталог system32, а затем выполните команду «regsvr32 jmail.dll» (исключая кавычки). Для удаления выполните «regsvr32 /u jmail.dll». ;
4. Запустите Program FilesMicrosoft Visual Studio .NETFrameworkSDKBinildasm.exe (вы можете использовать командную строку Visual Studio .Net 2003),
Формат следующий: tlbimp c:Program FilesDimacw3JMail4jmail.dll /out:MyJmail.dll /namespace:MyJmail.
После создания MyJmail.dll добавьте ссылку на него в проект.
загрузки компонента
следующим шагом будет написание класса реализации:
using System;
использование пространства имен System.Web.Mail
YywMail
;
{
открытый класс JMailSmtpMail: MySmtpMail
{
Fields#region Fields
MyJmail.Message jmail = null
#endregion
Methods#region Methods
public override void Open();
{
jmail = новый MyJmail.Message();
}
public override bool Send (сообщение MailMessage, строка smtpServer, строка serverUsername, строка serverPassword, int smtpPort)
{
если (jmail == ноль)
throw new Exception("smtp закрыт!");
если (сообщение == ноль)
throw new ArgumentNullException("message");
DateTime t = DateTime.Now;
//Атрибут Silent: если установлено значение true, JMail.Send(()) вернет true или false в зависимости от результата операции.
jmail.Silent = false;
//Журнал, созданный jmail, при условии, что для атрибута журнала установлено значение true
jmail.Logging = true;
//Набор символов, по умолчанию — «US-ASCII»
jmail.Charset = base.DefaultCharset;
//Тип содержимого письма по умолчанию — «text/plain»): String Если вы отправляете письмо в формате HTML, измените его на «text/html».
если (message.BodyFormat == MailFormat.Html)
jmail.ContentType = "текст/html";
jmail.Priority = GetJmailPriority(message.Priority);
//Добавить получателя;
строка [] toArray = MySmtpMail.GetTo(сообщение);
if (toArray != null && toArray.Length > 0)
{
bool isAddedRecipient = false;
for (int i = 0; i < toArray.Length; i++)
{
если (Globals.IsNullorEmpty(toArray[i]))
продолжить,
если (!isAddedRecipient)
{
jmail.AddRecipient(toArray[i], String.Empty, String.Empty);
isAddedRecipient = правда;
}
еще
{
jmail.AddRecipientCC(toArray[i], String.Empty, String.Empty);
}
}
}
String[] ccArray = MySmtpMail.GetCc(сообщение);
если (ccArray!= ноль)
{
foreach (строка cc в ccArray)
{
если (!Globals.IsNullorEmpty(cc))
jmail.AddRecipientCC(cc, String.Empty, String.Empty);
}
}
String[] bccArray = MySmtpMail.GetBcc(сообщение);
если (ccArray!= ноль)
{
foreach (строка bcc в bccArray)
{
если (!Globals.IsNullorEmpty(СК))
jmail.AddRecipientBCC(скрытая копия, String.Empty);
}
}
jmail.From = message.From
//Имя пользователя электронной почты отправителя
;
jmail.MailServerUserName = имя_сервера;
//пароль электронной почты отправителя
jmail.MailServerPassWord = пароль сервера;
//Устанавливаем заголовок письма
jmail.Тема = сообщение.Тема;
//Добавляем вложения к письму (если вложений несколько, вы можете добавить jmail.AddAttachment("c:\test.jpg",true,null);), и все будет готово. [Примечание]: После добавления вложения удалите jmail.ContentType="text/html" выше. В противном случае в электронном письме появятся искаженные символы.
//jmail.AddAttachment("c:\test.jpg", true, null);
//Содержимое электронной почты
jmail.Body = message.Body;
если (message.BodyFormat == MailFormat.Html)
jmail.Body += "
";
еще
jmail.Body += "rnrn";
jmail.Body += DateTime.Now.ToString();
smtpServer = String.Format("{0}:{1}", smtpServer, smtpPort);
//Метод отправки Jmail
результат bool = jmail.Send(smtpServer, false,
возвращаемый результат);
}
публичное переопределение void Close()
{
jmail.Закрыть();
}
частный статический байт GetJmailPriority (приоритет System.Web.Mail.MailPriority)
{
// Уровень почты, 1 — срочно, 3 — нормально, 5 — низкоуровнево
if (priority == System.Web.Mail.MailPriority.High)
вернуть 1,
если (приоритет == System.Web.Mail.MailPriority.Low)
возврат 5;
возврат 3;
}
#конечныйрегион
}
}
Второй план реализации (компонент OpenSmtp.Net):
Для тех, кто не сталкивался с OpenSmtp.Net, можно сначала погуглить. В то же время у него также есть брат-близнец OpenPop. .Net Что касается OpenSmtp.Net, мы можем загрузить его с http://sourceforge.net/projects/opensmtp-net/ . Последняя версия — 1.11.
Далее давайте углубимся в тему:
использование System;
использование System.Web.Mail;
использование пространства имен OpenSmtp.Mail
YywMail
;
{
общедоступный класс OpenSmtpMail: MySmtpMail
{
Files#region Files
OpenSmtp.Mail.MailMessage msg = null;
Smtp smtp = null
#endregion
Methods#region Methods
public override void Open();
{
msg = новый OpenSmtp.Mail.MailMessage();
смтп = новый смтп ();
}
public override bool Send (сообщение System.Web.Mail.MailMessage, строка smtpServer, строка serverUsername, строка serverPassword, int smtpPort)
{
если (msg == null || smtp == null)
throw new Exception("smtp закрыт!");
if (message == null)
выбросить новое ArgumentNullException («сообщение»);
SmtpConfig.VerifyAddresses = false;
EmailAddress from = новый EmailAddress(message.From, message.From);
msg.Charset = base.DefaultCharset;
msg.From = from;
msg.Priority = GetOpenSmtpPriority(message.Priority);
//Добавить получателя
;
строка [] toArray = MySmtpMail.GetTo(сообщение);
если (toArray!= ноль)
{
foreach (строка в toArray)
{
если (!Globals.IsNullorEmpty(to))
msg.AddRecipient(to, AddressType.To);
}
}
String[] ccArray = MySmtpMail.GetCc(сообщение);
если (ccArray!= ноль)
{
foreach (строка cc в ccArray)
{
если (!Globals.IsNullorEmpty(cc))
msg.AddRecipient(cc, AddressType.Cc);
}
}
String[] bccArray = MySmtpMail.GetBcc(сообщение);
если (ccArray!= ноль)
{
foreach (строка bcc в bccArray)
{
если (!Globals.IsNullorEmpty(СК))
msg.AddRecipient(СК, AddressType.Bcc);
}
}
msg.Subject = message.Subject;
если (message.BodyFormat == System.Web.Mail.MailFormat.Html)
{
msg.HtmlBody = message.Body + "
" + DateTime.Now.ToString();
}
еще
{
msg.Body = message.Body + "rnrn" + DateTime.Now.ToString();;
}
Строка str1 = msg.HtmlBody;
строка str2 = msg.Body;
smtp.Host = smtpServer;
smtp.Имя пользователя = имя пользователя сервера;
smtp.Пароль = Пароль сервера;
smtp.Port = smtpPort;
smtp.SendMail(msg)
;
}
публичное переопределение void Close()
{
сообщение = ноль;
смтп = ноль;
}
частная статическая строка GetOpenSmtpPriority (приоритет System.Web.Mail.MailPriority)
{
// Уровень почты, 1 — срочно, 3 — нормально, 5 — низкоуровнево
if (priority == System.Web.Mail.MailPriority.High)
вернуть OpenSmtp.Mail.MailPriority.High,
если (приоритет == System.Web.Mail.MailPriority.Low);
вернуть OpenSmtp.Mail.MailPriority.Low;
вернуть OpenSmtp.Mail.MailPriority.Normal;
}
#конечныйрегион
}
}
Третий план реализации:
(Двух вышеуказанных планов реализации достаточно для удовлетворения текущих потребностей и при необходимости можно расширить)