不管老方法还是新方法,老类还是新类,新架构还是老架构,融会贯通,温故总能知新!加油!
又来了,旧坑未填,新任务又来。
这次是要写一个定时发送邮件的小功能。更多可见就是邮件每年都会收到发送给你的生日祝福、周年庆时发送给你的书信、最新活动的通知信件…
邮箱开通SMTP协议(以163作为例子来)
这里就不对IMAP和POP3的区别进行说明了,可以在邮箱点击“了解更多”自己去了解一下。
① MailMessage:
提供属性和方法来创建一个邮件消息对象,即邮件内容。
② Attachment:
邮件附件。
③ SmtpClient:
将电子邮件传输到您指定用于邮件传送的 SMTP 主机。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Mail;
using System.Net;
namespace send_mail
{
class Program
{
static void Main(string[] args)
{
//构建邮件的消息对象,即邮件内容
MailMessage message = new MailMessage();
//From设置电子邮件的发件人地址
message.From = new MailAddress("发件人邮箱@163.com");
//TO获取电子邮件收件人的地址,Add向集合添加电子邮件地址列表
message.To.Add("收件人[email protected]");
message.To.Add("收件人[email protected]");
//电子邮件的主题行
message.Subject = "这是邮件的标题";
//电子邮件的内容
message.Body = "这是邮件的内容,巴拉巴拉~";
//电子邮件的附件
Attachment attachment = new Attachment(@"F:\\My_Code\\send_mail_test.txt");
message.Attachments.Add(attachment);
//使用简单邮件传输协议(SMPT)来发送电子邮件
SmtpClient smtpClient = new SmtpClient();
//SMTP事务的主机名或IP地址
smtpClient.Host = "smtp.163.com";
//验证发件人的身份凭证
smtpClient.Credentials = new NetworkCredential("发件人邮箱@163.com", "开启邮箱POP3/SMTP服务后获得的授权密码");
smtpClient.Send(message);
}
}
}
以上是163邮箱作为发送邮箱的例子,QQ邮箱的用法其实也是一样的,就是把SMTP事务的主机名或IP地址【smtpClient.Host = “smtp.163.com”】,修改城QQ邮箱的主机【smtpClient.Host = “smtp.qq.com”】就行了,当然,发送邮箱也得是QQ邮箱。
上面收件人只有少数的情况,可以直接写在cs中,但是如果发件邮箱需要方便替换、收件人/人数并不是固定的,并且邮件内容也不是固定的呢?
很简单,需要方便修改的话就写在配置文件,收件人不固定的话就从数据库取数出来再循环赋值,内容不固定就给一个填写框填写邮件内容咯~
① 数据库user_info表
从表中取电子邮箱地址,循环发送。(这里的电子邮箱地址肯定是乱写的啦~)
② App.config配置文件
<appSettings>
<add key="mail_from" value="发件人@163.com" />
<add key="mail_from_smtp" value="发件人邮箱smtp授权码" />
<add key="mail_to_worry" value="接受报错的处理人邮箱@qq.com" />
</appSettings>
③ Program.cs代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Mail;
using System.Net;
using System.Configuration;
namespace send_mail
{
class Program
{
//发送邮件的邮箱地址
private static string mail_from = ConfigurationManager.AppSettings["mail_from"].ToString();
//发送邮件的邮箱SMTP授权码
private static string mail_from_smtp = ConfigurationManager.AppSettings["mail_from_smtp"].ToString();
//接受报错处理的收件人
private static string mail_to_worry = ConfigurationManager.AppSettings["mail_to_worry"].ToString();
static void Main(string[] args)
{
string empl_name, empl_mail, str;
List<empl_info_model> list = null;
//从数据库取出收件人的姓名、邮箱地址
list = empl_info_DAL.get_empl_info();
try
{
if (list != null)
{
for (int i = 0; i < list.Count; i++)
{
empl_name = list[i].empl_name;
empl_mail = list[i].empl_mail;
//发送生日祝福邮件,向send_email传mail_title、mail_body、mail_to
send_email(empl_name+"生日快乐", "祝你生日快乐,巴拉巴拉的祝福语~", empl_mail);
}
}
}
catch (Exception ex)//发送失败时,报错信息发送邮件通知管理员
{
str = "生日祝福邮件发送失败:"+"\r\n" + ex;
send_email("生日祝福邮件发送失败", str, mail_to_worry);
}
}
///
/// 发送邮件
///
/// 邮件标题
/// 邮件内容
/// 邮件接收信箱
public static void send_email(string mail_title, string mail_body, string mail_to)
{
//构建邮件的消息对象,即邮件内容
MailMessage message = new MailMessage();
//From设置电子邮件的发件人地址
message.From = new MailAddress(mail_from);
//TO获取电子邮件收件人的地址,Add向集合添加电子邮件地址列表
message.To.Add(mail_to);
//电子邮件的主题行
message.Subject = mail_title;
//电子邮件的内容
message.Body = mail_body;
//电子邮件的附件
Attachment attachment = new Attachment(@"F:\\My_Code\\send_mail_test.txt");
message.Attachments.Add(attachment);
//使用简单邮件传输协议(SMPT)来发送电子邮件
SmtpClient smtpClient = new SmtpClient();
//SMTP事务的主机名或IP地址
smtpClient.Host = "smtp.163.com";
//验证发件人的身份凭证
smtpClient.Credentials = new NetworkCredential(mail_from, mail_from_smtp);
smtpClient.Send(message);
}
}
}
话有一些代码中的empl_info_model模型、empl_info_DAL数据层连接类、empl_info_DAL.get_empl_info获取数据库中user_info表的用户名、用户邮箱…太多了就不一一贴代码了,发一个资源包吧?
但是!到微软的官网,会发现!
额…如果只是简单地用于发送邮件,SmtpClient类还是适用的,微软也不可能完全撤掉这个方法吧,毕竟还有那么多需要兼容的旧系统不是,哈~
如果用.net core做新项目的话,还是用官网推荐使用的MailKit吧,适用更多的电子邮件标准。(目前就暂不研究了。)
我就直接使用win自带的定时任务了。
步骤:
win10:win+x→计算机管理→任务计划程序→创建基本任务…
创建定时任务的各个步骤就不一一演示了,如图。
启动程序时添加的【程序或脚本】为上面send_mail项目中生成的Debug中的exe程序。
就这样,定时给你发送生日祝福邮件的小功能就完成啦!碎觉!
【Asp.net】C#如何发送电子邮件
记录,打板!