在Spring項目中需要加入監控功能,監控過程中發現異常時,需要郵件報警。最初選擇用javamail發送,代碼量比較大(相對於spring發送),最終選擇Spring郵件發送~
下面貼一下實現的代碼以及注意事項;
代碼結構很簡單一個java類和一個xml文件,用到三個jar包,demo下載地址http://download.csdn.net/detail/jeofey/8892859
這里只是簡單的發送,如果需要發送附件或者HTML格式的郵件的話,代碼在文章末尾
- package mail;
- import javax.mail.MessagingException;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.FileSystemXmlApplicationContext;
- import org.springframework.mail.SimpleMailMessage;
- import org.springframework.mail.javamail.JavaMailSender;
- /**
- * @author Owner
- * springMail發送郵件
- * SendMail.java
- */
- public class SendMail {
- public ApplicationContext ctx = null;
- public SendMail() {
- ctx = new FileSystemXmlApplicationContext("src/mail/applicationContext-mail.xml");
- }
- /**
- * 主測試方法
- *
- * @throws MessagingException
- */
- public static void main(String[] args) {
- new SendMail().sendMail();
- }
- /**
- * 發送簡單郵件
- */
- public void sendMail() {
- JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender");// 獲取JavaMailSender
- SimpleMailMessage mail = new SimpleMailMessage();
- try {
- mail.setTo("aaaa@qq.com");// 接受者
- mail.setFrom("bbbb@163.com");// 發送者
- mail.setSubject("s郵件主題");// 主題
- mail.setText("springMail 的簡單發送測試");// 郵件內容
- sender.send(mail);
- System.out.println("發送完畢");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
注意事項:在讀取xml配置文件時,用的是FileSystemXmlApplicationContext實現類,在書寫路徑的時候不能只寫文件名,盡管java文件和xml文件是在同一目錄下。
如果收件人有多個時,mail.setTo("aaaa@qq.com");mail.setTo("cccc@qq.com")....
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jee="http://www.springframework.org/schema/jee"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
- http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
- <bean id="mailSender"
- class="org.springframework.mail.javamail.JavaMailSenderImpl">
- <property name="host">
- <value>smtp.163.com</value>
- </property>
- <property name="javaMailProperties">
- <props>
- <prop key="mail.smtp.auth">true</prop>
- <prop key="mail.smtp.timeout">25000</prop>
- <prop key="mail.smtp.socketFactory.fallback">false</prop>
- <prop key="mail.smtp.starttls.enable">true</prop>
- <!-- 這里是配置ssl 主要是個,Gmail
- <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
- -->
- </props>
- </property>
- <property name="username">
- <value>bbbb@163.com</value> <!-- 郵箱的用戶名,注意要寫正確了 -->
- </property>
- <property name="password">
- <value>*****</value> <!-- 郵箱密碼 -->
- </property>
- <property name="port">
- <value>25</value>
- </property>
- </bean>
- </beans>
注意問題:用戶名需要書寫正確,必須是發送郵件中設定好的用戶名,如果沒設置,默認是郵件地址。當初這里沒寫正確,驗證時出現了異常;
- 七月 12, 2015 8:02:57 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
- 信息: Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@16d835f: display name [org.springframework.context.support.FileSystemXmlApplicationContext@16d835f]; startup date [Sun Jul 12 20:02:57 CST 2015]; root of context hierarchy
- 七月 12, 2015 8:02:58 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
- 信息: Loading XML bean definitions from file [D:\liu\workspace\myspmain\src\mail\applicationContext-mail.xml]
- 七月 12, 2015 8:02:58 下午 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
- 信息: Bean factory for application context [org.springframework.context.support.FileSystemXmlApplicationContext@16d835f]: org.springframework.beans.factory.support.DefaultListableBeanFactory@13911fe
- 七月 12, 2015 8:02:58 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
- 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@13911fe: defining beans [mailSender]; root of factory hierarchy
- org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException
- at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:416)
- at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:308)
- at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:297)
- at mail.SendMail.sendMail(SendMail.java:41)
- at mail.SendMail.main(SendMail.java:28)
- Caused by: javax.mail.AuthenticationFailedException
- at javax.mail.Service.connect(Service.java:306)
- at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:389)
- ... 4 more
發件結果:
發送html格式和發送附件的代碼
- /**
- * 發送帶有正文是html的郵件
- *
- * @throws MessagingException
- */
- public void sendHTML() throws MessagingException {
- JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender");// 獲取JavaMailSender
- // bean
- MimeMessage mm = sender.createMimeMessage();
- MimeMessageHelper helper = new MimeMessageHelper(mm, true, "utf-8");
- try {
- helper.setTo("aaaa@qq.com");// 接受者
- helper.setFrom("bbbb@163.com");// 發送者
- helper.setSubject("郵件主題");// 主題
- helper.setText("<html><head></head><body><h1>hello!!beckham</h1></body></html>",true);// 第二個參數代表發送的是正文是html
- sender.send(mm);
- System.out.println("發送完畢");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 發送帶有附件的郵件
- *
- * @throws MessagingException
- */
- public void sendFileMail() throws MessagingException {
- JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender");// 獲取JavaMailSender
- // bean
- MimeMessage mm = sender.createMimeMessage();
- MimeMessageHelper helper = new MimeMessageHelper(mm, true, "utf-8");
- try {
- helper.setTo("aaaa@qq.com");// 接受者
- helper.setFrom("bbbb@163.com");// 發送者
- helper.setSubject("郵件主題");// 主題
- helper.setText("郵件內容");// 郵件內容
- //多個附件文件
- ClassPathResource in = new ClassPathResource("附件.txt");
- ClassPathResource in2 = new ClassPathResource("struts.xml");
- //MimeUtility.encodeWord()解決附件的文件名為中文問題
- helper.addAttachment(MimeUtility.encodeWord(in.getFilename()), in);
- helper.addAttachment(MimeUtility.encodeWord(in2.getFilename()), in2);
- sender.send(mm);
- System.out.println("發送完畢");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }