c# – 从Windows服务发送电子邮件的正确方法

前端之家收集整理的这篇文章主要介绍了c# – 从Windows服务发送电子邮件的正确方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要按计划发送大量电子邮件(可能每天数百封).
我想要这样做的方式如下,但问题是我的Body字段可以变得非常大,如果我将它添加为字符串,它会变得难看.
  1. SmtpClient client = new SmtpClient(); //host and port picked from web.config
  2. client.EnableSsl = true;
  3.  
  4. MailMessage message = new MailMessage();
  5.  
  6. message.Body = "test from winservice"; // HERE IS MY PROBLEM
  7. message.IsBodyHtml = true;
  8. message.From = new MailAddress("donotreply@abcde.com");
  9. message.Subject = "My subject";
  10. message.To.Add(new MailAddress("piniusha@abcde.com"));
  11. try
  12. {
  13. client.Send(message);
  14. }
  15. catch (Exception)
  16. {
  17.  
  18. }

当我不得不从我使用的aspx页面做到这一点

  1. MailDefinition message = new MailDefinition();
  2.  
  3. message.BodyFileName = @"~\EmailTemplate\Template1.htm";
  4. ListDictionary replacements = new ListDictionary();
  5. replacements.Add("<% Name %>",this.txtName.Text);
  6. replacements.Add("<% PhoneOrEmail %>",this.txtPhoneOrEmail.Text);
  7. replacements.Add("<% Message %>",this.txtMessage.Text);
  8. MailMessage msgHtml = message.CreateMailMessage(RECIPIENTS,replacements,new LiteralControl());

我认为这是优雅的解决方案,但我不想引用System.Web.UI.WebControls.MailDefinition
因为我在winservice.

我的问题是:

>什么是发送批量的最佳方式
来自winservice的电子邮件
>从gmail发送它是否可行
帐户?或者他们会阻止
我过了一会儿?

谢谢你的帮助.

解决方法

为什么不使用与MailDefinition使用完全相同的概念?从模板文件加载正文,用另一个列表中的文本替换一些标记邮件合并样式?

您所做的只是对要与模板合并的信息数据集进行预测.加载合并数据,循环合并数据,用当前合并记录替换模板中的标记.将邮件正文设置为当前构建的邮件.将消息附加到消息队列或立即发送,无论您选择哪个.

这不是火箭科学.您已经获得了创建消息的代码,因此只需加载合并数据并循环遍历它.我已经简化了演示这个概念,并且我使用了CSV作为合并数据,并假设没有字段包含任何逗号:

  1. message.IsBodyHtml = true;
  2. message.From = new MailAddress("MailSender@MyCompany.com");
  3. message.Subject = "My bogus email subject";
  4.  
  5. string[] lines = File.ReadAllLines(@"~\MergeData.csv");
  6. string originalTemplate = File.ReadAllText(@"~\Template.htm");
  7.  
  8. foreach(string line in lines)
  9. {
  10. /* Split out the merge data */
  11. string[] mergeData = line.Split(',');
  12.  
  13. /* Reset the template - to revert changes made in prevIoUs loop */
  14. string currentTemplate = originalTemplate;
  15.  
  16. /* Replace the merge tokens with actual data */
  17. currentTemplate = currentTemplate.Replace("[[FullNameToken]]",mergeData[0]);
  18. currentTemplate = currentTemplate.Replace("[[FirstNameToken]]",mergeData[1]);
  19. currentTemplate = currentTemplate.Replace("[[OtherToken]]",mergeData[2]);
  20.  
  21. /*... other token replacements as necessary.
  22. * tokens can be specified as necessary using whatever Syntax you choose
  23. * just make sure that there's something denoting the token so you can
  24. * easily replace it */
  25.  
  26. /* Transfer the merged template to the message body */
  27. message.Body = currentTemplate;
  28.  
  29. /* Clear out the address from the prevIoUs loop before adding the current one */
  30. message.To.Clear();
  31. message.To.Add(new MailAddress(mergeData[3]));
  32. client.Send(message);
  33. }

猜你在找的C#相关文章