使用Net.Mail、CDO组件、JMail组件三种方式发送邮件
原文:使用Net.Mail、CDO组件、JMail组件三种方式发送邮件
一、使用Net.Mail
需要服务器认证,大部分服务器端口为25.
/// <summary>
/// 用MailMessage通过需要认证的SMTP服务器发送邮件,可以发送附件
/// </summary>
/// <param name="frmAddress">发件箱地址,例:myaccount@163.com</param>
/// <param name="password">发件箱登录密码</param>
/// <param name="toAddress">收件箱地址,多个地址使用";"隔开,例:youraccount@sina.com</param>
/// <param name="copyTo">抄送地址,多个地址使用";"隔开,例:hisaccount@QQ.com</param>
/// <param name="mailSubject">邮件主题,例:MailTest</param>
/// <param name="mailContent">邮件内容,例:Hello</param>
/// <param name="mailserver">发件箱所在的SMTP服务器,例:smtp.163.com</param>
public void NetSendMail(string frmAddress, string password, string toAddress, string copyTo, string mailSubject, string mailContent, string mailserver)
{
///添加发件人地址
MailMessage mailMsg = new MailMessage();
mailMsg.From = new MailAddress(frmAddress);
///添加收件人地址
string split = ";";
string[] toList = toAddress.Trim().Split(split.ToCharArray());
for (int i = ; i < toList.Length; i++)
{
mailMsg.To.Add(toList[i].Trim());
}
///添加抄送地址
string[] ccList = copyTo.Trim().Split(split.ToCharArray());
for (int i = ; i < ccList.Length; i++)
{
if (ccList[i].Trim().Length > )
{
mailMsg.CC.Add(ccList[i].Trim());
}
}
///添加邮件主题
mailMsg.Subject = mailSubject.Trim();
mailMsg.SubjectEncoding = Encoding.UTF8;
///添加邮件内容
mailMsg.Body = mailContent;
mailMsg.BodyEncoding = Encoding.UTF8;
mailMsg.IsBodyHtml = true; //正文是否为html样式
///添加邮件附件
HttpFileCollection fileList = HttpContext.Current.Request.Files;
for (int i = ; i < fileList.Count; i++)
{ ///添加单个附件
HttpPostedFile file = fileList[i];
if (file.FileName.Length <= || file.ContentLength <= )
{
break;
}
string path = Server.MapPath("~/FileUpload/"); //附件保存在程序所在的目录FileUpload下
string name = System.IO.Path.GetFileName(file.FileName);
file.SaveAs(path + name);
mailMsg.Attachments.Add(new System.Net.Mail.Attachment(file.FileName));
}
try
{
//实例化SmtpClient邮件发送类对象
SmtpClient client = new SmtpClient(mailserver, ); //大部分smtp服务器的端口是25
//设置用于验证发件人身份的凭据
client.Credentials = new System.Net.NetworkCredential(frmAddress, password);
//发送邮件
client.Send(mailMsg);
Response.Write("<script type='text/javascript'>alert('发送成功!')</script>");
}
catch
{
Response.Write("<script type='text/javascript'>alert('发送失败')</script>");
}
}
二、使用CDO组件
/// <summary>
/// 用CDO组件通过需要认证的SMTP服务器发送邮件。
/// 添加cdosys.dll引用,可以在系统目录(如c:\winnt或c:\windows)的system32子目录中找到它(cdosys.dll)。
/// </summary>
/// <param name="frmAddress">发件箱地址,例:myaccount@163.com</param>
/// <param name="password">发件箱登录密码</param>
/// <param name="toAddress">收件箱地址,多个地址使用";"隔开,例:youraccount@sina.com</param>
/// <param name="copyTo">抄送地址,多个地址使用";"隔开,例:hisaccount@QQ.com</param>
/// <param name="mailSubject">邮件主题,例:MailTest</param>
/// <param name="mailContent">邮件内容,例:Hello</param>
/// <param name="mailserver">发件箱所在的SMTP服务器,例:smtp.163.com</param>
public void CDOSendMail(string frmAddress, string password, string toAddress, string copyTo, string mailSubject, string mailContent, string mailserver)
{
try
{
CDO.Message oMsg = new CDO.Message();
oMsg.From = frmAddress; //添加发件人
oMsg.To = toAddress; //多人用“;”,“,”分开,自动识别,
oMsg.CC = copyTo;
oMsg.Subject = mailSubject;
oMsg.HTMLBody = "<html><body>" + mailContent + "</body></html>";
CDO.IConfiguration iConfg = oMsg.Configuration;
ADODB.Fields oFields = iConfg.Fields;
oFields["http://schemas.microsoft.com/cdo/configuration/sendusing"].Value = ;
oFields["http://schemas.microsoft.com/cdo/configuration/sendemailaddress"].Value = frmAddress;
oFields["http://schemas.microsoft.com/cdo/configuration/smtpaccountname"].Value = toAddress;
oFields["http://schemas.microsoft.com/cdo/configuration/sendusername"].Value = frmAddress;
oFields["http://schemas.microsoft.com/cdo/configuration/sendpassword"].Value = password;
oFields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"].Value = ;
//value=0 代表Anonymous验证方式(不需要验证)
//value=1 代表Basic验证方式(使用basic (clear-text) authentication.
//The configuration sendusername/sendpassword or postusername/postpassword fields are used to specify credentials.)
//Value=2 代表NTLM验证方式(Secure Password Authentication in Microsoft Outlook Express)
oFields["http://schemas.microsoft.com/cdo/configuration/languagecode"].Value = 0x0804;
oFields["http://schemas.microsoft.com/cdo/configuration/smtpserver"].Value = mailserver;
oFields.Update();
oMsg.BodyPart.Charset = "gb2312";
oMsg.HTMLBodyPart.Charset = "gb2312";
//添加邮件附件
HttpFileCollection fileList = HttpContext.Current.Request.Files;
for (int i = ; i < fileList.Count; i++)
{ ///添加单个附件
HttpPostedFile file = fileList[i];
if (file.FileName.Length <= || file.ContentLength <= )
{
break;
}
string path = Server.MapPath("~/FileUpload/"); //附件保存在程序所在的目录FileUpload下
string name = System.IO.Path.GetFileName(file.FileName);
file.SaveAs(path + name);
oMsg.AddAttachment(file.FileName);
}
oMsg.Send();
oMsg = null;
}
catch (Exception e)
{
throw e;
}
}
三、使用JMail组件
/// <summary>
/// 用JMail组件发送邮件。
/// 添加jmail.dll引用
/// </summary>
/// <param name="frmAddress">发件箱地址,例:myaccount@163.com</param>
/// <param name="password">发件箱登录密码</param>
/// <param name="toAddress">收件箱地址,多个地址使用";"隔开,例:youraccount@sina.com</param>
/// <param name="copyTo">抄送地址,多个地址使用";"隔开,例:hisaccount@QQ.com</param>
/// <param name="mailSubject">邮件主题,例:MailTest</param>
/// <param name="mailContent">邮件内容,例:Hello</param>
/// <param name="mailserver">发件箱所在的SMTP服务器,例:smtp.163.com</param>
public bool JMailSendMail(string frmAddress, string password, string toAddress, string copyTo, string mailSubject, string mailContent, string mailserver)
{
try
{
MessageClass jmMessage = new MessageClass();
jmMessage.Charset = "gb2312";
jmMessage.ISOEncodeHeaders = false; //信头编码iso-8859-1字符集
jmMessage.Encoding = "base64"; //附件的编码格式
//jmMessage.ContentType = "text/html"; //正文类型,去掉,否则正文出现乱码
jmMessage.MailServerUserName = frmAddress; //发件箱登录名
jmMessage.MailServerPassWord = password; //发件箱密码
jmMessage.From = frmAddress; //发件箱
jmMessage.Subject = mailSubject;
jmMessage.Body = mailContent;
//回执,当对方阅读了邮件后提醒是否发送回执
jmMessage.ReturnReceipt = true;
jmMessage.AddNativeHeader("Disposition-Notification-To", frmAddress);//回执接受人的邮件地址
//收件箱
string split = ";";
string[] toList = toAddress.Trim().Split(split.ToCharArray());
for (int i = ; i < toList.Length; i++)
{
jmMessage.AddRecipient(toList[i].Trim(), "", "");
}
//抄送
string[] coList = copyTo.Trim().Split(split.ToCharArray());
for (int i = ; i < coList.Length; i++)
{
jmMessage.AddRecipientCC(coList[i].Trim(), "", "");
}
///添加邮件附件
HttpFileCollection fileList = HttpContext.Current.Request.Files;
for (int i = ; i < fileList.Count; i++)
{ ///添加单个附件
HttpPostedFile file = fileList[i];
if (file.FileName.Length <= || file.ContentLength <= )
{
break;
}
string path = Server.MapPath("~/FileUpload/"); //附件保存在程序所在的目录FileUpload下
string name=System.IO.Path.GetFileName(file.FileName);
file.SaveAs(path + name);
jmMessage.AddAttachment(file.FileName);
}
if (jmMessage.Send(mailserver, false))
{
return true;
}
else
{
return false;
}
}
catch (Exception)
{
throw;
}
}
对于JMail组件,通常我们遇到的错误是:'The message was undeliverable. All servers failed to receive the message ',这其实是JMAIL返回的错误,并不是ASP代码产生的,根本原因是MAIL SERVER拒绝了JMAIL的请求.
究其原因,是那些服务器不提供SMTP服务或者没有开启smtp服务;或是在服务器端开启了'禁止邮件中继服务'选项,也就是说不在其允许的IP段或指定范围内的空间里的程序是无法使用其SMTP服务的。解决方案:使用支持smtp的邮件服务器. 使用支持外来jmail申请验证身份,发送邮件的邮件服务器。 最好:使用自己的待遇smtp功能的企业邮局。因为外面的免费的邮局可能会有一些特殊设置,不如防止垃圾邮件,防止盗用邮件身份等等!
Jmail发送首先要通过邮件服务器验证。如果你的服务器不支持SMTP或者你的账号不能使用SMTP服务那么就无法发送。163以前的用户默认是开通POP和SMTP服务的,但新用户都不开通,需要付费才能使用。要想确定某一邮箱是否可以使用POP和SMTP,你可以用foxmail等邮件软件看能否收取该邮箱信件。
目前发现可以通过的stmp服务器有:smtp.qq.com、smtp.163.com,也就是说可以使用该类的邮箱给其他邮箱发送邮件。
使用Net.Mail、CDO组件、JMail组件三种方式发送邮件的更多相关文章
- 黑马vue---56-58、vue组件创建的三种方式
黑马vue---56-58.vue组件创建的三种方式 一.总结 一句话总结: 不论是哪种方式创建出来的组件,组件的 template 属性指向的模板内容,必须有且只能有唯一的一个根元素 1.使用 Vu ...
- Angular 组件通信的三种方式
我们可以通过以下三种方式来实现: 传递一个组件的引用给另一个组件 通过子组件发送EventEmitter和父组件通信 通过serive通信 1. 传递一个组件的引用给另一个组件 Demo1 模板引用变 ...
- React: React组件创建的三种方式
一.简介 在前面介绍的React组件知识中,对于组件的创建我只是用了其中某一种方式.其实,在2013年React诞生之初,对于React组件的创建,仅仅只有一种方式,也即createClass函数,在 ...
- vue组件创建的三种方式
1.使用Vue.extend创建全局的Vue组件 //1.1 使用vue.extend创建组件 var com1 = Vue.extend({ //通过template属性指定组件要展示的html结构 ...
- vue组件传值的三种方式,文字版解释
父传子: 当子组件子父组件中当标签使用的时候,给子组件添加一个自定义属性,值为需要传递的值(如: <Child v-bind:parentToChild="parentMsg" ...
- extjs组件添加事件监听的三种方式
extjs对组件添加监听的三种方式 在定义组件的配置时设置 如代码中所示: Java代码 xtype : 'textarea', name : 'dataSetField', labelSe ...
- React创建组件的三种方式及其区别
内容转载于http://www.cnblogs.com/wonyun/p/5930333.html React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归; 具体的三种方式: ...
- 301-React Ext-React创建组件的三种方式及其区别
一.概述 React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归:具体的三种方式: 函数式定义的无状态组件 es5原生方式React.createClass定义的组件 es6形 ...
- Vue组件之间通信的三种方式
最近在看梁颠编著的<Vue.js实战>一书,感觉颇有收获,特此记录一些比价实用的技巧. 组件是MVVM框架的核心设计思想,将各功能点组件化更利于我们在项目中复用,这类似于我们服务端面向对象 ...
随机推荐
- cocos2d-x lua 学习笔记(1) -- 环境结构
Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...
- spark未来的发展方向
spark是採用scala语言开发的基于内存的计算框架,作者Matei Zaharia,在未来的发展方向: 1.spark streaming:提高spark的流处理能力,使得spark更适于通过一套 ...
- 如何对 GIT 分支进行规划? (转)
项目背景: 该项目是在2011年11月份使用Asp.net三层帮荷兰某个客户开发的机票预定系统 该客户主要是做中国与欧洲的旅行社业务,特别是最近两年由于中国的发展因此客户也越来越重视机票业务 于是他们 ...
- BZOJ 3589 动态树 树链拆分+纳入和排除定理
标题效果:鉴于一棵树.每个节点有一个右值,所有节点正确启动值他们是0.有两种操作模式,0 x y代表x右所有点的子树的根值添加y. 1 k a1 b1 a2 b2 --ak bk代表质疑. 共同拥有者 ...
- Repository、IUnitOfWork和IDbContext
DDD 领域驱动设计-谈谈Repository.IUnitOfWork和IDbContext的实践 上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDb ...
- OpenGL 实现Interpolation插值算法
这是一个静态插值算法的效果,图形学中插值算法应用十分广.如动画.photoshop, autocAD等软件画曲线,还有shader中的渐变上色也是一个硬件支持的插值算法. Interpolation是 ...
- android可扩展自己的定义,运动图像裁剪框
在实际项目中,常常要制作一个简易的图像裁剪功能,即获取一张图片.并用一个遮罩层选择目标范围并截取保存的功能.例如以下图所看到的: 在此分享下该自己定义视图的制作过程. 需求说明 整一个视图包括一个透明 ...
- MYSQL C API 记录
一.环境与条件 MySQL AB 提供了C API,能够提供低等级界面,负责完毕涉及SQLserver交互的大多数常规任务:数据库连接 .查询.结果集处理和错误处置.C API通过两个组件实现: 头文 ...
- zoj-3792-Romantic Value-最小割+数值转化
假设不须要求边的个数的话,就是一个裸的最小割问题. 求边的个数就用边的权值记录一下. #include <stdio.h> #include <iostream> #inclu ...
- POJ 2774 后缀数组:查找最长公共子
思考:其实很easy.就在两个串在一起.通过一个特殊字符,中间分隔,然后找到后缀数组的最长的公共前缀.然后在两个不同的串,最长是最长的公共子串. 注意的是:用第一个字符串来推断是不是在同一个字符中,刚 ...