如何進行JavaMail開發(fā)

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)如何進行JavaMail開發(fā),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都食品包裝袋小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站建設(shè)營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。

引入:最近項目中要做一個簡單的郵件功能,即從前臺輸入郵件內(nèi)容,去配置文件中讀取發(fā)件人、收件人等信息后,然后發(fā)送郵件到指定的郵箱,其中收件人和抄送人可以有多個,基于這個需求,查詢了相關(guān)資料,決定采用JavaMail這個插件來實現(xiàn)。

preparation:

1.JavaMail的介紹

JavaMail,顧名思義,提供給開發(fā)者處理電子郵件相關(guān)的編程接口。它是Sun發(fā)布的用來處理email的API。它可以方便地執(zhí)行一些常用的郵件傳輸。

雖然JavaMail是Sun的API之一,但它目前還沒有被加在標準的java開發(fā)工具包中(JavaDevelopmentKit),這就意味著你在使用前必須另外下載JavaMail文件。除此以外,你還需要有Sun的JavaBeans Activation Framework (JAF)。JavaBeans Activation Framework的運行很復雜,在這里簡單的說就是JavaMail的運行必須得依賴于它的支持。在Windows 2000下使用需要指定這些文件的路徑,在其它的操作系統(tǒng)上也類似。

JavaMail是可選包,因此如果需要使用的話你需要首先從java.sun.com下載。目前最新版本是JavaMail1.4,使用JavaMail的時候需要Javabean Activation Framework的支持,因此你也需要下載JAF。安裝JavaMail只是需要把他們加入到CLASSPATH中去,如果你不想修改 CLASSPATH的話,可以直接把他們的jar包直接copy到JAVA_HOME/lib/ext下。這樣JavaMail就安裝好了。

JavaMail包中用于處理電子郵件的核心類是:Session,Message,Address,Authenticator,Transport,Store,Folder等。Session定義了一個基本的郵件會話,它需要從Properties中讀取類似于郵件服務(wù)器,用戶名和密碼等信息

2.下載jar包

網(wǎng)上有下載鏈接,但是這里我還是把jar包給上傳

javamail-1[1].4.2.zip

jaf-1_1_1.zip

dom4j.jar 這個jar就不提供下載資源了

3.項目環(huán)境

system:win7  myeclipse:6.5  tomcat:5.0 JDK:編譯和運行都是1.4

如何進行JavaMail開發(fā)

為了方便,還是在之前的UpDown項目下運行的,本次用到的文件只有sendmail包下的文件。

4.class&method

請參考:http://www.jspcn.net/htmlnews/1150019680500144.html

start

導入javamail、JAF、dom4j的jar包,然后新建對應的文件如下:

Encrypt.jar  主要是用于對密碼進行加密和解密

package sendmail;      /**    * Module:      Encrypt.java     * Description: 對密碼進行加密和解密    * Company:     * Author:      ptp    * Date:        Mar 6, 2012    */  public class Encrypt   {          public static final int pass1 = 10;       public static final int pass2 = 1;          public Encrypt()       {       }          /**        * @Title: DoEncrypt         * @Description: 對密碼進行加密的方法        * @param @param str        * @param @return    設(shè)定文件         * @return String    返回類型         * @throws   */      public static String DoEncrypt(String str)       {           StringBuffer enStrBuff = new StringBuffer();           for (int i = 0; i < str.length(); i++)           {               int tmpch = str.charAt(i);               tmpch ^= 1;               tmpch ^= 0xa;               enStrBuff.append(Integer.toHexString(tmpch));           }              return enStrBuff.toString().toUpperCase();       }          /**        * @Title: DoDecrypt         * @Description: 對密碼進行解密的方法        * @param @param str        * @param @return    設(shè)定文件         * @return String    返回類型         * @throws   */      public static String DoDecrypt(String str)       {           String deStr = str.toLowerCase();           StringBuffer deStrBuff = new StringBuffer();           for (int i = 0; i < deStr.length(); i += 2)           {               String subStr = deStr.substring(i, i + 2);               int tmpch = Integer.parseInt(subStr, 16);               tmpch ^= 1;               tmpch ^= 0xa;               deStrBuff.append((char)tmpch);           }              return deStrBuff.toString();       }          public static void main(String args[])       {           String source = "123456";           String s = DoEncrypt(source);           System.out.println("de=" + s);                      source = DoDecrypt(s);           System.out.println("en=" + source);          }   }

MailInfo.java javabean定義郵件需要的字段以及對應的get和set方法

package sendmail;      /**    *Module:       MailInfo.java    *Description:  定義發(fā)送郵件的所有字段的javabean    *Company:          *Author:       ptp    *Date:         Mar 1, 2012    */  public class MailInfo{       private String host;// 郵件服務(wù)器域名或IP       private String from;// 發(fā)件人       private String to;// 收件人       private String cc;// 抄送人       private String username;// 發(fā)件人用戶名       private String password;// 發(fā)件人密碼       private String title;// 郵件的主題       private String content;// 郵件的內(nèi)容              public String getHost() {           return host;       }       public void setHost(String host) {           this.host = host;       }       public String getFrom() {           return from;       }       public void setFrom(String from) {           this.from = from;       }       public String getTo() {           return to;       }       public void setTo(String to) {           this.to = to;       }       public String getCc() {           return cc;       }       public void setCc(String cc) {           this.cc = cc;       }       public String getUsername() {           return username;       }       public void setUsername(String username) {           this.username = username;       }       public String getPassword() {           return password;       }       public void setPassword(String password) {           this.password = password;       }       public String getTitle() {           return title;       }       public void setTitle(String title) {           this.title = title;       }       public String getContent() {           return content;       }       public void setContent(String content) {           this.content = content;       }          }

MyAuthenticator.java 用于對郵件授權(quán)

package sendmail;      /**    *Module:       MailInfo.java    *Description:  郵件授權(quán)類    *Company:          *Author:       ptp    *Date:         Mar 6, 2012    */  import javax.mail.PasswordAuthentication;      public class MyAuthenticator extends javax.mail.Authenticator {       private String strUser;       private String strPwd;          public MyAuthenticator(String user, String password) {           this.strUser = user;           this.strPwd = password;       }          protected PasswordAuthentication getPasswordAuthentication() {           return new PasswordAuthentication(strUser, strPwd);       }   }

SendMail.java 發(fā)送郵件的封裝類

先讀取xml配置文件,然后解析xml文件,最后取得配置文件的值封裝完成后發(fā)郵件

package sendmail;      import java.io.BufferedReader;   import java.io.File;   import java.io.FileInputStream;   import java.io.FileNotFoundException;   import java.io.IOException;   import java.io.InputStreamReader;   import java.io.UnsupportedEncodingException;   import java.util.Properties;   import javax.mail.Message;   import javax.mail.MessagingException;   import javax.mail.Session;    import javax.mail.Transport;   import javax.mail.internet.AddressException;   import javax.mail.internet.InternetAddress;   import javax.mail.internet.MimeMessage;   import org.apache.commons.logging.Log;   import org.apache.commons.logging.LogFactory;   import org.dom4j.Document;   import org.dom4j.DocumentException;   import org.dom4j.DocumentHelper;   import org.dom4j.Element;      /**    * Module:      SendMail.java     * Description: 發(fā)送郵件    * Company:     * Author:      ptp    * Date:        Mar 1, 2012    */     public class SendMail {              private static final Log log = LogFactory.getLog(SendMail.class);          // 配置文件xml的路徑       private final static String XML_PATH = "src" + File.separator + "sendmail"              + File.separator + "SendMail.xml";          //xml文件中字段對應的javabean對象       private static MailInfo mailInfo = new MailInfo();              /**         * <p>Title: readXML</p>         * <p>Description:讀取xml文件,把文件內(nèi)容以字符串形式輸出</p>         * @param xmlPath 配置文件的路徑        * @return         * @throws Exception    */      private String readXML(String xmlPath) throws Exception {           log.debug("xmlPath="+xmlPath);                      String fileContent = "";           File file = new File(xmlPath);           if (file.isFile() && file.exists()) {               try {                   InputStreamReader read = new InputStreamReader(                           new FileInputStream(file), "UTF-8");                   BufferedReader reader = new BufferedReader(read);                   String line;                   try {                       while ((line = reader.readLine()) != null) {                           fileContent += line;                       }                       reader.close();                       read.close();                   } catch (IOException e) {                       e.printStackTrace();                   }               } catch (UnsupportedEncodingException e) {                   e.printStackTrace();               } catch (FileNotFoundException e) {                   e.printStackTrace();               }           }else{               throw new Exception("config目錄下的配置文件SendMail.xml不存在,請檢查");           }           log.debug("xml="+fileContent);           return fileContent;       }              /**         * <p>Title: parseXML</p>         * <p>Description:發(fā)送郵件給指定的收件人和抄送人,同時進行一些簡單的校驗判斷,如必填項的字段、type的值</p>         * @param xml 配置文件的內(nèi)容        * @param type  郵件類型   */      private void parseXML(String xml, String type) {           type=type.toLowerCase();//忽略type字段的大小寫           try {               // 解析XML,獲得doc對象               Document doc = DocumentHelper.parseText(xml);                  // 判斷type的值是否正確,type的值應是報文二級節(jié)點中的一個               String flag = doc.getRootElement().element(type) + "";               if (null == flag || flag.equals("null"))                   throw new DocumentException(                           "傳入的type值不對,type的值應是SendMail.xml報文中二級節(jié)點的一個,請查看文件然后重新傳入type的值");                  // 設(shè)置主機名稱               Element hostEle = (Element) doc.selectSingleNode("/mail/" + type                       + "/host");               if (null == hostEle || "".equals(hostEle.getTextTrim())) {                   throw new DocumentException("郵件服務(wù)器域名或IP不能為空,請檢查配置文件SendMail.xml");               }               mailInfo.setHost(hostEle == null ? "" : hostEle.getTextTrim());                  // 設(shè)置發(fā)件人               Element fromEle = (Element) doc.selectSingleNode("/mail/" + type                       + "/from");               if (null == fromEle || "".equals(fromEle.getTextTrim())) {                   throw new DocumentException("發(fā)件人地址不能為空,請檢查配置文件SendMail.xml");               }               mailInfo.setFrom(fromEle == null ? "" : fromEle.getTextTrim());                  // 設(shè)置郵件主題               Element titleEle = (Element) doc.selectSingleNode("/mail/" + type                       + "/title");               mailInfo.setTitle(titleEle == null ? "" : titleEle.getTextTrim());                  // 設(shè)置收件人,對多個收件人的處理放在后面               Element toEle = (Element) doc.selectSingleNode("/mail/" + type                       + "/to");               if (null == toEle || "".equals(toEle.getTextTrim())) {                   throw new DocumentException("收件人地址不能為空,請檢查配置文件SendMail.xml");               }               mailInfo.setTo(toEle == null ? "" : toEle.getTextTrim());                  // 設(shè)置抄送,對多個抄送人的處理放在后面               Element ccEle = (Element) doc.selectSingleNode("/mail/" + type                       + "/cc");               mailInfo.setCc(ccEle == null ? "" : ccEle.getTextTrim());                              //設(shè)置發(fā)件人用戶名               Element nameEle = (Element) doc.selectSingleNode("/mail/" + type                       + "/username");               if(null==nameEle||"".equals(nameEle.getTextTrim())){                   throw new DocumentException("發(fā)件人用戶名不能為空,請檢查配置文件SendMail.xml");               }               mailInfo.setUsername(nameEle == null ? "" : nameEle.getTextTrim());                              //設(shè)置發(fā)件人密碼               Element passEle = (Element) doc.selectSingleNode("/mail/" + type                       + "/password");               if(null==passEle||"".equals(passEle.getTextTrim())){                   throw new DocumentException("發(fā)件人密碼不能為空,請檢查配置文件SendMail.xml");               }               mailInfo.setPassword(passEle == null ? "" : passEle.getTextTrim());              } catch (DocumentException e) {               e.printStackTrace();           }       }              /**        * <p>Title: sendMailOfValidate</p>        * <p>Description:發(fā)送郵件的方法,Authenticator類驗證</p>   */      private void sendMailOfValidate() {           Properties props = System.getProperties();           props.put("mail.smtp.host", mailInfo.getHost());//設(shè)置郵件服務(wù)器的域名或IP           props.put("mail.smtp.auth", "true");//授權(quán)郵件,mail.smtp.auth必須設(shè)置為true                      String password=mailInfo.getPassword();//密碼           try {              password=Encrypt.DoDecrypt(password);//如果密碼經(jīng)過加密用此方法對密碼進行解密           } catch (NumberFormatException e1) {             //如果密碼未經(jīng)過加密,則對密碼不做任何處理           }           //傳入發(fā)件人的用戶名和密碼,構(gòu)造MyAuthenticator對象           MyAuthenticator myauth = new MyAuthenticator(mailInfo.getUsername(),password);                      //傳入props、myauth對象,構(gòu)造郵件授權(quán)的session對象           Session session = Session.getDefaultInstance(props, myauth);              //將Session對象作為MimeMessage構(gòu)造方法的參數(shù)傳入構(gòu)造message對象           MimeMessage message = new MimeMessage(session);           try {               message.setFrom(new InternetAddress(mailInfo.getFrom()));//發(fā)件人      // 對多個收件人的情況進行處理,配置文件SendMail.xml中每個收件人之間必須用逗號隔開的               if (mailInfo.getTo() != null && !"".equals(mailInfo.getTo())) {                   String to[] = mailInfo.getTo().split(",");                   for (int i = 0; i < to.length; i++) {                       message.addRecipient(Message.RecipientType.TO,                               new InternetAddress(to[i]));// 收件人                   }               }                  // 對多個抄送人的情況進行處理,每個抄送人之間用逗號隔開的               if (mailInfo.getCc() != null && !"".equals(mailInfo.getCc())) {                   String cc[] = mailInfo.getCc().split(",");                   for (int j = 0; j < cc.length; j++) {                       message.addRecipient(Message.RecipientType.CC,                               new InternetAddress(cc[j]));// 抄送                   }               }               message.setSubject(mailInfo.getTitle());// 主題                              message.setText(mailInfo.getContent());// 內(nèi)容                  Transport.send(message);// 調(diào)用發(fā)送郵件的方法                          log.debug("郵件發(fā)送成功");           } catch (AddressException e) {               e.printStackTrace();           } catch (MessagingException e) {               e.printStackTrace();           }       }              /**         * <p>Title: sendMail</p>         * <p>Description:外部程序調(diào)用的入口</p>         * @param type 郵件的類型,目前有三種,即logmessage、checkmessage、ordermessage,type只能傳這三個值中一個,傳其他的任何值都不行        * @param content 郵件的內(nèi)容        * @throws Exception    */      public void sendMail(String type,String content) throws Exception{           log.debug("入?yún)ype="+type);           log.debug("入?yún)ontent="+content);           if (null == type || "".equals(type) || null == content                   || "".equals(content)) {               throw new Exception("方法的入?yún)ype和content字段的值都不能為空或null");           }                      String xml=readXML(XML_PATH);//獲得xml字符串                      parseXML(xml,type);//解析xml字符串,把對應字段的值放入到mailInfo對象中                      mailInfo.setContent(content);//設(shè)置發(fā)送的內(nèi)容                      sendMailOfValidate();//發(fā)送郵件                  }          /**        * 為了方便直接用main方法測試        * @param args        * @throws Exception   */      public static void main(String args[]) throws Exception {              SendMail mail = new SendMail();                      // type類型,根據(jù)此字段去配置文件SendMail.xml中匹配,然后發(fā)到相應的郵箱           String type = "logmessage";                      // 郵件的內(nèi)容,實際開發(fā)中這個內(nèi)容是前臺傳到后臺           String content = "你好,歡飲使用JavaMail包開發(fā)郵件功能";                      // 在其他類中調(diào)用時只能看到sendMail方法,為了保護內(nèi)部細節(jié),其它的方法都聲明為私有的           mail.sendMail(type, content);           //這個項目中沒有日志文件,所以我打印一句話來告訴自己程序已經(jīng)成功運行           System.out.println("****success****");          }   }

說明:代碼中的校驗可能不太嚴謹和全面,因為這個配置文件是由開發(fā)人員自己配置,并且對配置文件也有詳細的介紹,所以代碼中就省略去了許多的校驗。

SendMail.xml 郵件配置文件

<?xml version="1.0" encoding="UTF-8"?><!-- 此處編碼格式必須用UTF-8格式,這樣和程序中的解碼是統(tǒng)一的,不會出現(xiàn)亂碼 -->   <mail>       <logmessage><!--報文的二級節(jié)點,為了使傳入的type值對大小寫不限制,故此處必須用小寫 -->           <host>smtp.qq.com</host><!-- 郵件服務(wù)器域名或IP,必填項 -->           <from>838045782@qq.com</from><!-- 發(fā)件人 ,必填項 -->           <to>838045782@qq.com,taipeng0820@163.com</to><!-- 收件人,多個收件人之間用英文狀態(tài)下的逗號隔開,必填項 -->           <cc>838045782@qq.com</cc><!-- 抄送,多個抄送人之間用英文狀態(tài)下的逗號隔開-->           <title>test JavaMail</title><!-- 郵件主題-->           <username>838045782@qq.com</username><!-- 發(fā)件人郵箱的用戶名,即email的全地址,必填項 -->           <password>123456</password><!-- 發(fā)件人郵箱的密碼,像QQ郵箱如果設(shè)置了獨立密碼應輸入獨立密碼,必填項,為了安全起見填寫密碼之前最好用Encrypt類的DoEncrypt方法加密 -->       </logmessage>          <checkmessage>           <host></host>           <from></from>           <to></to>           <cc></cc>           <title></title>           <username></username>           <password></password>       </checkmessage>          <ordermessage>           <host></host>           <from></from>           <to></to>           <cc></cc>           <title></title>           <username></username>           <password></password>       </ordermessage>   </mail>

注意:密碼是必填項,由于是介紹,我把自己的密碼給刪掉換成了123456,實際中需根據(jù)需要配置郵件服務(wù)器域名、發(fā)件人、收件人、抄送人、用戶名和密碼。

result

運行方式:執(zhí)行運行SendMail.java類中的main方式就可以測試了,測試之前請按說明配置xml文件。

首次運行你可能會遇到以下的錯誤,所以note.txt文件就用來提供遇到的錯誤以及對應的解決方案

note.txt

java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream  at javax.mail.Session.loadProvidersFromStream(Session.java:928)  at javax.mail.Session.access$000(Session.java:174)  at javax.mail.Session$1.load(Session.java:870)  at javax.mail.Session.loadResource(Session.java:1084)  at javax.mail.Session.loadProviders(Session.java:889)  at javax.mail.Session.<init>(Session.java:210)  at javax.mail.Session.getDefaultInstance(Session.java:299)  at mail.SendMail.sendMail(SendMail.java:31)  at mail.SendMail.main(SendMail.java:50)  Exception in thread "main"

解決方案:在myeclipse的安裝目錄下搜索javaee.jar,然后用壓縮軟件打開,刪除javax下的mail文件夾

java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport  at javax.activation.MailcapCommandMap.<init>(MailcapCommandMap.java:140)  at javax.activation.CommandMap.getDefaultCommandMap(CommandMap.java:61)  at javax.activation.DataHandler.getCommandMap(DataHandler.java:153)  at javax.activation.DataHandler.getDataContentHandler(DataHandler.java:611)  at javax.activation.DataHandler.writeTo(DataHandler.java:315)  at javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:264)  at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1299)  at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2071)  at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2039)  at javax.mail.Transport.send(Transport.java:119)  at mail.SendMail.sendMailNoValidate(SendMail.java:48)  at mail.SendMail.main(SendMail.java:96)  Exception in thread "main"

解決方案:在myeclipse的安裝目錄下搜索javaee.jar,然后用壓縮軟件打開,刪除javax文件夾下的activation文件夾

javax.mail.SendFailedException: Sending failed;  nested exception is:   javax.mail.MessagingException: 503 Error: need EHLO and AUTH first !   at javax.mail.Transport.send0(Transport.java:219)  at javax.mail.Transport.send(Transport.java:81)  at com.asiainfo.bboss.sendmail.SendMailServiceImpl.sendMailNoValidate(SendMailServiceImpl.java:210)  at com.asiainfo.bboss.sendmail.SendMailServiceImpl.sendMail(SendMailServiceImpl.java:243)  at com.asiainfo.bboss.sendmail.SendMailServiceImpl.main(SendMailServiceImpl.java:261)

解決方案:props.put("mail.smtp.auth", "true");

javax.mail.SendFailedException: Sending failed;  nested exception is:   javax.mail.AuthenticationFailedException  at javax.mail.Transport.send0(Transport.java:219)  at javax.mail.Transport.send(Transport.java:81)  at com.asiainfo.bboss.sendmail.SendMailServiceImpl.sendMailNoValidate(SendMailServiceImpl.java:211)  at com.asiainfo.bboss.sendmail.SendMailServiceImpl.sendMail(SendMailServiceImpl.java:244)  at com.asiainfo.bboss.sendmail.SendMailServiceImpl.main(SendMailServiceImpl.java:262)

解決方案: MyAuthenticator myauth = new MyAuthenticator(mailInfo.getUsername(),password);

運行截圖如下:

圖1:myeclipse后臺打印的結(jié)果 此項目下沒有l(wèi)og4j.properties文件,故會有紅色的信息,代碼中的log也沒有打印出來

如何進行JavaMail開發(fā)

圖2:去我的QQ郵箱收信---收件箱列表

如何進行JavaMail開發(fā)

圖3:去我的QQ郵箱收信---郵件內(nèi)容

如何進行JavaMail開發(fā)

圖4:去我的163郵箱收信---收件箱列表

確認已經(jīng)收到郵件,因為163郵件顯示的是本人的真實姓名,這里就不截圖了。

圖5:去我的163郵箱收信---郵件內(nèi)容

確認已經(jīng)收到郵件,因為163郵件顯示的是本人的真實姓名,這里就不截圖了。

以上只是對javamail插件一個小小的應用,此插件也可以做收信、轉(zhuǎn)發(fā)、答復、上傳附件等功能,

上述就是小編為大家分享的如何進行JavaMail開發(fā)了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當前名稱:如何進行JavaMail開發(fā)
標題URL:http://bm7419.com/article10/gijodo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、建站公司、小程序開發(fā)、網(wǎng)站設(shè)計、網(wǎng)站內(nèi)鏈域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司