Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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;

} …

Регистрируемся, и на нашу почту приходит письмо:






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.