首發創作賽#
MailKit 是一個跨平臺的電子郵件處理庫,支持發送和接收電子郵件。
C# .NET Core中使用MailKit處理電子郵件:
可以使用Visual Studio的NuGet包管理器或使用dotnet CLI來安裝它。
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
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();
using (var client=new SmtpClient())
{
client.Connect("SMTP服務器地址", 端口號, SecureSocketOptions.StartTls);
// 如果SMTP服務器要求身份驗證,請提供用戶名和密碼:
client.Authenticate("用戶名", "密碼");
// 發送郵件
client.Send(message);
client.Disconnect(true);
}
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()
其實,這段代碼也并不復雜,只要你理解使用過郵箱發送郵件,那么以下問題是你必須要考慮的:
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)
總共四行代碼搞定,是不是比上面的例子簡單太多了。
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
*請認真填寫需求信息,我們會在24小時內與您取得聯系。