Springboot+Javamail實現郵件發送

使用的是spring-context-support-5.2.6.RELEASE.jar裏的javamail

javamail 官方文檔:javamail

代碼在:gitee

官方代碼介紹

Sample code for an HTML mail with an inline image and a PDF attachment:

帶有圖像和PDF附件的HTML郵件的示例代碼:

mailSender.send(new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage) throws MessagingException {
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
message.setFrom("[email protected]");
message.setTo("[email protected]");
message.setSubject("my subject");
message.setText("my text <img src='cid:myLogo'>", true);
message.addInline("myLogo", new ClassPathResource("img/mylogo.gif"));
message.addAttachment("myDocument.pdf", new ClassPathResource("doc/myDocument.pdf"));
}
});

MimeMessageHelper參數說明

  • from(發件人)
  • to(收件人)
  • subject(郵件主題)
  • text(內容)
  • inline(內嵌圖片或者圖片附件)
  • attachment(附件)
  • cc(抄送人)
  • bcc(密送人)

Springboot 代碼示例

開啟POP3/SMTP服務,並拿到授權碼

首先登錄163郵箱 開啟POP3/SMTP服務

拿到授權碼

application.yml配置文件不要填郵箱密碼,要填授權碼,不然會報錯:535 Error: authentication failed

application.yml配置文件


spring:
mail:
default-encoding: UTF-8
host: smtp.163.com
username: [email protected]
# 不要填郵箱密碼,要填授權碼,不然會報錯:535 Error: authentication failed
password:
protocol: smtp
properties:
mail:
smtp:
auth: true
port: 994 #465或者994
starttls:
enable: true
required: true
ssl:
enable: true
display:
sendmail: Javen
sendname: Spring Boot Guide Email

MailDetail(參數封裝)

記得setter、getter


public class MailDetail {
/**
* 發件人名稱
*/
private String senderName; /**
* 發件人郵件地址
*/
private String senderMail; /**
* 收件人地址
*/
private String addresseeMail; /**
* 郵件標題
*/
private String mailTitle; /**
* 抄送人
*/
private String[] cc; /**
* 郵件內容
*/
private String content; /**
* true內容為HTML,false內容為文本 默認文本
*/
private Boolean html = false; }

發送郵件Service層


@Service
public class MailServiceImpl implements MailService {
private static final Logger log = LoggerFactory.getLogger(MailServiceImpl.class); private final JavaMailSender javaMailSender; @Autowired
public MailServiceImpl(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
} @Override
public boolean sendMessage(MailDetail detail) {
log.info("mailServiceImpl.sendMessage.request:{}", new Gson().toJson(detail));
try {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
// 發件人地址
InternetAddress fromAddress = new InternetAddress(MimeUtility.encodeText(detail.getSenderName()) + "<" + detail.getSenderMail() + ">");
messageHelper.setFrom(fromAddress);
// 收件人地址
InternetAddress toAddress = new InternetAddress(MimeUtility.encodeText(detail.getAddresseeMail()) + "<" + detail.getAddresseeMail() + ">");
messageHelper.setTo(toAddress);
// 郵件名稱
messageHelper.setSubject(detail.getMailTitle());
// 第二個參數指定發送的是HTML格式
messageHelper.setText(detail.getContent(), detail.getHtml());
// 抄送人
if (detail.getCc() != null && detail.getCc().length > 0) {
messageHelper.setCc(detail.getCc());
}
// 測試圖片附件(ClassPathResource要把圖片放到resources,並且編譯代碼把圖片加載到target裏)
// messageHelper.addInline("myLogo", new ClassPathResource("WechatIMG2602.jpeg"));
javaMailSender.send(message);
return true;
} catch (MessagingException | UnsupportedEncodingException e) {
log.error("mailServiceImpl.sendMessage.error:{},{}", e.getMessage(), e.getStackTrace());
}
return false;
}
}

發送郵件Controller層

主要controller實現類ApplicationRunner 的run 項目啟動則執行


@RestController
public class MailController implements ApplicationRunner {
private static final Logger log = LoggerFactory.getLogger(MailController.class); protected final MailService mailService; @Autowired
public MailController(MailService mailService) {
this.mailService = mailService;
} @Override
public void run(ApplicationArguments args) throws Exception {
log.info("syncController.run");
MailDetail mailDetail = new MailDetail();
// 發件人名稱
mailDetail.setSenderName("雲深小麥");
// 發件人郵箱
mailDetail.setSenderMail("[email protected]");
// 郵件名稱
mailDetail.setMailTitle("這裏是測試");
// 收件人郵箱
mailDetail.setAddresseeMail("[email protected]");
// 發送純文本 setHtml(false) 默認false
// mailDetail.setContent("你好!我是雲深小麥"); // 發送HTML setHtml(true)
mailDetail.setContent("<html><head></head><body><h1>你好!我是雲深小麥</h1></body></html>");
// 內容是否為HTML
mailDetail.setHtml(true); boolean b = mailService.sendMessage(mailDetail);
if (b) {
log.info("發送成功");
}
}
}

結果

一些問題

535 Error: authentication failed

Caused by: javax.mail.AuthenticationFailedException: 535 Error: authentication failed

調用163郵箱服務器來發送郵件,我們需要開啟POP3/SMTP服務,這時163郵件會讓我們設置客戶端授權碼,這個授權碼替代上面代碼部分的passwd即可成功發送郵件

如何重置授權碼

550 Invalid User

com.sun.mail.smtp.SMTPSenderFailedException: 550 Invalid User

該錯誤錶示:收件地址為無效帳號。

建議:

1,請檢查收件人地址是否存在語法錯誤,例如說有攜帶多餘的標點符號。地址與地址之間的分隔號是英文字符下的分號。

2,請檢查收件人地址是否有錯誤,收件人不存在等情况。

3,請檢查發件人在系統的狀態,是否被删除、禁用或者凍結狀態。

Springboot+Javamail實現郵件發送的更多相關文章

  1. Spring MVC+javamail實現郵件發送

    Spring MVC+javamail實現郵件發送 開啟郵箱的POP3/SMTP服務(這裏以QQ郵箱舉例) 設置 --> 賬戶 -- > 開啟POP3/STMP服務,然後得到一個授權碼. ...

  2. Springboot使用javaMail進行郵件發送

    導入相關依賴 <!--郵件發送--> <dependency> <groupId>javax.mail</groupId> <artifactId ...

  3. 基於javaMail的郵件發送--excel作為附件

    基於JavaMail的Java郵件發送 Author [email protected] Desc 簡單郵件發送 Date 2017/12/8 項目中需要根據物料資質的狀况實時給用 ...

  4. Java 基於javaMail的郵件發送(支持附件)

    基於JavaMail的Java郵件發送Author [email protected] Desc 簡單郵件發送 Date 2017/12/8 項目中需要根據物料資質的狀况實時給用戶 ...

  5. Java 基於JavaMail的郵件發送

    http://blog.csdn.net/xietansheng/article/details/51673073 http://blog.csdn.net/xietansheng/article/d ...

  6. 使用Javamail實現郵件發送功能

    目錄 相關的包 編寫工具類 環境說明 @(使用Javamail實現郵件發送功能) 相關的包 activation.jar javax.mail.jar mail包建議使用高版本寫的包,否則可能會發空白 ...

  7. springboot下實現郵件發送功能

    springboot給我們封裝好了郵件功能,非常簡單,只需要稍微配置下就ok. 引入jar <dependency> <groupId>org.springframework. ...

  8. 使用Springboot Email實現郵件發送

    在springboot配置文件增加emai配置(此種方式不支持QQ郵箱): spring.datasource.type=com.alibaba.druid.pool.DruidDataSource ...

  9. 基於Spring封裝的Javamail實現郵件發送

    1.依賴 <dependency> <groupId>org.springframework</groupId> <artifactId>spring- ...

  10. springBoot中的郵件發送

    1. 添加依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

隨機推薦

  1. lua coroutine for iterator

    背景 前面的文章演示了使用閉包函數實現 狀態的迭代器. 本文演示使用 coroutine來產生迭代器的例子. coroutine迭代器例子 -- 遍曆二叉樹 local binary_tree = { ...

  2. 使用NSTimer過程中最大的兩個坑

    坑1. retain cycle問題. 在一個對象中使用循環執行的nstimer時,若希望在對象的dealloc方法中釋放這個nstimer,結局會讓你很失望. 這個timer會導致你的對象根本不會被 ...

  3. Android——Dialog

    public class DialogActivity extends Activity { //進度對話框    ProgressDialog progressDialog; @Override   ...

  4. c#輸出json,其中包含子json (可以含 無限級 子json)的方法思路

    首頁 給出  DataTable 轉Json 的方法: public static string TableToJson(DataTable dt) { List<Dictionary<s ...

  5. jquery的一些select操作小記

    添加option $("#ID option").each(function(){ if($(this).val() == 111){ $(this).remove(); } }) ...

  6. 【網絡流24題】No. 17 運輸問題 (費用流)

    [題意] W 公司有 m 個倉庫和 n 個零售商店.第 i 個倉庫有ai 個單比特的貨物:第 j 個零售商店需要b j 個單比特的貨物. 貨物供需平衡,即SIGMA(A)=SIGMA(B). 從第 i 個 ...

  7. 讓IE6,7,8支持HTML5新標簽的方法

    很多網站對網頁進行重構的時候,提高標簽的語義性,在網頁中大量使用了section,article,header等HTML5新標簽.考慮到目前win7自帶的IE瀏覽器版本是IE8,而IE8不支持HTML ...

  8. 第二篇--Jmeter測試Java請求

    前提:需要准備eclipse作為開發工具,安裝jdk,准備完畢,接下來開工嘍! 1.新建Java工程BMIrisJNIJarTest,新建lib目錄,將Jmeter安裝目錄下lib/ext包下的Apa ...

  9. 瀏覽器仿EXCEL錶格插件 版本更新 - 智錶ZCELL產品V1.3.1更新

    智錶(zcell)是一款瀏覽器仿excel錶格jquery插件.智錶可以為你提供excel般的智能體驗,支持雙擊編輯.設置公式.設置顯示小數精度.下拉框.自定義單元格.複制粘貼.不連續選定.合並單元格 ...

  10. HP Elitebook 830 G5/Win10藍屏 UcmUcsi.sys 錯誤解决

    轉自https://support.hp.com/cn-zh/document/c06038185 注意BIOS可能是英文的,別著急,對著找就好了.