Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
SmtpClient и MailNotify
При разработке сайта мы рано или поздно сталкиваемся с взаимодействием с электронной почтой, будь то активация пользователя, напоминание или сброс пароль, или создание рассылки. Определимся, что нам для этого нужно: · Класс, который будет рассылать письма · Конфигурация smtp берется из IConfig · Ошибки отправки письма протоколируются · Наличие параметра, выключающего работу почты, дабы при работе с боевой базой клиентов не разослать какой-то треш.
Создадим статический класс, назовем его MailSender (/Tools/Mail/MailSender.cs): public static class MailSender { private static IConfig _config;
public static IConfig Config { get { if (_config == null) { _config = (DependencyResolver.Current).GetService< IConfig> ();
} return _config; } }
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public static void SendMail(string email, string subject, string body, MailAddress mailAddress = null) {
try { if (Config.EnableMail) { if (mailAddress == null) { mailAddress = new MailAddress(Config.MailSetting.SmtpReply, Config.MailSetting.SmtpUser); } MailMessage message = new MailMessage( mailAddress, new MailAddress(email)) { Subject = subject, BodyEncoding = Encoding.UTF8, Body = body, IsBodyHtml = true, SubjectEncoding = Encoding.UTF8 }; SmtpClient client = new SmtpClient { Host = Config.MailSetting.SmtpServer, Port = Config.MailSetting.SmtpPort, UseDefaultCredentials = false, EnableSsl = Config.MailSetting.EnableSsl, Credentials = new NetworkCredential(Config.MailSetting.SmtpUserName, Config.MailSetting.SmtpPassword), DeliveryMethod = SmtpDeliveryMethod.Network }; client.Send(message); } else { logger.Debug(" Email: {0} {1} \t Subject: {2} {3} Body: {4}", email, Environment.NewLine, subject, Environment.NewLine, body); } } catch (Exception ex) { logger.Error(" Mail send exception", ex.Message); } } } Рассмотрим подробнее: · По необходимости, статически инициализируется IConfig из DependencyResolver · Если установлен флаг EnableMain, то начинаем работу с почтой, иначе просто письмо запишем в лог-файл · Если MailAddress не указан, то он инициализируется по данным из конфига · SmtpClient инициализируется по данным из конфига · Тело письма – html · Кодировка – UTF8 · Если при отправке произошла ошибка, то запишем Exception.Message в лог (тут можно и больше информации собирать, но пока нет необходимости). Рассмотрим рассылку писем по шаблону. Создадим класс (тоже статический) NotifyMail (/Tools/Mail/NotifyMail.cs): public static class NotifyMail { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static IConfig _config;
public static IConfig Config { get { if (_config == null) { _config = (DependencyResolver.Current).GetService< IConfig> ();
} return _config; } }
public static void SendNotify(string templateName, string email, Func< string, string> subject, Func< string, string> body) { var template = Config.MailTemplates.FirstOrDefault(p => string.Compare(p.Name, templateName, true) == 0); if (template == null) { logger.Error(" Can't find template (" + templateName + ")"); } else { MailSender.SendMail(email, subject.Invoke(template.Subject), body.Invoke(template.Template)); } } } Аналогично получаем конфиг. При рассылке мы указываем для неё, и дальше используем Func< string, string> для формирования темы и тела письма. Уведомим пользователя о регистрации, используя шаблон Register из Web.config: < add name=" Register" subject=" Регистрация на {0}" template=" Здравствуйте! & lt; br/& gt; & lt; br/& gt; Перейдите по ссылке & lt; a href='https://{1}/User/Activate/{0}'& gt; https://{1}/User/Activate/{0}& lt; /a& gt;, чтобы подтвертить свой почтовый ящик.& lt; br/& gt; -----& lt; br/& gt; С уважением, команда & lt; a href='https://{1}'& gt; {1}& lt; /a& gt; " /> Заметим, как необходимо экранировать html-теги, чтобы правильно сделать шаблон. Нужно учитывать зависимость между шаблоном для string.Format() и количеством параметров. В UserController.cs при регистрации добавим (/Areas/Default/Controllers/UserController.cs: Register): Repository.CreateUser(user);
NotifyMail.SendNotify(" Register", user.Email, subject => string.Format(subject, HostName), body => string.Format(body, " ", HostName));
return RedirectToAction(" Index"); HostName мы добавили в инициализации BaseController (/Controllers/BaseController.cs):
public static string HostName = string.Empty; protected override void Initialize(System.Web.Routing.RequestContext requestContext) { if (requestContext.HttpContext.Request.Url! = null) { HostName = requestContext.HttpContext.Request.Url.Authority; } … Регистрируемся, и на нашу почту приходит письмо:
|