【Asp.net】C#如何发送电子邮件

不管老方法还是新方法,老类还是新类,新架构还是老架构,融会贯通,温故总能知新!加油!

又来了,旧坑未填,新任务又来。
这次是要写一个定时发送邮件的小功能。更多可见就是邮件每年都会收到发送给你的生日祝福、周年庆时发送给你的书信、最新活动的通知信件…


一、我的环境

  • Window10
  • IIS 10.0
  • Visual Studio 2019(asp.net用4.5的框架)
  • SQL Server 2014 Management Studio

二、信箱的设置

邮箱开通SMTP协议(以163作为例子来)

1、开启POP3/SMTP服务

【Asp.net】C#如何发送电子邮件_第1张图片
这里就不对IMAP和POP3的区别进行说明了,可以在邮箱点击“了解更多”自己去了解一下。


2、POP3/SMTP服务的知识点补充

  • POP3用于接收电子邮件:Post Office Protocol 3,邮局协议的第3个版本
  • SMTP用于发送电子邮件:Simple Mail Transfer Protocol,简单邮件传输协议。
    SMTP 认证,必须在提供了账户名和密码之后才可以登录 SMTP 服务器,使用户避免受到垃圾邮件的侵扰。

三、程序创建

1、创建控制台应用程序

命名:send_mail
【Asp.net】C#如何发送电子邮件_第2张图片


2、System.Net.Mail命名空间的相关类

① MailMessage:
提供属性和方法来创建一个邮件消息对象,即邮件内容。

  • From:发送邮件的地址
  • To:接收邮件的地址
  • Subject:邮件的标题
  • Body:邮件正文
  • Priority:邮件的优先级(分别为为High,Low,Normal)
  • Attachments:电子邮件的数据的附件集合
  • Bcc:密送地址
  • Cc:抄送地址
  • SubjectEncoding:电子邮件的主题内容使用的编码
  • IsBodyHtml:邮件正文是否为 Html 格式的值

② Attachment:
邮件附件。

③ SmtpClient:
将电子邮件传输到您指定用于邮件传送的 SMTP 主机。

  • DeliveryMethod:指定如何处理待发的电子邮件
  • Host:SMTP 事务的主机的名称或 IP 地址
  • Port:端口,不填为默认端口
  • Timeout:超时时间
  • Credentials:设置用于验证发件人身份的凭据

3、相关代码,初阶


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邮箱。


4、相关代码,进阶

上面收件人只有少数的情况,可以直接写在cs中,但是如果发件邮箱需要方便替换、收件人/人数并不是固定的,并且邮件内容也不是固定的呢?
很简单,需要方便修改的话就写在配置文件,收件人不固定的话就从数据库取数出来再循环赋值,内容不固定就给一个填写框填写邮件内容咯~

① 数据库user_info表

【Asp.net】C#如何发送电子邮件_第3张图片
从表中取电子邮箱地址,循环发送。(这里的电子邮箱地址肯定是乱写的啦~)

② 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表的用户名、用户邮箱…太多了就不一一贴代码了,发一个资源包吧?


5、其它相关问题

但是!到微软的官网,会发现!

【Asp.net】C#如何发送电子邮件_第4张图片

额…如果只是简单地用于发送邮件,SmtpClient类还是适用的,微软也不可能完全撤掉这个方法吧,毕竟还有那么多需要兼容的旧系统不是,哈~
如果用.net core做新项目的话,还是用官网推荐使用的MailKit吧,适用更多的电子邮件标准。(目前就暂不研究了。)


四、定时任务

我就直接使用win自带的定时任务了。

步骤:
win10:win+x→计算机管理→任务计划程序→创建基本任务…
【Asp.net】C#如何发送电子邮件_第5张图片
创建定时任务的各个步骤就不一一演示了,如图。
启动程序时添加的【程序或脚本】为上面send_mail项目中生成的Debug中的exe程序。


五、结束

查看邮箱,发现已经收到了我的生日祝福。
【Asp.net】C#如何发送电子邮件_第6张图片

就这样,定时给你发送生日祝福邮件的小功能就完成啦!碎觉!

【Asp.net】C#如何发送电子邮件
记录,打板!

你可能感兴趣的:(ASP.NET)