天天看點

用javamail發送帶附件的郵件

今天學習了一下JavaMail,javamail發送郵件确實是一個比較麻煩的問題。為了以後使用友善,自己寫了段代碼,打成jar包,以友善以後使用。呵呵

用javamail發送帶附件的郵件

以下三段代碼是我的全部代碼,朋友們如果想用,直接複制即可。jar包因為我不知道怎麼傳到javaeye上,是以朋友們回去自己打吧。

我的代碼有三個類:

第一個類:MailSenderInfo.java

Java代碼

用javamail發送帶附件的郵件
用javamail發送帶附件的郵件
用javamail發送帶附件的郵件
  1. package com.util.mail;   
  2. import java.util.Properties;    
  3. public class MailSenderInfo {    
  4.     // 發送郵件的伺服器的IP和端口    
  5.     private String mailServerHost;    
  6.     private String mailServerPort = "25";    
  7.     // 郵件發送者的位址    
  8.     private String fromAddress;    
  9.     // 郵件接收者的位址    
  10.     private String toAddress;    
  11.     // 登陸郵件發送伺服器的使用者名和密碼    
  12.     private String userName;    
  13.     private String password;    
  14.     // 是否需要身份驗證    
  15.     private boolean validate = false;    
  16.     // 郵件主題    
  17.     private String subject;    
  18.     // 郵件的文本内容    
  19.     private String content;    
  20.     // 郵件附件的檔案名    
  21.     private String[] attachFileNames;      
  22.     public Properties getProperties(){    
  23.       Properties p = new Properties();    
  24.       p.put("mail.smtp.host", this.mailServerHost);    
  25.       p.put("mail.smtp.port", this.mailServerPort);    
  26.       p.put("mail.smtp.auth", validate ? "true" : "false");    
  27.       return p;    
  28.     }    
  29.     public String getMailServerHost() {    
  30.       return mailServerHost;    
  31.     }    
  32.     public void setMailServerHost(String mailServerHost) {    
  33.       this.mailServerHost = mailServerHost;    
  34.     }   
  35.     public String getMailServerPort() {    
  36.       return mailServerPort;    
  37.     }   
  38.     public void setMailServerPort(String mailServerPort) {    
  39.       this.mailServerPort = mailServerPort;    
  40.     }   
  41.     public boolean isValidate() {    
  42.       return validate;    
  43.     }   
  44.     public void setValidate(boolean validate) {    
  45.       this.validate = validate;    
  46.     }   
  47.     public String[] getAttachFileNames() {    
  48.       return attachFileNames;    
  49.     }   
  50.     public void setAttachFileNames(String[] fileNames) {    
  51.       this.attachFileNames = fileNames;    
  52.     }   
  53.     public String getFromAddress() {    
  54.       return fromAddress;    
  55.     }    
  56.     public void setFromAddress(String fromAddress) {    
  57.       this.fromAddress = fromAddress;    
  58.     }   
  59.     public String getPassword() {    
  60.       return password;    
  61.     }   
  62.     public void setPassword(String password) {    
  63.       this.password = password;    
  64.     }   
  65.     public String getToAddress() {    
  66.       return toAddress;    
  67.     }    
  68.     public void setToAddress(String toAddress) {    
  69.       this.toAddress = toAddress;    
  70.     }    
  71.     public String getUserName() {    
  72.       return userName;    
  73.     }   
  74.     public void setUserName(String userName) {    
  75.       this.userName = userName;    
  76.     }   
  77.     public String getSubject() {    
  78.       return subject;    
  79.     }   
  80.     public void setSubject(String subject) {    
  81.       this.subject = subject;    
  82.     }   
  83.     public String getContent() {    
  84.       return content;    
  85.     }   
  86.     public void setContent(String textContent) {    
  87.       this.content = textContent;    
  88.     }    
  89. }   

第二個類:SimpleMailSender.java

Java代碼

用javamail發送帶附件的郵件
用javamail發送帶附件的郵件
用javamail發送帶附件的郵件
  1. package com.util.mail;   
  2. import java.util.Date;    
  3. import java.util.Properties;   
  4. import javax.mail.Address;    
  5. import javax.mail.BodyPart;    
  6. import javax.mail.Message;    
  7. import javax.mail.MessagingException;    
  8. import javax.mail.Multipart;    
  9. import javax.mail.Session;    
  10. import javax.mail.Transport;    
  11. import javax.mail.internet.InternetAddress;    
  12. import javax.mail.internet.MimeBodyPart;    
  13. import javax.mail.internet.MimeMessage;    
  14. import javax.mail.internet.MimeMultipart;    
  15. public class SimpleMailSender  {    
  16.     public boolean sendTextMail(MailSenderInfo mailInfo) {    
  17.       // 判斷是否需要身份認證    
  18.       MyAuthenticator authenticator = null;    
  19.       Properties pro = mailInfo.getProperties();   
  20.       if (mailInfo.isValidate()) {    
  21.       // 如果需要身份認證,則建立一個密碼驗證器    
  22.         authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());    
  23.       }   
  24.       // 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session    
  25.    //   Session sendMailSession = Session.getDefaultInstance(pro,authenticator);    //不要用getDefaultInstance,這樣隻能使用一種郵箱,再想改成别的郵箱就不行了
  26.   Session sendMailSession = Session.getInstance(pro,authenticator); //用這個,程式裡可以切換其他郵箱,前提是這些郵箱要開通smtp協定,這是MailSenderInfo裡寫死的。
  27.       try {    
  28.       // 根據session建立一個郵件消息    
  29.       Message mailMessage = new MimeMessage(sendMailSession);    
  30.       // 建立郵件發送者位址    
  31.       Address from = new InternetAddress(mailInfo.getFromAddress());    
  32.       // 設定郵件消息的發送者    
  33.       mailMessage.setFrom(from);    
  34.       // 建立郵件的接收者位址,并設定到郵件消息中    
  35.       Address to = new InternetAddress(mailInfo.getToAddress());    
  36.       mailMessage.setRecipient(Message.RecipientType.TO,to);    
  37.       // 設定郵件消息的主題    
  38.       mailMessage.setSubject(mailInfo.getSubject());    
  39.       // 設定郵件消息發送的時間    
  40.       mailMessage.setSentDate(new Date());    
  41.       // 設定郵件消息的主要内容    
  42.       String mailContent = mailInfo.getContent();    
  43.       mailMessage.setText(mailContent);    
  44.       // 發送郵件    
  45.       Transport.send(mailMessage);   
  46.       return true;    
  47.       } catch (MessagingException ex) {    
  48.           ex.printStackTrace();    
  49.       }    
  50.       return false;    
  51.     }    
  52.     public static boolean sendHtmlMail(MailSenderInfo mailInfo){    
  53.       // 判斷是否需要身份認證    
  54.       MyAuthenticator authenticator = null;   
  55.       Properties pro = mailInfo.getProperties();   
  56.       //如果需要身份認證,則建立一個密碼驗證器     
  57.       if (mailInfo.isValidate()) {    
  58.         authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());   
  59.       }    
  60.       // 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session    
  61.       //   Session sendMailSession = Session.getDefaultInstance(pro,authenticator);    //不要用getDefaultInstance,這樣隻能使用一種郵箱,再想改成别的郵箱就不行了

     Session sendMailSession = Session.getInstance(pro,authenticator); //用這個,程式裡可以切換其他郵箱,前提是這些郵箱要開通smtp協定,這是MailSenderInfo裡寫死的。

          try {    

  62.       // 根據session建立一個郵件消息    
  63.       Message mailMessage = new MimeMessage(sendMailSession);    
  64.       // 建立郵件發送者位址    
  65.       Address from = new InternetAddress(mailInfo.getFromAddress());    
  66.       // 設定郵件消息的發送者    
  67.       mailMessage.setFrom(from);    
  68.       // 建立郵件的接收者位址,并設定到郵件消息中    
  69.       Address to = new InternetAddress(mailInfo.getToAddress());    
  70.       // Message.RecipientType.TO屬性表示接收者的類型為TO   
  71.       mailMessage.setRecipient(Message.RecipientType.TO,to);    
  72.       // 設定郵件消息的主題    
  73.       mailMessage.setSubject(mailInfo.getSubject());    
  74.       // 設定郵件消息發送的時間    
  75.       mailMessage.setSentDate(new Date());    
  76.       // MiniMultipart類是一個容器類,包含MimeBodyPart類型的對象   
  77.       Multipart mainPart = new MimeMultipart();    
  78.       // 建立一個包含HTML内容的MimeBodyPart    
  79.       BodyPart html = new MimeBodyPart();    
  80.       // 設定HTML内容    
  81.       html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");    
  82.       mainPart.addBodyPart(html);    
  83. //添加附件

         // 建立一新的MimeBodyPart 

         MimeBodyPart mdp = new MimeBodyPart();

         //得到檔案資料源

         FileDataSource fds = new FileDataSource("/mnt/sdcard/WhenC/20120417.sms");

         //得到附件本身并至入BodyPart

         mdp.setDataHandler(new DataHandler(fds));

         //得到檔案名同樣至入BodyPart

         mdp.setFileName(fds.getName());

         mainPart.addBodyPart(mdp);

  84.       // 将MiniMultipart對象設定為郵件内容    
  85.       mailMessage.setContent(mainPart);    
  86.       // 發送郵件    
  87.       Transport.send(mailMessage);    
  88.       return true;    
  89.       } catch (MessagingException ex) {    
  90.           ex.printStackTrace();    
  91.       }    
  92.       return false;    
  93.     }    
  94. }   

第三個類:MyAuthenticator.java

Java代碼

用javamail發送帶附件的郵件
用javamail發送帶附件的郵件
用javamail發送帶附件的郵件
  1. package com.util.mail;   
  2. import javax.mail.*;   
  3. public class MyAuthenticator extends Authenticator{   
  4.     String userName=null;   
  5.     String password=null;   
  6.     public MyAuthenticator(){   
  7.     }   
  8.     public MyAuthenticator(String username, String password) {    
  9.         this.userName = username;    
  10.         this.password = password;    
  11.     }    
  12.     protected PasswordAuthentication getPasswordAuthentication(){   
  13.         return new PasswordAuthentication(userName, password);   
  14.     }   
  15. }   

下面給出使用上面三個類的代碼:

Java代碼

用javamail發送帶附件的郵件
用javamail發送帶附件的郵件
用javamail發送帶附件的郵件
  1. public static void main(String[] args){   
  2.          //這個類主要是設定郵件   
  3.       MailSenderInfo mailInfo = new MailSenderInfo();    
  4.       mailInfo.setMailServerHost("smtp.163.com");    
  5.       mailInfo.setMailServerPort("25");    
  6.       mailInfo.setValidate(true);    
  7.       mailInfo.setUserName("[email protected]");    
  8.       mailInfo.setPassword("**********");//您的郵箱密碼   
  9.       mailInfo.setFromAddress("[email protected]");    
  10.       mailInfo.setToAddress("[email protected]");    
  11.       mailInfo.setSubject("設定郵箱标題");    
  12.       mailInfo.setContent("設定郵箱内容");    
  13.          //這個類主要來發送郵件   
  14.       SimpleMailSender sms = new SimpleMailSender();   
  15.           sms.sendTextMail(mailInfo);//發送文體格式   
  16.           sms.sendHtmlMail(mailInfo);//發送html格式  
  17.     }  

最後,給出朋友們幾個注意的地方:

1、使用此代碼你可以完成你的javamail的郵件發送功能。三個類缺一不可。

2、這三個類我打包是用的com.util.mail包,如果不喜歡,你可以自己改,但三個類檔案必須在同一個包中

3、不要使用你剛剛注冊過的郵箱在程式中發郵件,如果你的163郵箱是剛注冊不久,那你就不要使用“smtp.163.com”。因為你發不出去。剛注冊的郵箱是不會給你這種權限的,也就是你不能通過驗證。要使用你經常用的郵箱,而且時間比較長的。

4、另一個問題就是mailInfo.setMailServerHost("smtp.163.com");與mailInfo.setFromAddress("[email protected]");這兩句話。即如果你使用163smtp伺服器,那麼發送郵件位址就必須用163的郵箱,如果不的話,是不會發送成功的。

5、關于javamail驗證錯誤的問題,網上的解釋有很多,但我看見的隻有一個。就是我的第三個類。你隻要複制全了代碼,我想是不會有問題的。

6、網絡權限<uses-permission android:name="android.permission.INTERNET"/>