ASP.NET发送邮件(同步、异步)
方法1:这种方法的参数比较固定,发送邮件的参数都已经设定好了
写一个类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net.Mail;
using System.Text;
/// <summary>
///发送邮件类
/// </summary>
public class MailService
{
/// <summary>
/// 发送邮件的方法(发送单个收件人)
/// </summary>
/// <param name="fromMail">源邮件地址</param>
/// <param name="toMail">目的邮件地址</param>
/// <param name="loginName">用户名</param>
/// <param name="pass">密码</param>
/// <param name="title">发送邮件的标题</param>
/// <param name="content">发送邮件的内容</param>
public void SendMail( string fromMail, string toMail, string loginName, string pass, string title, string content)
{
MailMessage mailMessage = new MailMessage();
SmtpClient client= new SmtpClient();
//发件人邮箱地址
//mailMessage.From = new MailAddress(fromMail);
//收件人邮箱地址
mailMessage.To.Add(new MailAddress(toMail));
//邮件标题编码
mailMessage.SubjectEncoding = Encoding.UTF8;
//邮件主题
mailMessage.Subject = title;
//邮件内容
mailMessage.Body = content;
//邮件内容编码
mailMessage.BodyEncoding = Encoding.UTF8;
//设置正文内容是否是包含Html的格式
mailMessage.IsBodyHtml = true ;
//发送邮件的优先等级(有效值为High,Low,Normal)
mailMessage.Priority = MailPriority.Normal;
//指定发送邮件的服务器地址或IP
client.Host = @"smtp.163.com"; //固定写
//client.Host = "smtp." + mailMessage.From.Host;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.SendCompleted += new SendCompletedEventHandler(client_SendCompleted);
//指定登录服务器的用户名和密码
client.Credentials = new System.Net.NetworkCredential(loginName, pass);
//发送邮件
//client.Send(mailMessage); //同步发送
client.SendAsync(mailMessage, mailMessage.To); //异步发送 (异步发送时页面上要加上Async="true" )
}
void client_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (e.Cancelled)
{
System.Web.HttpContext.Current.Response.Write("<script>alert('Sending of email message was cancelled.');</script>");
}
if (e.Error == null)
{
System.Web.HttpContext.Current.Response.Write("<script>alert('Mail sent successfully');</script>");
}
else
{
System.Web.HttpContext.Current.Response.Write("<script>alert('Error occured, info=" + e.Error.Message + "');</script>");
}
}
}
如果源发送地址是固定的,那可以在web.config里同配置,代码就会相对减小:
web.config的配置:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="your email address">
<network defaultCredentials="false" host="your eamil ip" port="端口号" userName="your email name" password="your email password"/>
</smtp>
</mailSettings>
</system.net>
上面那个类的SendMail方法的代码就减小为:
/// <summary>
/// 发送邮件的方法(发送单个收件人)
/// </summary>
/// <param name="toMail">目的邮件地址</param>
/// <param name="title">发送邮件的标题</param>
/// <param name="content">发送邮件的内容</param>
public void SendMail(string toMail,string title, string content)
{
//收件人邮箱地址
mailMessage.To.Add(new MailAddress(toMail));
//邮件标题编码
mailMessage.SubjectEncoding = Encoding.UTF8;
//邮件主题
mailMessage.Subject = title;
//邮件内容
mailMessage.Body = content;
//邮件内容编码
mailMessage.BodyEncoding = Encoding.UTF8;
//设置正文内容是否是包含Html的格式
mailMessage.IsBodyHtml = true ;
//发送邮件的优先等级(有效值为High,Low,Normal)
mailMessage.Priority = MailPriority.Normal;
client.SendCompleted += new SendCompletedEventHandler(client_SendCompleted);
//发送邮件
//client.Send(mailMessage); //同步发送
client.SendAsync(mailMessage, mailMessage.To); //异步发送 (异步发送时页面上要加上Async="true" )
}
/// <summary>
/// 发送邮件的方法(发送多个收件人)只有橙色的部分有区别
/// </summary>
/// <param name="toMails">目的邮件地址</param>
/// <param name="title">发送邮件的标题</param>
/// <param name="content">发送邮件的内容</param>
public void SendMail(string[] toMails,string title, string content)
{
//收件人邮箱地址
if (toMails.Length>0)
{
for (int i = 0; i < toMails.Length; i++)
{
mailMessage.To.Add(toMails[i]);
}
}
//邮件标题编码
mailMessage.SubjectEncoding = Encoding.UTF8;
//邮件主题
mailMessage.Subject = title;
//邮件内容
mailMessage.Body = content;
//邮件内容编码
mailMessage.BodyEncoding = Encoding.UTF8;
//设置正文内容是否是包含Html的格式
mailMessage.IsBodyHtml = true ;
//发送邮件的优先等级(有效值为High,Low,Normal)
mailMessage.Priority = MailPriority.Normal;
client.SendCompleted += new SendCompletedEventHandler(client_SendCompleted);
//发送邮件
//发送邮件
//client.Send(mailMessage); //同步发送
client.SendAsync(mailMessage, mailMessage.To); //异步发送 (异步发送时页面上要加上Async="true" )
}
方法2:这种方法的参数比较灵活
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net.Mail;
/// <summary>
///发送邮件类
/// </summary>
public class SmtpMail
{
private SmtpClient client;
private MailMessage message;
public SmtpMail()
{
message = new MailMessage();
client = new SmtpClient();
client.SendCompleted += new SendCompletedEventHandler(client_SendCompleted);
}
/// <summary>
/// delegate 处理邮件发送
/// </summary>
public delegate void SendCompleteHandle(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
/// <summary>
/// event 处理邮件发送完成后的事件
/// </summary>
public event SendCompleteHandle SendComplete;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="host">主机地址/域名</param>
/// <param name="username">发送账户</param>
/// <param name="password">发送密码</param>
/// <param name="port">邮件发送端口</param>
/// <param name="usedefaultcredentials">是否采用默认验证方式</param>
public SmtpMail(string host, string username, string password, int port, bool usedefaultcredentials)
: this()
{
client.UseDefaultCredentials = usedefaultcredentials;
client.Credentials = new System.Net.NetworkCredential(username, password);
client.Host = host;
client.Port = port;
}
/// <summary>
/// 发件人
/// </summary>
public string Form
{
get { return message.From.Address; }
set
{
if (value == null || value == string.Empty) return;
message.From = new MailAddress(value);
message.ReplyTo = message.From;
}
}
/// <summary>
/// 主题
/// </summary>
public string Subject
{
get { return message.Subject; }
set { message.Subject = value; }
}
/// <summary>
/// 内容
/// </summary>
public string Body
{
get { return message.Body; }
set { message.Body = value; }
}
/// <summary>
/// 邮件格式。True:为html,false:为text
/// </summary>
public bool IsBodyHtml
{
get { return message.IsBodyHtml; }
set { message.IsBodyHtml = value; }
}
/// <summary>
/// 邮件标题编码
/// </summary>
public System.Text.Encoding SubjectEncoding
{
get { return message.SubjectEncoding; }
set { message.SubjectEncoding = value; }
}
/// <summary>
/// 邮件内容编码
/// </summary>
public System.Text.Encoding BodyEncoding
{
get { return message.BodyEncoding; }
set { message.BodyEncoding = value; }
}
/// <summary>
/// 发送邮件的优先等级
/// </summary>
public MailPriority Priority
{
get { return message.Priority; }
set { message.Priority = value; }
}
public SmtpDeliveryMethod DeliveryMethod
{
get { return client.DeliveryMethod; }
set { client.DeliveryMethod = value; }
}
/// <summary>
/// 获取邮件是否可以发送
/// </summary>
/// <returns>返回true:邮件可以发送;false:邮件缺少发送的必要因素</returns>
public bool CanSent
{
get
{
if (message.From == null || message.To.Count == 0)
return false;
else
return true;
}
}
private void client_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (SendComplete == null) return;
SendComplete(sender, e);
}
/// <summary>
/// 添加收件人
/// </summary>
/// <param name="to">收件人地址</param>
public void AddTo(params string[] to)
{
for (int i = 0; i < to.Length; i++)
{
message.To.Add(to[i]);
}
}
/// <summary>
/// 清空收件人
/// </summary>
public void ClearMessageTo()
{
message.To.Clear();
}
/// <summary>
/// 发送
/// </summary>
/// <returns></returns>
public void Send()
{
if (message.From == null || message.To.Count == 0)
{
throw new Exception("无效发件人或收件人!");
}
try
{
client.Send(message);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 异步发送
/// </summary>
public void SendAsync()
{
if (message.From == null || message.To.Count == 0)
{
throw new Exception("无效发件人或收件人!");
}
try
{
client.SendAsync(message, message.To);
}
catch (Exception ex)
{
throw ex;
}
}
}
可以在web.config加上方法1的配置
注意:若是异步发送邮件,要在页面上加Async="true"
在页面上调用以上两个方法之中的一个都可以进行同步或异步发送邮件
ASP.NET发送邮件(同步、异步)相关推荐
- 为ASP.NET MVC扩展异步Action功能(下)
本文分为上下两部分,您也可以从<Extend ASP.NET MVC for Asynchronous Action>获得全部内容. 执行Action方法 对于执行同步Action的Syn ...
- asp.net中的异步页面
要想了解asp.net 2.0的异步页的处理过程,先列出页面的生命周期: 1 :init 事件: 页面初始化 ,初始化设置. 2: loadviewstate方法: 加载视图状态, 填充viewsta ...
- 简单理解浏览器的event loop 和 JavaScript的同步异步
为什么JavaScript是单线程的? JavaScript的主要用途是和用户进行交互以及对DOM的操作,为了避免复杂的同步问题(如果多线程,A线程对某DOM添加内容,B线程对它又进行了删除操作,这往 ...
- 异步通知是什么意思_一次相亲经历,我彻底搞懂了阻塞非阻塞、同步异步
看到标题,可能你会想,相亲跟阻塞/非阻塞,同步/异步有啥关系,这个逗b不知道在想什么东西.不要急,且听我慢慢道来 年纪大了,一回家七大姑八大姨就各种催婚,都说要给我介绍女朋友.这不,刚刚门口,我的大姨 ...
- 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!
作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...
- 老张喝茶 教你同步异步 阻塞与非阻塞(转)
原文 老张爱喝茶,废话不说,煮开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响的水壶,简称响水壶). 1 老张把水壶放到火上,立等水开.(同步阻塞) 老张觉得自己有点傻 2 老张把水壶放到火 ...
- Node.js前置知识点(二):同步/异步
前言 本文是node.js前置知识系列文章的第二篇,主要介绍 同步/异步:阻塞/非阻塞 的相关概念 (参考来源 见文末的 Reference) 一 什么是 同步/异步 同样从 What的角度开始介绍, ...
- 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...
常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...
- 同步 异步 阻塞 非阻塞概念区分
老张爱喝茶,废话不说,煮开水. 提前剧透一下:同步和非同步主要用来形容被调用线程,阻塞非阻塞用来形容主线程的. 出场人物:老张(主线程),水壶(被调用线程)两把(普通水壶,简称水壶:会响的水壶,简称响 ...
- 理解同步异步、阻塞与非阻塞
"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1.同步与异步 同步和异 ...
最新文章
- 文件解析库doctotext源码分析
- mysql复习增删改查
- 在WinForm应用程序中嵌入WPF控件(转)
- leetcode13
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 17丨文章浏览 I【难度简单】​
- python字符串转化为数字-python 中判断字符串能否转换为数字类型
- iOS底层探索之类的结构(下):objc_setProperty
- LINUX查找所有文件,按照时间排序
- 口袋妖怪c语言代码大全,口袋妖怪漆黑的魅影金手指代码 游戏代码大全分享
- 深度森林(gcforest)原理讲解以及代码实现
- excel如何把顺序倒过来_excel怎么把顺序倒过来
- docker容器无root 权限,如何获得docker容器里面的root权限
- DOS计算机设置登录密码,bios开机密码怎么设置或取消?bios开机密码操作介绍
- 容器 java 时区_docker容器修改时区(java应用log信息与标准容器时间有八个小时时间差)...
- python socket基于TCP/IP协议实现多人聊天室
- java web中的service,servlet和Dao有什么区别
- DB DBS 和DBMS区别
- 新手如何做游戏代理赚钱?
- 研发者的重要武器!5大就业方向供你选择
- Semantic Structure-BasedWord Embedding by Incorporating Concept Convergence and Word Divergence