.NET Core 读写json 发送邮件

昨天在网上看到一个老板给的需求:定时从数据库里拉取信息并生成excel表格,再通过邮件将excel发送到邮箱。于是想用.NET Core实现一下发邮件的功能。

环境

  • Windows10 Pro
  • VS2017
  • .NET Core 2.1

Nuget包

  • json序列化:Json.NET
  • 发送邮件:MailKit

参考

其实.NET Core 2.1中包含了System.Net.Mail来发送邮件,但MSDN官方不建议使用其中的smtpclient(因为不支持现代协议),反而推荐了MailKit,详情可以查看MSDN页面

为了方便更改收件人和发件人,这里使用json作为配置文件。

读写Json

  • 首先引用Newtonsoft.Json
    using Newtonsoft.Json;
  • 找到json文件的路径,这里使用Path.GetFullPath()方法,其他方法均可
    Path.GetFullPath("your path here")
  • 得到路径后,读取以文件形式读取json文件,然后使用Json.NET将其序列化
    var content = File.ReadAllText(path);
    return JsonConvert.DeserializeObject<IDictionary>(content);

    这里的DeserializeObject<>()方法将传入的对象转换为指定数据结构,我这里转换为字典。
    如果要写json,则使用JsonConvert.SerializeObject()方法,将传入的对象序列化,例如:

    var me = new {
        Name = "azhuge233",
        Age = "18",
        Comments = "Fake ass age!"
    };
    
    var json = JsonConvert.SerializeObject(me);
  • 完成后的json读取功能
    using System;
    using System.Collections;
    using System.IO;
    using Newtonsoft.Json;
    
    namespace dotNetCoreMail {
        class SendMail {
            private static string path;
            private const string filename = "config.json";
            private static IDictionary info;
    
            public SendMail() {
                path = Path.GetFullPath("") + filename;
                info = getConfig();
            }
    
            private IDictionary getConfig() {
                var content = File.ReadAllText(path);
                return JsonConvert.DeserializeObject<IDictionary>(content);
            }
        }
    }
    

发送邮件

邮件的发送分为两大步骤,准备邮件内容->发送邮件。其中邮件内容使用MimeKit封装,发送邮件使用MailKit中的smtp(或其他协议)。

  • 首先引用MimeKitMailKit
    using MimeKit;
    using MailKit.Net.Smtp;
  • 准备邮件主体(标题,内容,收发件人等)
    private MimeMessage getMessages(string title = null, string content = null) {
        var message = new MimeMessage();
        message.From.Add(new MailboxAddress(info["FromName"].ToString(), info["FromAddr"].ToString()));
        message.To.Add(new MailboxAddress(info["ToAddr"].ToString()));
        message.Subject = "Hi, I'm testing the email code.";
    
        message.Body = new TextPart("plain") {
            Text = @"Hi, this is the test message from my email address!"
        };
    
        return message;
    }

    使用MimeMessage对象封装邮件内容,配置其属性。

  • 发送邮件
    var message = getMessages();
    
    using (var client = new SmtpClient()) {
        try {
            client.Connect(info["server"].ToString(), Convert.ToInt32(info["port"]), true);
            client.Authenticate(info["FromAddr"].ToString(), info["Password"].ToString());
            client.Send(message);
            client.Disconnect(true);
            Console.WriteLine("Success!");
        } catch (Exception ex) {
            Console.WriteLine(ex.Message.ToString());
        }
    }

    使用SmtpClient对象中的Connect()方法连接smtp服务器,传入服务器的地址和端口号,最后的bool值为是否使用ssl。
    Authenticate()方法来与服务器验证,这里传入账号和密码(以QQ为例,传入QQ邮箱地址和smtp的密码)。

  • 完整的.NET Core发送邮件功能
    using System;
    using System.Collections;
    using System.IO;
    using MimeKit;
    using MailKit.Net.Smtp;
    using Newtonsoft.Json;
    
    namespace dotNetCoreMail {
        class SendMail {
            private static string path;
            private const string filename = "config.json";
            private static IDictionary info;
    
            public SendMail() {
                path = Path.GetFullPath("../../../") + filename;
                info = getConfig();
            }
    
            private IDictionary getConfig() {
                var content = File.ReadAllText(path);
                return JsonConvert.DeserializeObject<IDictionary>(content);
            }
    
            private MimeMessage getMessages(string title = null, string content = null) {
                var message = new MimeMessage();
                message.From.Add(new MailboxAddress(info["FromName"].ToString(), info["FromAddr"].ToString()));
                message.To.Add(new MailboxAddress(info["ToAddr"].ToString()));
                message.Subject = "Hi, I'm testing the email code.";
    
                message.Body = new TextPart("plain") {
                    Text = @"Hi, this is the test message from my email address!"
                };
    
                return message;
            }
    
            public void Send() {
                var message = getMessages();
    
                using (var client = new SmtpClient()) {
                    try {
                        client.Connect(info["server"].ToString(), Convert.ToInt32(info["port"]), true);
                        client.Authenticate(info["FromAddr"].ToString(), info["Password"].ToString());
                        client.Send(message);
                        client.Disconnect(true);
                        Console.WriteLine("Success!");
                    } catch (Exception ex) {
                        Console.WriteLine(ex.Message.ToString());
                    }
                }
            }
        }
    }
    

     

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据