рдкрд╛рда рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдкрддреНрд░ рднреЗрдЬрдиреЗ рдФрд░ рдПрд╕рдПрдордПрд╕ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭрдирд╛ред MailNotify, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ред рдПрдХ рдЕрд▓рдЧ рдзрд╛рд░рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рддрд░рдгред
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> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
Web.config рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ:
<add name="Register" subject=" {0}" template="! <br/><br/> <a href='http://{1}/User/Activate/{0}'>http://{1}/User/Activate/{0}</a>, .<br/>-----<br/> , <a href='http://{1}'>{1}</a>" />
рдЖрдЗрдП рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП HTML рдЯреИрдЧ рдХреЛ рдХреИрд╕реЗ рдврд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдкрдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд╝рд░реНрдореИрдЯ () рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдкрдВрдЬреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди 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");
рд╣рдордиреЗ рдмреЗрд╕рдХрдВрдЯреНрд░реЛрд▓рд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдВ рд╣реЛрд╕реНрдЯрдирд╛рдо рдЬреЛрдбрд╝рд╛ (/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; } тАж
рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдкрддреНрд░ рд╣рдорд╛рд░реЗ рдореЗрд▓ рдкрд░ рдЖрддрд╛ рд╣реИ:

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓рд╛
рдпрд╣ рд╕рдм рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдореЗрдВ рдкреНрд░рдЪрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рдЪрд╛рд░ рдкрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рд╛рд░реВрдк рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Web.config рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рдирд┐рдпрдорд┐рдд HTML рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рддрд░рд╣, рдПрдХ рд▓реЗрдЯрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡реНрдпреВ рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрднреБрдд рд╣реЛрдЧрд╛ред рдЦреИрд░, ActionMailer рд▓рд╛рдЗрдмреНрд░реЗрд░реА (
http://nuget.org/packages/ActionMailer ) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
PM> Install-Package ActionMailer Successfully installed 'ActionMailer 0.7.4'. Successfully added 'ActionMailer 0.7.4' to LessonProject.Model.
MailerBase рд╕реЗ рд╣рдореЗрдВ MailController рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧреА:
public class MailController : MailerBase { public EmailResult Subscription(string message, string email) { To.Add(email); Subject = ""; MessageEncoding = Encoding.UTF8; return Email("Subscription", message); } }
рд╕рджрд╕реНрдпрддрд╛ рдЬреЛрдбрд╝реЗрдВ.html.cshtml рджреЗрдЦреЗрдВ (/Areas/Default/Views/Mail/Subscription.html.cshtml):
@model string @{ Layout = null; } <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <div> <h1>@Model</h1> </div> </body> </html>
Web.config (Web.config) рдореЗрдВ рдореЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬреЛрдбрд╝реЗрдВ:
<system.net> <mailSettings> <smtp deliveryMethod="Network" from="lxndrpetrov@gmail.com"> <network host="smtp.gmail.com" port="587" userName="lxndrpetrov" password="******" enableSsl="true" /> </smtp> </mailSettings> </system.net>
рдФрд░ UserController.cs (/Areas/Default/Controllers/UserController.cs) рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ:
[Authorize] public ActionResult SubscriptionTest() { var mailController = new MailController(); var email = mailController.Subscription(", !", CurrentUser.Email); email.Deliver(); return Content("OK"); }
рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:
рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ / рдпреВрдЬрд╝рд░ / рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдЯреЗрд╕реНрдЯ - рдФрд░ рд╣рдореЗрдВ рдПрдХ рдИрдореЗрд▓ рдорд┐рд▓рддрд╛ рд╣реИред
рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рдкрддреНрд░ рдХреЗ рдкрд╛рда рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ StreamReader (/Areas/Default/Controllers/UserController.cs) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
[Authorize] public ActionResult SubscriptionShow() { var mailController = new MailController(); var email = mailController.Subscription(", !", CurrentUser.Email); using (var reader = new StreamReader(email.Mail.AlternateViews[0].ContentStream)) { var content = reader.ReadToEnd(); return Content(content); } return null; }
рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЙрддреНрдкрдиреНрди рдкреГрд╖реНрда рд╣реИред рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:
рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ / рдпреВрдЬрд░ / рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рдиSmsNotify
рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдореЗрд▓ рд╣реА рдирд╣реАрдВ, рдПрд╕рдПрдордПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рддрдЪреАрдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╣реИ - рдиреНрдпреВрдЬрд╝рд▓реЗрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрд╡рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рдЕрдирдЗрд╕реНрд╕реЗрдбрд░.ru рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрд╕рдПрдордПрд╕ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдЪрд▓рд┐рдП MailSetting (/Global/Config/SmsSetting.cs) рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ:
public class SmsSetting : ConfigurationSection { [ConfigurationProperty("apiKey", IsRequired = true)] public string APIKey { get { return this["apiKey"] as string; } set { this["apiKey"] = value; } } [ConfigurationProperty("sender", IsRequired = true)] public string Sender { get { return this["sender"] as string; } set { this["sender"] = value; } } [ConfigurationProperty("templateUri", IsRequired = true)] public string TemplateUri { get { return this["templateUri"] as string; } set { this["templateUri"] = value; } } }
Web.Config (Web.config) рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ:
<configSections> тАж <section name="smsConfig" type="LessonProject.Global.Config.SmsSetting, LessonProject" /> </configSections> тАж <smsConfig apiKey="*******" sender="Daddy" templateUri="http://api.unisender.com/ru/api/sendSms" /> </configuration>
SmsSender рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ (/Tools/Sms/SmsSender.cs):
public static class SmsSender { 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 string SendSms(string phone, string text) { if (!string.IsNullOrWhiteSpace(Config.SmsSetting.APIKey)) { return GetRequest(phone, Config.SmsSetting.Sender, text); } else { logger.Debug("Sms \t Phone: {0} Body: {1}", phone, text); return "Success"; } } private static string GetRequest(string phone, string sender, string text) { try { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Config.SmsSetting.TemplateUri);
рдкрд░рд┐рдгрд╛рдо рдХреА рддрд░рд╣ рдЖрддрд╛ рд╣реИ:
{"result":{"currency":"RUB","price":"0.49","sms_id":"1316886153.2_79859667475"}}
рдпрд╣ disassembled рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдЧрд▓реЗ рдкрд╛рда рдореЗрдВ, рд╣рдо рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдЬреЛрдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
рдЕрд▓рдЧ рдзрд╛рд░рд╛
рдпрджрд┐ рд╣рдо рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдИрдореЗрд▓ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
- рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдмрдирд╛рдПрдВ рдЬреЛ рдпрд╣ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдИрдореЗрд▓ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ
- рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдмрдирд╛рддреЗ рд╕рдордп, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдмрдирд╛рдпрд╛ рдФрд░ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдереНрд░реЗрдб рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ
- рдкрддреНрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ (рдкрддреНрд░ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдкрддреНрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП)ред
- рдкрддреНрд░ рднреЗрдЬрд╛ рд╣реИред
- рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реМрдЯрддрд╛ рд╣реИред
Application_Start рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЯрд╛рдЗрдорд░ рдХреЛ 1 рдорд┐рдирдЯ рдХреЗ рдмрд╛рдж рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
public class MvcApplication : System.Web.HttpApplication { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private Thread mailThread { get; set; } protected void Application_Start() { var adminArea = new AdminAreaRegistration(); var adminAreaContext = new AreaRegistrationContext(adminArea.AreaName, RouteTable.Routes); adminArea.RegisterArea(adminAreaContext); var defaultArea = new DefaultAreaRegistration(); var defaultAreaContext = new AreaRegistrationContext(defaultArea.AreaName, RouteTable.Routes); defaultArea.RegisterArea(defaultAreaContext); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); mailThread = new Thread(new ThreadStart(ThreadFunc)); mailThread.Start(); } private static void ThreadFunc() { while (true) { try { var mailThread = new Thread(new ThreadStart(MailThread)); mailThread.Start(); logger.Info("Wait for end mail thread"); mailThread.Join(); logger.Info("Sleep 60 seconds"); } catch (Exception ex) { logger.ErrorException("Thread period error", ex); } Thread.Sleep(60000); } } private static void MailThread() { var repository = DependencyResolver.Current.GetService<IRepository>(); while (MailProcessor.SendNextMail(repository)) { } } }
MailProcessor рд╡рд░реНрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдирд╣реАрдВ рдмрдирд╛рдПрдВрдЧреЗ):
public class MailProcessor { public static bool SendNextMail(IRepository repository) { var mail = repository.PopMailQueue(); if (mail != null) { MailSender.SendMail(mail.Email, mail.Subject, mail.Body); return true; } return false; } }
MailProcessor.SendNextMail(repository)
- рдХреЛрдИ рдкрддреНрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЕрдЧрд▓рд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ - рдЧрд▓рдд рд░рд┐рдЯрд░реНрди
MainThread рдереНрд░реЗрдб
MailThread
рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рд╕реНрдореЛрдХ рдмреНрд░реЗрдХ рджреЗрддрд╛ рд╣реИред рдФрд░ рдЖрдЧреЗред рдпрджрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреЛрдИ рдирдП рдЕрдХреНрд╖рд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдорд┐рдирдЯ рдмрд╛рдж рдзреВрдореНрд░рдкрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рд╕рднреА рд╕реНрд░реЛрдд
https://bitbucket.org/chernikov/lessons рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ