/*
* 测试了网易和qq邮箱,能发是能发但是,对所发的邮件标题和内容是有限制的,不能发很容就能识别出来是垃圾邮件的邮件,标题和正文要正式点,负责不会接收到。
* 在生产环境中:无法使用163、qq等这种免费邮箱发送大量的邮件。
* Edm专用服务器,掏钱就ok。
SendCloud、Comm100、yiye
*/
邮件发送代码:
public static void SendEmail(string toEmail, string subject, string body)
{
string smtpServer = ConfigurationManager.AppSettings["SmtpServer"];
string smtpFrom = ConfigurationManager.AppSettings["SmtpFrom"];
string smtpUserName = ConfigurationManager.AppSettings["SmtpUserName"];
string smtpPassword = ConfigurationManager.AppSettings["SmtpPassword"];
MailMessage mailObj = new MailMessage();
mailObj.IsBodyHtml = true;
//from:abc@qq.com
mailObj.From = new MailAddress(smtpFrom); //发送人邮箱地址
mailObj.To.Add(toEmail); //收件人邮箱地址
mailObj.Subject = subject; //主题
mailObj.Body = body; //正文
SmtpClient smtp = new SmtpClient();//通过.Net内置的SmtpClient类和邮件服务器进行通讯,发送邮件。
//是和发邮件方的smtp通讯,由发邮件方的邮件服务器和收邮件方的邮件服务器通讯进行邮件的转接。
smtp.Host = smtpServer; //smtp服务器名称
smtp.UseDefaultCredentials = true;
smtp.Credentials = new NetworkCredential(smtpUserName, smtpPassword); //发送人的登录名和密码
smtp.Send(mailObj);
}
关于邮箱的账号和密码最好配置到配置文件中。为了安全。
好好思考一下这样写的缺陷在哪?不仅有缺陷而且还有安全问题,有哪些安全问题?如果用户量大的话这样设计是否合理?会对什么有压力?如果不合理该如何优化?
首先我们来分析一下:
上面的方法是在用户表的基础上再增加一个字段,用来存激活码。这样合理吗?
由于激活码只用一次,所以在用户表的基础上再增加一个字段会麻烦一下,之前的功能会有影响。那到底该怎么解决比较好?
这时候Redis的好处就非常明显了,key-value数据库,并且还能设置数据的有效时间,很好的解决了上面遇到的问题,只需要改动上面很少的一部分代码就可以实现想要的功能。
代码如下:
1 //方案二:把激活码存入的Redis中(最佳) 2 //Redis代替数据库保存UserName和激活码的字典结构 3 using (var client = RedisManager.ClientManager.GetClient()) 4 { 5 client.Set<string>(ACTIVECODE_PREFIX + username, activeCode, DateTime.Now.AddMinutes(30)); 6 }
View Code如果到这里真的就OK了吗?大家可以想想为什么我要添加下面的这段代码:
1 //把注册用户信息,放入消息队列。便于另外一个程序来获取消息队列数据,发送邮件 2 using (var client = RedisManager.ClientManager.GetClient()) 3 { 4 string info = username + "|" + email; 5 client.EnqueueItemOnList("NewRegUsers", info); 6 }
下面关于Redis的文章您也可能喜欢,不妨参考下:
Ubuntu 14.04下Redis安装及简单测试
CentOS 7下Redis的安装与配置
Ubuntu 16.04环境中安装PHP7.0 Redis扩展
CentOS 7.0 安装Redis 3.2.1详细过程和使用常见问题