整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

C# .NET Core中跨平台电子邮件库MailK

C# .NET Core中跨平台电子邮件库MailKit发送和接收邮件

首发创作赛#

MailKit 是一个跨平台的电子邮件处理库,支持发送和接收电子邮件。

C# .NET Core中使用MailKit处理电子邮件:

  • 安装MailKit NuGet包:

可以使用Visual Studio的NuGet包管理器或使用dotnet CLI来安装它。

  • 导入所需的命名空间:
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
  • 创建一个MimeMessage对象,并设置发件人、收件人、主题和正文等信息:
var message=new MimeMessage();
message.From.Add(new MailboxAddress("发件人名称", "发件人邮箱"));
message.To.Add(new MailboxAddress("收件人名称", "收件人邮箱"));
message.Subject="邮件主题";

var bodyBuilder=new BodyBuilder();
bodyBuilder.TextBody="邮件正文";
// 如果要发送HTML格式的邮件,可以使用以下代码:
// bodyBuilder.HtmlBody="<h1>邮件正文</h1>";

message.Body=bodyBuilder.ToMessageBody();
  • 发送邮件,创建一个SmtpClient对象,并设置SMTP服务器和端口号:
using (var client=new SmtpClient())
{
    client.Connect("SMTP服务器地址", 端口号, SecureSocketOptions.StartTls);
    // 如果SMTP服务器要求身份验证,请提供用户名和密码:
    client.Authenticate("用户名", "密码");

    // 发送邮件
    client.Send(message);

    client.Disconnect(true);
}
  • 接收邮件,创建一个ImapClient对象,并连接到IMAP服务器:
using (var client=new ImapClient())
{
    client.Connect("IMAP服务器地址", 端口号, SecureSocketOptions.StartTls);
    // 如果IMAP服务器要求身份验证,请提供用户名和密码:
    client.Authenticate("用户名", "密码");

    // 选择收件箱
    client.Inbox.Open(FolderAccess.ReadOnly);

    // 获取收件箱中的邮件数量
    int messageCount=client.Inbox.Count;

    // 遍历收件箱中的邮件
    for (int i=0; i < messageCount; i++)
    {
        var message=client.Inbox.GetMessage(i);

        // 处理邮件,例如打印主题和发件人
        Console.WriteLine("主题: " + message.Subject);
        Console.WriteLine("发件人: " + message.From);
    }

    client.Disconnect(true);
}

代码中的"IMAP服务器地址"、端口号、"用户名"和"密码"应替换为实际使用的IMAP服务器的相关信息。

这个简单示例演示了如何使用MailKit在C# .NET Core中发送和接收电子邮件。

为数据分析师,经常性的会需要到服务器上做一些取数/数据清洗的工作,但往往这些工作会特别耗时,如果我们可以在我们的脚本中加入邮件提醒的功能,提醒我们任务完成,那效率会提升很多

一般发邮件方法

我以前在通过Python实现自动化邮件功能的时候是这样的:

import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 发送邮箱服务器
smtpserver='smtp.sina.com'
# 发送邮箱用户/密码
user='username@sina.com'
password='123456'
# 发送邮箱
sender='username@sina.com'
# 接收邮箱
receiver='receive@126.com'
# 发送邮件主题
subject='Python email test'
# 编写HTML类型的邮件正文
msg=MIMEText('<html><h1>你好!</h1></html>','html','utf-8')
msg['Subject']=Header(subject, 'utf-8')
# 连接发送邮件
smtp=smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(user, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

其实,这段代码也并不复杂,只要你理解使用过邮箱发送邮件,那么以下问题是你必须要考虑的:

  • 你登录的邮箱帐号/密码
  • 对方的邮箱帐号
  • 邮件内容(标题,正文,附件)
  • 邮箱服务器(SMTP.xxx.com/pop3.xxx.com)

yagmail 实现发邮件

  • yagmail 可以更简单的来实现自动发邮件功能。
github项目地址: https://github.com/kootenpv/yagmail
  • 安装
pip install yagmail 
  • 简单例子
import yagmail
#链接邮箱服务器
yag=yagmail.SMTP( user="user@126.com", password="1234", host='smtp.126.com')
# 邮箱正文
contents=['This is the body, and here is just text http://somedomain/image.png',
 'You can find an audio file attached.', '/local/path/song.mp3']
# 发送邮件
yag.send('taaa@126.com', 'subject', contents)

总共四行代码搞定,是不是比上面的例子简单太多了。

  • 给多个用户发送邮件,只需要将接收邮箱 变成一个list即可。
yag.send(['aa@126.com','bb@qq.com','cc@gmail.com'], 'subject', contents)
  • 发送带附件的邮件,只需要添加要发送的附件列表即可

文基于:Spring Boot 2.1.3,理论支持Spring Boot 2.x所有版本。

最近有童鞋问到笔者如何用Spring Boot发送邮件,故而整理下Spring Boot发送邮件的各种姿势。

说到邮件放松,相信大家对Spring Framework提供的接口 JavaMailSender 都不陌生。那么Spring Boot是否有开箱即用的邮件发送呢?

答案是肯定的。Spring Boot为发送邮件提供了starter:spring-boot-starter-mail 。

本文详细探讨如何用Spring Boot发送邮件。

一、邮箱配置

以126邮箱为例:

1 开启SMTP服务

2 设置/重置客户端授权密码

二、编码

2.1 准备工作

1 加依赖


<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2 写配置


spring:
 mail:
 host: smtp.126.com
 username: eacdy0000@126.com
 password: 上面设置的授权码

2.2 发送简单邮件


public String simple() {
 SimpleMailMessage message=new SimpleMailMessage();
 // 发件人邮箱
 message.setFrom(this.mailProperties.getUsername());
 // 收信人邮箱
 message.setTo("511932633@qq.com");
 // 邮件主题
 message.setSubject("简单邮件测试");
 // 邮件内容
 message.setText("简单邮件测试");
 this.javaMailSender.send(message);
 return "success";
}

结果类似下图:

2.3 发送HTML邮件

简单邮件是没有样式的,很多时候,我们希望发送的邮件内容带有样式,此时可发送HTML邮件。


public String html() throws MessagingException {
 MimeMessage message=javaMailSender.createMimeMessage();
 MimeMessageHelper messageHelper=new MimeMessageHelper(message);
 messageHelper.setFrom(this.mailProperties.getUsername());
 messageHelper.setTo("511932633@qq.com");
 messageHelper.setSubject("HTML内容邮件测试");
 // 第二个参数表示是否html,设为true
 messageHelper.setText("<h1>HTML内容..</h1>", true);
 this.javaMailSender.send(message);
 return "success";
}

结果类似下图:

2.4 发送带附件的邮件

很多场景下,需要为邮件插入附件,此时该怎么办呢?继续上代码——


@GetMapping("/attach")
public String attach() throws MessagingException {
 MimeMessage message=this.javaMailSender.createMimeMessage();
 // 第二个参数表示是否开启multipart模式
 MimeMessageHelper messageHelper=new MimeMessageHelper(message, true);
 messageHelper.setFrom(this.mailProperties.getUsername());
 messageHelper.setTo("511932633@qq.com");
 messageHelper.setSubject("带附件的邮件测试");
 // 第二个参数表示是否html,设为true
 messageHelper.setText("<h1>HTML内容..</h1>", true);
 messageHelper.addAttachment("附件名称",
 new ClassPathResource("wx.jpg"));
 this.javaMailSender.send(message);
 return "success";
}

结果类似下图:

2.5 发送带内联附件的邮件

附件 + HTML基本能满足日常工作中多数需求。但如果能将附件内联在邮件内容中,那么体验就更好啦!如何实现附件的内联呢?


@GetMapping("/inline-attach")
public String inlineAttach() throws MessagingException {
 MimeMessage message=this.javaMailSender.createMimeMessage();
 // 第二个参数表示是否开启multipart模式
 MimeMessageHelper messageHelper=new MimeMessageHelper(message, true);
 messageHelper.setFrom(this.mailProperties.getUsername());
 messageHelper.setTo("511932633@qq.com");
 messageHelper.setSubject("内联附件的邮件测试");
 // 第二个参数表示是否html,设为true
 messageHelper.setText("<h1>HTML内容..<img src=\"cid:attach\"/></h1>", true);
 messageHelper.addInline("attach", new ClassPathResource("wx.jpg"));
 this.javaMailSender.send(message);
 return "success";
}

由代码可知,只需在想要内联的地方使用 cid:xx 引用内联附件,然后用 addInline(xx, file)指定附件即可。两处的 xx 必须一致。

结果类似下图:

2.6 发送基于Freemarker模板的邮件

上面的例子中,邮件内容是直接以字符串体现的,这通常不适合生产,因为实际项目中邮件往往带有变量。此时,可考虑使用Freemarker模板(或者其他模板,Spring Boot 2.x默认支持Freemarker、Groovy、Thymeleaf、Mustache四种模板引擎,也可根据需求使用其他模板引擎)。

?

创建Freemarker模板文件mail.ftl,并将其存放在resources/templates/ 目录中


<h1>亲爱的${username}, 欢迎关注${event}</h1>

?

编码:


@GetMapping("/freemarker")
public String freemarker() throws MessagingException, IOException, TemplateException {
 MimeMessage message=this.javaMailSender.createMimeMessage();
 // 第二个参数表示是否开启multipart模式
 MimeMessageHelper messageHelper=new MimeMessageHelper(message, true);
 messageHelper.setFrom(this.mailProperties.getUsername());
 messageHelper.setTo("511932633@qq.com");
 messageHelper.setSubject("基于freemarker模板的邮件测试");
 Map<String, Object> model=new HashMap<>();
 model.put("username", "itmuch");
 model.put("event", "IT牧场大事件");
 String content=FreeMarkerTemplateUtils.processTemplateIntoString(
 this.freemarkerConfiguration.getTemplate("mail.ftl"), model);
 // 第二个参数表示是否html,设为true
 messageHelper.setText(content, true);
 this.javaMailSender.send(message);
 return "success";
}

此时,结果类似下图:

三、配套代码

?GitHub[1]

?Gitee[2]

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

?001:《Java并发与高并发解决方案》学习笔记;

?002:《深入JVM内核——原理、诊断与优化》学习笔记;

?003:《Java面试宝典》

?004:《Docker开源书》

?005:《Kubernetes开源书》

?006:《DDD速成(领域驱动设计速成)》

References

[1] GitHub: https://github.com/eacdy/spring-boot-study/tree/master/spring-boot-mail

[2] Gitee: https://gitee.com/itmuch/spring-boot-study/tree/master/spring-boot-mail