Java整合Spring发送邮件
個人博客項目地址
希望各位幫忙點個star,給我加個小星星?
又懶了,要多看書和總結,然后早點寫博客?
有時候代碼執行完之后,需要郵件進行通知,所以通過工作中的項目和網上的資料,特地去學習了如何使用Java發送郵件。Demo使用的是QQ郵箱進行郵件發送,可以先了解一下基礎文檔協議RFC882、MIME、SMTP等。
文檔協議說明
看了孤傲蒼狼的文章,關于郵件協議,他解釋的很好,這邊進行記錄了一下
RFC882文檔(發送簡單文字郵件)
RFC882文檔規定了如何編寫一封簡單的郵件(純文本郵件),一封簡單的郵件包含郵件頭和郵件體兩個部分,郵件頭和郵件體之間使用空行分隔。
郵件頭包含的內容有:
- from字段 ??--用于指明發件人
- to字段 ?? --用于指明收件人
- subject字段 --用于說明郵件主題
- cc字段 ?? -- 抄送,將郵件發送給收件人的同時抄送給另一個收件人,收件人可以看到郵件抄送給了誰
- bcc字段 ?? -- 密送,將郵件發送給收件人的同時將郵件秘密發送給另一個收件人,收件人無法看到郵件密送給了誰
MIME文檔(可以發送HTML郵件)
在我們的實際開發當中,一封郵件既可能包含圖片,又可能包含有附件,在這樣的情況下,RFC882文檔規定的郵件格式就無法滿足要求了。
MIME協議是對RFC822文檔的升級和補充,它描述了如何生產一封復雜的郵件。通常我們把MIME協議描述的郵件稱之為MIME郵件。MIME協議描述的數據稱之為MIME消息。 ?? 對于一封復雜郵件,如果包含了多個不同的數據,MIME協議規定了要使用分隔線對多段數據進行分隔,并使用Content-Type頭字段對數據的類型、以及多個數據之間的關系進行描述。 ??
SMTP協議
要使用QQ郵箱發送郵件,就要遵守SMTP協議。SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用于由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。
需要在QQ郵箱中打開SMTP服務和生成授權碼
Demo的時序圖
代碼實現
demo使用的是Velocity模板引擎進行html渲染,其它渲染方式類似,最后都是生成context內容。
基礎依賴
java mail/spring-context-support/velocity
compile group: 'com.sun.mail', name: 'javax.mail', version: '1.6.1' compile group: 'org.springframework', name: 'spring-context-support', version: '5.0.8.RELEASE' compile group: 'org.apache.velocity', name: 'velocity', version: '1.7' 復制代碼郵件基礎Bean
public class MailBean {/** 郵件發送人地址,非空 */private String from;/** 郵件發送人姓名,非空 */private String fromName;/** 郵件接收人地址列表,非空 */private String[] toList;/** 郵件抄送人地址列表 */private String[] ccList;/** 郵件主題,非空 */private String subject;/** 郵件內容velocity上下文參數 */private Map<String, Object> mailContext;/** 郵件內容velocity模板,非空 */private String mailVmName;··· } 復制代碼模板引擎渲染工具
public class VelocityUtils {private static final Logger LOGGER = LoggerFactory.getLogger(VelocityUtils.class);private static final VelocityEngine VE = new VelocityEngine();static {initVelocity();}private static void initVelocity() {try {VE.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");VE.setProperty("classpath.resource.loader.class",ClasspathResourceLoader.class.getName());VE.setProperty(RuntimeConstants.RUNTIME_LOG, "logs/velocity.log");VE.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,"org.apache.velocity.runtime.log.NullLogChute");VE.init();} catch (Exception e) {LOGGER.warn("初始化velocity模板引擎失敗", e);}}/** 實際渲染的代碼,map里面的字段與編寫的模板相對應 **/public static String render(String vmName, Map<String, Object> context) {String renderStr = "";try {Template template = VE.getTemplate(vmName, "UTF-8");VelocityContext velocityContext = new VelocityContext();for (Map.Entry<String, Object> entry : context.entrySet()) {velocityContext.put(entry.getKey(), entry.getValue());}StringWriter sw = new StringWriter();template.merge(velocityContext, sw);renderStr = sw.toString();} catch (Exception e) {LOGGER.warn("渲染vm模板失敗", e);}return renderStr;} } 復制代碼發送郵件的服務
我們使用spring進行依賴注入,幫我們托管mailSender
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><!-- <property name="host" value="smtp.qq.com"/> --><property name="host" value="smtp.qq.com"/><property name="port" value="587"/><!-- <property name="username" value="xxxxx@qq.com"/> --><property name="username" value="xxxxxx@qq.com"/><!-- qq郵箱的授權碼,如果是企業郵箱,則使用登錄密碼 --><property name="password" value="xxxxxxxxxxx"/><property name="javaMailProperties"><props ><prop key="mail.smtp.auth">true</prop></props></property></bean> 復制代碼面向接口編程
public interface MailService {/*** 發送郵件** @param mailBean 郵件bean*/void sendMail(MailBean mailBean);} public class MailServiceImpl implements MailService {("javaMailSender")private JavaMailSender mailSender;public void sendMail(MailBean mailBean) {// 省略了校驗try {// 工具類進行內容渲染,傳入的是模板名稱和具體內容MAPString mailContent = VelocityUtils.render(mailBean.getMailVmName(),mailBean.getMailContext());MimeMessage msg = mailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(msg, true, "UTF-8");mimeMessageHelper.setFrom(mailBean.getFrom(), mailBean.getFromName());mimeMessageHelper.setSubject(mailBean.getSubject());mimeMessageHelper.setTo(mailBean.getToList());mimeMessageHelper.setText(mailContent, true);mailSender.send(msg);} catch (Exception e) {log.warn("郵件發送失敗,mailBean={}", mailBean, e);}} } 復制代碼demo.vm(模板文件)
<html xmlns="http://www.w3.org/1999/xhtml "> <body class="word-style"> <div class="title" align="center">DEMO</div> <br/> <div class="indent">$!{msg}</div> </body> </html> 復制代碼發送郵件
最后通過調用MailService進行郵件發送
MailBean mailBean = new MailBean(); mailBean.setFrom("xxxxxx@qq.com"); mailBean.setFromName("DEMO"); mailBean.setSubject("Are you ok"); //模板 mailBean.setMailVmName("demo.vm"); //收件人地址 String[] toList = {"xxxxx@xxxx.com"}; mailBean.setToList(toList); Map<String, Object> context = new HashMap<>(); context.put("msg", "I'm fine, thank you~"); mailBean.setMailContext(context); mailService.sendMail(mailBean); 復制代碼當然,你可以制作更加好看的html郵件~
參考資料
總結
以上是生活随笔為你收集整理的Java整合Spring发送邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 精益质量管理中执行防错管理的八大要点
- 下一篇: List - Map 工具类,list转