ASP.NET MVC 模块与组件(一)——发送邮件
我的见解:
模块化与组件化是编程的一种思想:提高代码的重用性,提高开发效率。
常见的模块化就是函数与各种类型的封装,若是代码具有更高的重用价值(能够提供给别人使用),建议可以考虑封装成动态链接库(dll),直接引用使用。
常见的组件化就是将各种需求功能封装成一系列完整的文档(比模块化要求更高、更完整),要用的时候直接引用对应的文件就可以使用。
说了那么多,我们就直奔今天的主题:在用ASP.NET 技术开发Web网站的时候,如何实现发送邮件的功能?
下面的是一个专门用来发送邮件的类(封装好了,可以直接编译成动态链接库,方便以后重复使用)(默认是以Html格式发送的邮件)
- using System;
- using System.IO;
- using System.Net.Mail;
- using System.Net.Mime;
- namespace DllLibrary.SendEmail
- {
- /// <summary>
- /// 发送邮件的类
- /// </summary>
- public class Email
- {
- private MailMessage mMailMessage; //主要处理发送邮件的内容(如:收发人地址、标题、主体、图片等等)
- private SmtpClient mSmtpClient; //主要处理用smtp方式发送此邮件的配置信息(如:邮件服务器、发送端口号、验证方式等等)
- private int mSenderPort; //发送邮件所用的端口号(htmp协议默认为25)
- private string mSenderServerHost; //发件箱的邮件服务器地址(IP形式或字符串形式均可)
- private string mSenderPassword; //发件箱的密码
- private string mSenderUsername; //发件箱的用户名(即@符号前面的字符串,例如:hello@163.com,用户名为:hello)
- private bool mEnableSsl; //是否对邮件内容进行socket层加密传输
- private bool mEnablePwdAuthentication; //是否对发件人邮箱进行密码验证
- ///<summary>
- /// 构造函数
- ///</summary>
- ///<param name="server">发件箱的邮件服务器地址</param>
- ///<param name="toMail">收件人地址(可以是多个收件人,程序中是以“;"进行区分的)</param>
- ///<param name="fromMail">发件人地址</param>
- ///<param name="subject">邮件标题</param>
- ///<param name="emailBody">邮件内容(可以以html格式进行设计)</param>
- ///<param name="username">发件箱的用户名(即@符号前面的字符串,例如:hello@163.com,用户名为:hello)</param>
- ///<param name="password">发件人邮箱密码</param>
- ///<param name="port">发送邮件所用的端口号(htmp协议默认为25)</param>
- ///<param name="sslEnable">true表示对邮件内容进行socket层加密传输,false表示不加密</param>
- ///<param name="pwdCheckEnable">true表示对发件人邮箱进行密码验证,false表示不对发件人邮箱进行密码验证</param>
- public Email(string server, string toMail, string fromMail, string subject, string emailBody, string username, string password, string port, bool sslEnable, bool pwdCheckEnable)
- {
- try
- {
- mMailMessage = new MailMessage();
- mMailMessage.To.Add(toMail);
- mMailMessage.From = new MailAddress(fromMail);
- mMailMessage.Subject = subject;
- mMailMessage.Body = emailBody;
- mMailMessage.IsBodyHtml = true;
- mMailMessage.BodyEncoding = System.Text.Encoding.UTF8;
- mMailMessage.Priority = MailPriority.Normal;
- this.mSenderServerHost = server;
- this.mSenderUsername = username;
- this.mSenderPassword = password;
- this.mSenderPort = Convert.ToInt32(port);
- this.mEnableSsl = sslEnable;
- this.mEnablePwdAuthentication = pwdCheckEnable;
- }
- catch (Exception ex)
- {
- throw ex;
- //Console.WriteLine(ex.ToString());
- }
- }
- ///<summary>
- /// 添加附件
- ///</summary>
- ///<param name="attachmentsPath">附件的路径集合,以分号分隔</param>
- public void AddAttachments(string attachmentsPath)
- {
- try
- {
- string[] path = attachmentsPath.Split(';'); //以什么符号分隔可以自定义
- Attachment data;
- ContentDisposition disposition;
- for (int i = ; i < path.Length; i++)
- {
- data = new Attachment(path[i], MediaTypeNames.Application.Octet);
- disposition = data.ContentDisposition;
- disposition.CreationDate = File.GetCreationTime(path[i]);
- disposition.ModificationDate = File.GetLastWriteTime(path[i]);
- disposition.ReadDate = File.GetLastAccessTime(path[i]);
- mMailMessage.Attachments.Add(data);
- }
- }
- catch (Exception ex)
- {
- throw ex;
- //Console.WriteLine(ex.ToString());
- }
- }
- /// <summary>
- /// 邮件的发送
- /// </summary>
- /// <returns>发送成功返回true,否则返回false</returns>
- public bool Send()
- {
- try
- {
- if (mMailMessage != null)
- {
- mSmtpClient = new SmtpClient();
- //mSmtpClient.Host = "smtp." + mMailMessage.From.Host;
- mSmtpClient.Host = this.mSenderServerHost;
- mSmtpClient.Port = this.mSenderPort;
- mSmtpClient.UseDefaultCredentials = false;
- mSmtpClient.EnableSsl = this.mEnableSsl;
- if (this.mEnablePwdAuthentication)
- {
- System.Net.NetworkCredential nc = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);
- //mSmtpClient.Credentials = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);
- //NTLM: Secure Password Authentication in Microsoft Outlook Express
- mSmtpClient.Credentials = nc.GetCredential(mSmtpClient.Host, mSmtpClient.Port, "NTLM");
- }
- else
- {
- mSmtpClient.Credentials = new System.Net.NetworkCredential(this.mSenderUsername, this.mSenderPassword);
- }
- mSmtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
- mSmtpClient.Send(mMailMessage);
- }
- }
- catch
- {
- return false;
- }
- return true;
- }
- }
- }
使用这个发送邮箱类的实例代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text.RegularExpressions;
- using System.Web;
- using System.Web.Mvc;
- using System.Web.Security;
- using Test.Models;
- using DllLibrary.SendEmail;//引入对应命名空间
- namespace Test.Controllers
- {
- public class HomeController : Controller
- {
- /// <summary>
- /// 发送邮件
- /// </summary>
- /// <param name="title">邮件主题</param>
- /// <param name="email">要发送对象的邮箱</param>
- /// <param name="content">邮件内容</param>
- /// <returns></returns>
- public ActionResult SendMail(string title, string email, string content)
- {
- string senderServerIp = "smtp.163.com"; //使用163代理邮箱服务器(也可是使用qq的代理邮箱服务器,但需要与具体邮箱对相应)
- string toMailAddress = email; //要发送对象的邮箱
- string fromMailAddress = "XXXXXX@163.com";//你的邮箱
- string subjectInfo = title; //主题
- string bodyInfo = "<p>" + content + "</p>";//以Html格式发送的邮件
- string mailUsername = "XXX"; //登录邮箱的用户名
- string mailPassword = "xomeagyungxzhsxf"; //对应的登录邮箱的第三方密码(你的邮箱不论是163还是qq邮箱,都需要自行开通stmp服务)
- string mailPort = ""; //发送邮箱的端口号
- //string attachPath = "E:\\123123.txt; E:\\haha.pdf";
- //创建发送邮箱的对象
- Email myEmail = new Email(senderServerIp, toMailAddress, fromMailAddress, subjectInfo, bodyInfo, mailUsername, mailPassword, mailPort, false, false);
- //添加附件
- //email.AddAttachments(attachPath);
- if (myEmail.Send())
- {
- return Content("<script>alert('邮件已成功发送!')</script>");
- }
- else
- {
- return Content("<script>alert('邮件发送失败!')</script>");
- }
- }
- }
- }
简单说明:要发送邮件,需要开通一个stmp服务的邮箱号。(可以到163官网申请一个163邮箱,并且开通stmp服务就可以了(注:示例代码中所使用的密码是在开通stmp服务时,单独发送的第三方登录密码,而不是登录邮箱的密码))
好了,这次分享就到这里了,下次继续。。。
<我的博客主页>:http://www.cnblogs.com/forcheng/
ASP.NET MVC 模块与组件(一)——发送邮件的更多相关文章
- ASP.NET MVC 模块与组件(二)——定制图片验证码
本着简洁直接,我们就直奔主题吧! 下面是一个生成数字和字母随机组合的验证码类源代码: using System; using System.Drawing; using System.Drawing ...
- asp.net mvc 模型验证组件——FluentValidation
asp.net mvc 模型验证组件——FluentValidation 示例 using FluentValidation; public class CustomerValidator: Abst ...
- asp.net MVC通用分页组件 使用方便 通用性强
asp.net MVC通用分页组件 使用方便 通用性强 该分页控件的显示逻辑: 1 当前页面反色突出显示,链接不可点击 2 第一页时首页链接不可点击 3 最后一页时尾页链接不可点击 4 当前页面左 ...
- 理解ASP.NET MVC的DependencyResolver组件
一.前言 DependencyResolver是MVC中一个重要的组件,从名字可以看出,它负责依赖对象的解析,可以说它是MVC框架内部使用的一个IOC容器.MVC内部很多对象的创建都是通过它完成的,或 ...
- 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC
系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...
- 通过一个模拟程序让你明白ASP.NET MVC是如何运行的
ASP.NET MVC的路由系统通过对HTTP请求的解析得到表示Controller.Action和其他相关的数据,并以此为依据激活Controller对象,调用相应的Action方法,并将方法返回的 ...
- 7 天玩转 ASP.NET MVC — 第 1 天
0. 前言正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET M ...
- 7 天玩转 ASP.NET MVC - 第 1 天
0. 前言 正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET ...
- ASP.NET MVC总结
一.概述 1.单元测试的NUnit, MBUnit, MSTest, XUnit以及其他的框架 2.ASP.NET MVC 应用的默认目录结构有三个顶层目录: Controllers.Models.V ...
随机推荐
- 简单一招实现json数据可视化
开发一个内部功能时碰到的需求,要把json数据在页面上展示出来,平时浏览器会安装jsonView这样的扩展来看json数据,但是程序要用到的话该怎么办呢?今天在网上搜索的时候,发现了这个小技巧,分享一 ...
- 利用C#自带组件强壮程序日志
在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简单的栗子,只是说明这个框架是怎么工 ...
- [备忘]没有为扩展名“.cshtml”注册的生成提供程序
webconfig中配置 <compilation debug="true" targetFramework="4.5.1"> < ...
- ls /usr/linkapp 没反应
ls /usr/linkapp ll /usr/linkapp 都是一样无反应 没有任何反应, ctrl + c / ctrl + d 都不行 但是 ls /usr/linkapp/ | wc - ...
- Objective-C 外观模式--简单介绍和使用
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 在以下情况下可以考虑使用外观模式: (1)设计初期阶段,应该有意识的将不同层分 ...
- [大数据之Spark]——快速入门
本篇文档是介绍如何快速使用spark,首先将会介绍下spark在shell中的交互api,然后展示下如何使用java,scala,python等语言编写应用.可以查看编程指南了解更多的内容. 为了良好 ...
- Minor【 PHP框架】5.事件
框架Github地址:github.com/Orlion/Minor (如果觉得还不错给个star哦(^-^)V) 框架作者: Orlion 知乎:https://www.zhihu.com/peop ...
- PHP浅复制与深复制
原文链接:http://www.orlion.ga/731/ php用clone复制对象有一个问题,下面用代码来说明问题: class Foo{ public $bar; public $name; ...
- c#代码命名规则
c#代码命名规则 以前没有考虑过命名的这个问题,写起来就是随心所欲,想怎么搞就怎么搞,在但是代码越写越乱,连自己都搞不清楚了,不得不进行认真考虑.参考了一些文章,形成以下想法: 一. ...
- Android 文件读写
一.分类 文件读写作为Android四大数据存储方式之一,又分为内部存储和外部存储两种: (1)内部存储(Internal storage): 总是可用. 文件默认情况存储在/data/data/包名 ...