开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

使用Net.Mail、CDO组件、JMail组件三种方式发送邮件

简介: 原文:使用Net.Mail、CDO组件、JMail组件三种方式发送邮件 一、使用Net.Mail          需要服务器认证,大部分服务器端口为25. View Code 1 /// 2 /// 用MailMessage通过需要认证的SMTP服务器发送邮件,可以发送附件 3 /// 4 /// 发件箱地址,例:myaccount@163.
+关注继续查看
原文:使用Net.Mail、CDO组件、JMail组件三种方式发送邮件

一、使用Net.Mail

         需要服务器认证,大部分服务器端口为25.

View Code
 1         /// <summary>
2 /// 用MailMessage通过需要认证的SMTP服务器发送邮件,可以发送附件
3 /// </summary>
4 /// <param name="frmAddress">发件箱地址,例:myaccount@163.com</param>
5 /// <param name="password">发件箱登录密码</param>
6 /// <param name="toAddress">收件箱地址,多个地址使用";"隔开,例:youraccount@sina.com</param>
7 /// <param name="copyTo">抄送地址,多个地址使用";"隔开,例:hisaccount@QQ.com</param>
8 /// <param name="mailSubject">邮件主题,例:MailTest</param>
9 /// <param name="mailContent">邮件内容,例:Hello</param>
10 /// <param name="mailserver">发件箱所在的SMTP服务器,例:smtp.163.com</param>
11 public void NetSendMail(string frmAddress, string password, string toAddress, string copyTo, string mailSubject, string mailContent, string mailserver)
12 {
13 ///添加发件人地址
14 MailMessage mailMsg = new MailMessage();
15 mailMsg.From = new MailAddress(frmAddress);
16 ///添加收件人地址
17 string split = ";";
18 string[] toList = toAddress.Trim().Split(split.ToCharArray());
19 for (int i = 0; i < toList.Length; i++)
20 {
21 mailMsg.To.Add(toList[i].Trim());
22 }
23
24 ///添加抄送地址
25 string[] ccList = copyTo.Trim().Split(split.ToCharArray());
26 for (int i = 0; i < ccList.Length; i++)
27 {
28 if (ccList[i].Trim().Length > 0)
29 {
30 mailMsg.CC.Add(ccList[i].Trim());
31 }
32 }
33
34 ///添加邮件主题
35 mailMsg.Subject = mailSubject.Trim();
36 mailMsg.SubjectEncoding = Encoding.UTF8;
37
38 ///添加邮件内容
39 mailMsg.Body = mailContent;
40 mailMsg.BodyEncoding = Encoding.UTF8;
41 mailMsg.IsBodyHtml = true; //正文是否为html样式
42
43 ///添加邮件附件
44 HttpFileCollection fileList = HttpContext.Current.Request.Files;
45 for (int i = 0; i < fileList.Count; i++)
46 { ///添加单个附件
47 HttpPostedFile file = fileList[i];
48 if (file.FileName.Length <= 0 || file.ContentLength <= 0)
49 {
50 break;
51 }
52 string path = Server.MapPath("~/FileUpload/"); //附件保存在程序所在的目录FileUpload下
53 string name = System.IO.Path.GetFileName(file.FileName);
54 file.SaveAs(path + name);
55 mailMsg.Attachments.Add(new System.Net.Mail.Attachment(file.FileName));
56 }
57 try
58 {
59 //实例化SmtpClient邮件发送类对象
60 SmtpClient client = new SmtpClient(mailserver, 25); //大部分smtp服务器的端口是25
61 //设置用于验证发件人身份的凭据
62 client.Credentials = new System.Net.NetworkCredential(frmAddress, password);
63 //发送邮件
64 client.Send(mailMsg);
65 Response.Write("<script type='text/javascript'>alert('发送成功!')</script>");
66 }
67 catch
68 {
69 Response.Write("<script type='text/javascript'>alert('发送失败')</script>");
70 }
71 }

 

二、使用CDO组件

View Code
 1 /// <summary>
2 /// 用CDO组件通过需要认证的SMTP服务器发送邮件。
3 /// 添加cdosys.dll引用,可以在系统目录(如c:\winnt或c:\windows)的system32子目录中找到它(cdosys.dll)。
4 /// </summary>
5 /// <param name="frmAddress">发件箱地址,例:myaccount@163.com</param>
6 /// <param name="password">发件箱登录密码</param>
7 /// <param name="toAddress">收件箱地址,多个地址使用";"隔开,例:youraccount@sina.com</param>
8 /// <param name="copyTo">抄送地址,多个地址使用";"隔开,例:hisaccount@QQ.com</param>
9 /// <param name="mailSubject">邮件主题,例:MailTest</param>
10 /// <param name="mailContent">邮件内容,例:Hello</param>
11 /// <param name="mailserver">发件箱所在的SMTP服务器,例:smtp.163.com</param>
12 public void CDOSendMail(string frmAddress, string password, string toAddress, string copyTo, string mailSubject, string mailContent, string mailserver)
13 {
14 try
15 {
16 CDO.Message oMsg = new CDO.Message();
17
18 oMsg.From = frmAddress; //添加发件人
19
20 oMsg.To = toAddress; //多人用“;”,“,”分开,自动识别,
21
22 oMsg.CC = copyTo;
23 oMsg.Subject = mailSubject;
24 oMsg.HTMLBody = "<html><body>" + mailContent + "</body></html>";
25 CDO.IConfiguration iConfg = oMsg.Configuration;
26 ADODB.Fields oFields = iConfg.Fields;
27
28 oFields["http://schemas.microsoft.com/cdo/configuration/sendusing"].Value = 2;
29 oFields["http://schemas.microsoft.com/cdo/configuration/sendemailaddress"].Value = frmAddress;
30 oFields["http://schemas.microsoft.com/cdo/configuration/smtpaccountname"].Value = toAddress;
31 oFields["http://schemas.microsoft.com/cdo/configuration/sendusername"].Value = frmAddress;
32 oFields["http://schemas.microsoft.com/cdo/configuration/sendpassword"].Value = password;
33 oFields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"].Value = 1;
34 //value=0 代表Anonymous验证方式(不需要验证)
35 //value=1 代表Basic验证方式(使用basic (clear-text) authentication.
36 //The configuration sendusername/sendpassword or postusername/postpassword fields are used to specify credentials.)
37 //Value=2 代表NTLM验证方式(Secure Password Authentication in Microsoft Outlook Express)
38 oFields["http://schemas.microsoft.com/cdo/configuration/languagecode"].Value = 0x0804;
39 oFields["http://schemas.microsoft.com/cdo/configuration/smtpserver"].Value = mailserver;
40
41 oFields.Update();
42 oMsg.BodyPart.Charset = "gb2312";
43 oMsg.HTMLBodyPart.Charset = "gb2312";
44
45
46 //添加邮件附件
47 HttpFileCollection fileList = HttpContext.Current.Request.Files;
48 for (int i = 0; i < fileList.Count; i++)
49 { ///添加单个附件
50 HttpPostedFile file = fileList[i];
51 if (file.FileName.Length <= 0 || file.ContentLength <= 0)
52 {
53 break;
54 }
55 string path = Server.MapPath("~/FileUpload/"); //附件保存在程序所在的目录FileUpload下
56 string name = System.IO.Path.GetFileName(file.FileName);
57 file.SaveAs(path + name);
58 oMsg.AddAttachment(file.FileName);
59 }
60
61 oMsg.Send();
62 oMsg = null;
63 }
64 catch (Exception e)
65 {
66 throw e;
67 }
68 }

 

三、使用JMail组件

View Code
 1         /// <summary>
2 /// 用JMail组件发送邮件。
3 /// 添加jmail.dll引用
4 /// </summary>
5 /// <param name="frmAddress">发件箱地址,例:myaccount@163.com</param>
6 /// <param name="password">发件箱登录密码</param>
7 /// <param name="toAddress">收件箱地址,多个地址使用";"隔开,例:youraccount@sina.com</param>
8 /// <param name="copyTo">抄送地址,多个地址使用";"隔开,例:hisaccount@QQ.com</param>
9 /// <param name="mailSubject">邮件主题,例:MailTest</param>
10 /// <param name="mailContent">邮件内容,例:Hello</param>
11 /// <param name="mailserver">发件箱所在的SMTP服务器,例:smtp.163.com</param>
12 public bool JMailSendMail(string frmAddress, string password, string toAddress, string copyTo, string mailSubject, string mailContent, string mailserver)
13 {
14 try
15 {
16 MessageClass jmMessage = new MessageClass();
17 jmMessage.Charset = "gb2312";
18 jmMessage.ISOEncodeHeaders = false; //信头编码iso-8859-1字符集
19 jmMessage.Encoding = "base64"; //附件的编码格式
20 //jmMessage.ContentType = "text/html"; //正文类型,去掉,否则正文出现乱码
21
22 jmMessage.MailServerUserName = frmAddress; //发件箱登录名
23 jmMessage.MailServerPassWord = password; //发件箱密码
24
25 jmMessage.From = frmAddress; //发件箱
26
27 jmMessage.Subject = mailSubject;
28 jmMessage.Body = mailContent;
29
30 //回执,当对方阅读了邮件后提醒是否发送回执
31 jmMessage.ReturnReceipt = true;
32 jmMessage.AddNativeHeader("Disposition-Notification-To", frmAddress);//回执接受人的邮件地址
33
34 //收件箱
35 string split = ";";
36 string[] toList = toAddress.Trim().Split(split.ToCharArray());
37 for (int i = 0; i < toList.Length; i++)
38 {
39 jmMessage.AddRecipient(toList[i].Trim(), "", "");
40 }
41
42 //抄送
43 string[] coList = copyTo.Trim().Split(split.ToCharArray());
44 for (int i = 0; i < coList.Length; i++)
45 {
46 jmMessage.AddRecipientCC(coList[i].Trim(), "", "");
47 }
48
49 ///添加邮件附件
50 HttpFileCollection fileList = HttpContext.Current.Request.Files;
51 for (int i = 0; i < fileList.Count; i++)
52 { ///添加单个附件
53 HttpPostedFile file = fileList[i];
54 if (file.FileName.Length <= 0 || file.ContentLength <= 0)
55 {
56 break;
57 }
58 string path = Server.MapPath("~/FileUpload/"); //附件保存在程序所在的目录FileUpload下
59 string name=System.IO.Path.GetFileName(file.FileName);
60 file.SaveAs(path + name);
61 jmMessage.AddAttachment(file.FileName);
62 }
63
64 if (jmMessage.Send(mailserver, false))
65 {
66 return true;
67 }
68 else
69 {
70 return false;
71 }
72 }
73 catch (Exception)
74 {
75
76 throw;
77 }
78 }

 

      对于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,也就是说可以使用该类的邮箱给其他邮箱发送邮件。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringBoot系列之邮件发送姿势介绍
邮件发送,在实际的项目开发中,可能用的不是特别多,如果没有特定的需求,相信也没有多少小伙伴会特意的去关注,那么如果现在我们希望针对项目做一个异常的报警系统,当出现异常的时候,可以向指定的小伙伴发送邮件提醒,那么让我们来实现这个功能,可以怎么办呢? 这里介绍一下如何使用SpringBoot封装好的MailSender来实现邮件发送
76 0
Jenkins 踩坑(三)| Email 配置与任务邮件发送
- 在系统管理->插件管理中下载插件: 1.通过网页端 QQ 邮箱的设置进入到邮箱客户端设置页面。 2.找到邮箱的基础信息。 3.在 Jenkins:系统管理->系统配置中,最底部找到邮件通知,打开高级: 4.填入配置信息后如下: 5.注意到在配置的下方有个"通过发送测试邮件测试配置",我们可以讲其勾选,填入邮箱地址,点击Test configuration来先测试一下邮件的发送. 6.如果按
73 0
Spring Cloud 2.x系列之springboot发送邮件
虽然现在短信验证已经最流行也是最常用的验证方式;但是邮件验证还是必不可少,依然是网站的必备功能之一。什么注册验证,忘记密码或者是给用户发送营销信息都是可以使用邮件发送功能的。最早期使用JavaMail的相关api来进行发送邮件的功能开发,后来spring整合了JavaMail的相关api推出了JavaMailSender更加简化了邮件发送的代码编写,现在springboot对此进行了封装就有了现在的spring-boot-starter-mail。
5380 0
使用Java类加载SpringBoot、SpringCloud配置文件
版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/81750872 我们都知道平常在使用SpringBoot和SpringCloud的时候,如果需要加载一两个配置文件的话我们通常使用@Value("${属性名称}")注解去加载。
971 0
java email 邮件
关键字: java email 邮件 记得曾经学习用javamail发邮件,学了2天,大概搞明白了利用javamail发邮件的方法和注意事项。
1009 0
+关注
杰克.陈
一个安静的程序猿~
10424
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载