有個小夥伴問我你之前發郵件功能怎麼弄的。而後我就給他找了個demo,正好在此也寫一下,分享給你們。html
發送郵件,你們能夠想一下,坑的地方在哪?
我以爲是三個吧。
第一:郵件白名單問題。
第二:郵件超時問題。
第三:郵件帶附件問題。
我下面的demo都會介紹這些問題及解決。java
咱們先要準備一個能夠發送的郵箱,我這裏以個人163郵箱爲例,如今發送郵件的規則,要求你輸入一種叫作受權碼的東西,注意這個東西不是密碼。
獲取受權碼的步驟:
當選擇開啓,經過驗證以後就能夠獲取到驗證碼。選擇重置驗證碼也能夠獲取。之前17年的時候就寫過一個demo,如今19年又開了一個,由於之前的忘了。spring
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
spring: mail: # 郵件服務地址 host: smtp.163.com # 端口,可不寫默認 port: 25 # 編碼格式 default-encoding: utf-8 # 用戶名 username: xxx@163.com # 受權碼,就是咱們剛纔準備工做獲取的代碼 password: xxx # 其它參數 properties: mail: smtp: # 若是是用 SSL 方式,須要配置以下屬性,使用qq郵箱的話須要開啓 ssl: enable: true required: true # 郵件接收時間的限制,單位毫秒 timeout: 10000 # 鏈接時間的限制,單位毫秒 connectiontimeout: 10000 # 郵件發送時間的限制,單位毫秒 writetimeout: 10000
針對於上面提的超時問題,捕獲超時異常就可解決。springboot
主要經過如下工具類就能夠知足發送java郵件的須要。當咱們進行好 yml 配置後,SpringBoot會幫助咱們自動配置 JavaMailSender 咱們經過這個java類就能夠實現操做java來發送郵件。如下列舉了幾種經常使用的郵件。ide
@Service public class MailService { private static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class); @Autowired private JavaMailSender mailSender; private static final String SENDER = "xxx@163.com"; /** * 發送普通郵件 * * @param to 收件人 * @param subject 主題 * @param content 內容 */ @Override public void sendSimpleMailMessge(String to, String subject, String content) { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(SENDER); message.setTo(to); message.setSubject(subject); message.setText(content); try { mailSender.send(message); } catch (Exception e) { logger.error("發送簡單郵件時發生異常!", e); } } /** * 發送 HTML 郵件 * * @param to 收件人 * @param subject 主題 * @param content 內容 */ @Override public void sendMimeMessge(String to, String subject, String content) { MimeMessage message = mailSender.createMimeMessage(); try { //true表示須要建立一個multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(SENDER); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); mailSender.send(message); } catch (MessagingException e) { logger.error("發送MimeMessge時發生異常!", e); } } /** * 發送帶附件的郵件 * * @param to 收件人 * @param subject 主題 * @param content 內容 * @param filePath 附件路徑 */ @Override public void sendMimeMessge(String to, String subject, String content, String filePath) { MimeMessage message = mailSender.createMimeMessage(); try { //true表示須要建立一個multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(SENDER); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); FileSystemResource file = new FileSystemResource(new File(filePath)); String fileName = file.getFilename(); helper.addAttachment(fileName, file); mailSender.send(message); } catch (MessagingException e) { logger.error("發送帶附件的MimeMessge時發生異常!", e); } } /** * 發送帶靜態文件的郵件 * * @param to 收件人 * @param subject 主題 * @param content 內容 * @param rscIdMap 須要替換的靜態文件 */ @Override public void sendMimeMessge(String to, String subject, String content, Map<String, String> rscIdMap) { MimeMessage message = mailSender.createMimeMessage(); try { //true表示須要建立一個multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(SENDER); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); for (Map.Entry<String, String> entry : rscIdMap.entrySet()) { FileSystemResource file = new FileSystemResource(new File(entry.getValue())); helper.addInline(entry.getKey(), file); } mailSender.send(message); } catch (MessagingException e) { logger.error("發送帶靜態文件的MimeMessge時發生異常!", e); } } }
@RunWith(SpringRunner.class) @SpringBootTest public class SpringbooEmailDemoApplicationTests { @Autowired private MailService mailService; private static final String TO = "xxx@qq.com"; private static final String SUBJECT = "測試郵件"; private static final String CONTENT = "test content"; /** * 測試發送普通郵件 */ @Test public void sendSimpleMailMessage() { mailService.sendSimpleMailMessge(TO, SUBJECT, CONTENT); } /** * 測試發送html郵件 */ @Test public void sendHtmlMessage() { String htmlStr = "<h1>Test</h1>"; mailService.sendMimeMessge(TO, SUBJECT, htmlStr); } /** * 測試發送帶附件的郵件 * @throws FileNotFoundException */ @Test public void sendAttachmentMessage() throws FileNotFoundException { File file = ResourceUtils.getFile("classpath:test.txt"); String filePath = file.getAbsolutePath(); mailService.sendMimeMessge(TO, SUBJECT, CONTENT, filePath); } /** * 測試發送帶附件的郵件 * @throws FileNotFoundException */ @Test public void sendPicMessage() throws FileNotFoundException { String htmlStr = "<html><body>測試:圖片1 <br> <img src=\'cid:pic1\'/> <br>圖片2 <br> <img src=\'cid:pic2\'/></body></html>"; Map<String, String> rscIdMap = new HashMap<>(2); rscIdMap.put("pic1", ResourceUtils.getFile("classpath:pic01.jpg").getAbsolutePath()); rscIdMap.put("pic2", ResourceUtils.getFile("classpath:pic02.jpg").getAbsolutePath()); mailService.sendMimeMessge(TO, SUBJECT, htmlStr, rscIdMap); } }
若是是發送給固定郵箱,能夠直接在固定郵箱裏面設置白名單,若是頻繁的發送給多個郵箱,最好設置如下發送時間間隔,不要不斷的給某一個郵箱發送。spring-boot
至此SpringBoot發送郵件介紹完畢,你們能夠直接使用代碼來進行發送。工具