C# 使用系统方法发送异步邮件
最近在对几年前的一个项目进行重构,发现发送邮件功能需要一定的时间来处理,而由于发送是同步的因此导致在发送邮件时无法执行后续的操作

/******************************************************************
* 创建人:HTL
* 创建时间:2015-04-16 21:34:25
* 说明:C# 发送异步邮件Demo
* Email:huangyuan413026@163.com
*******************************************************************/
using System;
using System.Net.Mail;
namespace SendAsyncEmailTest
{
class Program
{
const string dateFormat = "yyyy-MM-dd :HH:mm:ss:ffffff";
static void Main(string[] args)
{
Console.WriteLine("开始异步发送邮件,时间:" + DateTime.Now.ToString(dateFormat));
new MailHelper().SendAsync("Send Async Email Test", "This is Send Async Email Test", "huangyuan413026@163.com", emailCompleted);
Console.WriteLine("邮件正在异步发送,时间:" + DateTime.Now.ToString(dateFormat));
Console.ReadKey();
Console.WriteLine();
}
/// <summary>
/// 邮件发送后的回调方法
/// </summary>
/// <param name="message"></param>
static void emailCompleted(string message)
{
//延时1秒
System.Threading.Thread.Sleep(1000);
Console.WriteLine();
Console.WriteLine("邮件发送结果:\r\n" + (message == "true" ? "邮件发送成功" : "邮件发送失败") + ",时间:" + DateTime.Now.ToString(dateFormat));
//写入日志
}
}
/// <summary>
/// 发送邮件类
/// </summary>
public class MailHelper
{
public delegate int MethodDelegate(int x, int y);
private readonly int smtpPort = 25;
readonly string SmtpServer = "smtp.baidu.com";
private readonly string UserName = "support@baidu.com";
readonly string Pwd = "baidu.com";
private readonly string AuthorName = "BaiDu";
public string Subject { get; set; }
public string Body { get; set; }
public string Tos { get; set; }
public bool EnableSsl { get; set; }
MailMessage GetClient
{
get
{ if (string.IsNullOrEmpty(Tos)) return null;
MailMessage mailMessage = new MailMessage();
//多个接收者
foreach (string _str in Tos.Split(','))
{
mailMessage.To.Add(_str);
}
mailMessage.From = new System.Net.Mail.MailAddress(UserName, AuthorName);
mailMessage.Subject = Subject;
mailMessage.Body = Body;
mailMessage.IsBodyHtml = true;
mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
mailMessage.SubjectEncoding = System.Text.Encoding.UTF8;
mailMessage.Priority = System.Net.Mail.MailPriority.High;
return mailMessage;
}
}
SmtpClient GetSmtpClient
{
get
{
return new SmtpClient
{
UseDefaultCredentials = false,
Credentials = new System.Net.NetworkCredential(UserName, Pwd),
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
Host = SmtpServer,
Port = smtpPort,
EnableSsl = EnableSsl,
};
}
}
//回调方法
Action<string> actionSendCompletedCallback = null;
///// <summary>
///// 使用异步发送邮件
///// </summary>
///// <param name="subject">主题</param>
///// <param name="body">内容</param>
///// <param name="to">接收者,以,分隔多个接收者</param>
//// <param name="_actinCompletedCallback">邮件发送后的回调方法</param>
///// <returns></returns>
public void SendAsync(string subject, string body, string to, Action<string> _actinCompletedCallback)
{
if (string.IsNullOrEmpty(to)) return; Tos = to; SmtpClient smtpClient = GetSmtpClient;
MailMessage mailMessage = GetClient;
if (smtpClient == null || mailMessage == null) return;
Subject = subject;
Body = body;
EnableSsl = false;
//发送邮件回调方法
actionSendCompletedCallback = _actinCompletedCallback;
smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
try
{
smtpClient.SendAsync(mailMessage, "true");//异步发送邮件,如果回调方法中参数不为"true"则表示发送失败
}
catch (Exception e)
{
throw new Exception(e.Message);
}
finally
{
smtpClient = null;
mailMessage = null;
}
}
/// <summary>
/// 异步操作完成后执行回调方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
//同一组件下不需要回调方法,直接在此写入日志即可
//写入日志
//return;
if (actionSendCompletedCallback == null) return;
string message = string.Empty;
if (e.Cancelled)
{
message = "异步操作取消";
}
else if (e.Error != null)
{
message = (string.Format("UserState:{0},Message:{1}", (string)e.UserState, e.Error.ToString()));
}
else
message = (string)e.UserState;
//执行回调方法
actionSendCompletedCallback(message);
}
}
}

C#发送邮件时提示:“不允许使用邮箱名称。服务器响应为:”的错误解决办法
由于项目需要,要为客户提供一个定期发送邮件的程序。本来原来自己还写过,但新写的程序一晚上也没通过测试,总是提示"不允许使用邮箱名称。服务器响应为..."
经过在网上搜索查找解决办法,似乎解决办法都是一个,就是把smtp.UseDefaultCredentials = true;写到smtp.Credentials = new NetworkCredential("myusername", "mypwd");的前面。
但使用此方法,也未能解决问题。
后来,我从邮箱设置入手,发现现在大多邮箱都采用了设置smtp发邮件和客户端授权码的双重功能,以126为例,在126邮箱网页版的设置里,就能看到,如下图

后期,我将smtp.Credentials = new NetworkCredential("myusername", "mypwd")中的mypwd换成了我的客户端授权码,立即通过了测试。

希望朋友们碰到此种问题也多一种解决办法。
C# 使用系统方法发送异步邮件的更多相关文章
- 用django发送异步邮件
太阳底下没有新鲜事,github是一个神奇的地方,你有什么想法,需求,点子.其实别人早就想到,而且也已经做到. 所以不要高估自己,有什么想法还是GITHUB一下,免得成了井底之娃. 这几天一直在研究p ...
- ActiveMQ入门系列之应用:Springboot+ActiveMQ+JavaMail实现异步邮件发送
现在邮件发送功能已经是几乎每个系统或网址必备的功能了,从用户注册的确认到找回密码再到消息提醒,这些功能普遍的会用到邮件发送功能.我们都买过火车票,买完后会有邮件提醒,有时候邮件并不是买完票立马就能收到 ...
- spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)
一,为什么要使用async异步线程池? 1,在生产环境中,有一些需要延时处理的业务场景: 例如:发送电子邮件, 给手机发短信验证码 大数据量的查询统计 远程抓取数据等 这些场景占用时间较长,而用户又没 ...
- CI框架使用PHPmail插件发送QQ邮件:
有助请顶,不好请评.0:33 2016/3/12CI框架使用PHPmail插件发送QQ邮件:发送成功,不过修改了主机参数,还包含了一个phpmail中的一个另外的文件,详见下方:参见:http://c ...
- 如何利用sendmail发送外部邮件?
在写监控脚本时,为了更好的监控服务器性能,如磁盘空间.系统负载等,有必要在系统出现瓶颈时,及时向管理员进行报告.在这里通常采用邮件报警,同时,邮件设置为收到邮件,即向指定手机号码发送短信.这样可以实现 ...
- outlook 2016 for windows 每次刷新发送接收邮件会弹出登陆界面
Q: outlook2016 for windows 每次刷新发送接收邮件会弹出登陆界面,office365 ProPlus 都是正常激活了,Word 和Excel都不存在此类问题 A: 排除用户的o ...
- 使用phpmailer发送smtp邮件时提示 SMTP Error: Could not authenticate 错误
使用phpmailer发送smtp邮件时提示 SMTP Error: Could not authenticate 错误 这个错误是验证出现错误, $mail->Port = 25; //SMT ...
- 关于NK3C使用富文本编辑器(CKEditor)发送HTML邮件的使用说明
目前NK3C发送HTML邮件使用的的编辑器是CKEditor4.6版本,关于CKEditor的使用说明如下: 1.依赖JQuery1.7版本以上,在xxx.vm中<head>< ...
- .Net Mail SMTP 发送网络邮件
刚刚迈入"开发"的行列 一直有一个想法 我什么时候能给我庞大的用户信息数据库给每一位用户邮箱发送推荐信息呢? 刚迈入"编程两个月的时间" 我采用 SMTP 发送 ...
随机推荐
- Spring(二十一):Spring JdbcTemplate、NamedParameterJdbcTemplate具名参数
JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdate方法:update方法用于执行新增.修 ...
- 使用CSS3生成的电子时钟特效
在线演示 本地下载 突然觉得自己对带工作的态度亟需改正,虽然不喜欢现在的加班生活,但是自己要去接受自己不喜欢的,才能获得自己喜欢的. 这是自己好久之前丛过的一个时钟,网上应该有这个的教程,虽然实现的效 ...
- android自己定义进度值可拖动的seekbar
近期忙找实习,加上实验室在推新项目,须要学习新知识.所以非常长一段时间没去整理了官博客了,github也蛮久没更新.非常羞愧.接下来还是要坚持写. 今天就简单的写一下我在项目中用到的算自己定义seek ...
- Spring3自定义环境配置 <beans profile="">
Spring 3.1的功能,以后就不用为了区分Test, Dev, Production环境,搞几个只有细微区别的application.xml, application-test.xml及引用它们的 ...
- Mac 流程图
https://www.lucidchart.com/pages/signup?utm_expid=39895073-174.qKyHpBEbQS26y86OArD-rQ.1 https://www. ...
- Swift 2.x 升为 swift 3后语法不兼容问题适配
[解决方法]设置 Build Settings —-> Use Legacy Swift Language Version —-> 改为YES
- 树莓派中GPIO针角定义图
一.上图 二.上图
- Emmet (前身为 Zen Coding)
使用示例: 在编辑器中输入缩写代码:ul>li* ,然后按下拓展键(默认为tab),即可得到代码片段: <ul> <li></li> <li>&l ...
- C#判断网站是否能访问或者宕机的方法
最近有位朋友说他有很多网址,可能有些已经过期或者不能访问了.自己去一个一个点可以,但又很麻烦! 再过一段时间又要去检查一次,每次都这样就不方便了! 于是就做了个小程序给帮他检测一下. 以下做了一个例子 ...
- 算法笔记_222:串中取3个不重复字母(Java)
目录 1 问题描述 2 解决方案 1 问题描述 从标准输入读入一个由字母构成的串(不大于30个字符). 从该串中取出3个不重复的字符,求所有的取法. 取出的字符,要求按字母升序排列成一个串. 不同 ...
