【知識積累】JavaMail實現發郵件功能

leesf發表於2015-07-21

一、前言

  今天閒來沒事,想著通過程式來給別人發郵件。於是,上網搜了一下,相應的資料也很多,剛開始完成了郵件的簡單傳送,後來想如何能傳送附件,繼續尋找 答案,但是遇到了一個問題是當我使用txt型別作為附件時,附件裡的內容總是會顯示在正文裡面,並且還會出現正文亂碼的現象,之後經過不斷的查閱資料,終 於解決了問題,實現了我自己想要的功能。

二、準備工作

  需要的jar包下載地址:https://java.net/projects/javamail/pages/Home

三、原始碼

  主要的類有三個,程式碼分別如下。

  3.1 MailSenderInfo

  MailSenderInfo封裝了郵件的基本資訊。

package com.leesf.util;

import java.util.Properties;  

public class MailSenderInfo {    
    // 傳送郵件的伺服器的IP和埠    
    private String mailServerHost;    
    private String mailServerPort = "25";    
    // 郵件傳送者的地址    
    private String fromAddress;    
    // 郵件接收者的地址    
    private String toAddress;    
    // 登陸郵件傳送伺服器的使用者名稱和密碼    
    private String userName;    
    private String password;    
    // 是否需要身份驗證    
    private boolean validate = false;    
    // 郵件主題    
    private String subject;    
    // 郵件的文字內容    
    private String content;    
    // 郵件附件的檔名    
    private String[] attachFileNames;      
    /**   
      * 獲得郵件會話屬性   
      */    
    public Properties getProperties(){    
      Properties p = new Properties();    
      p.put("mail.smtp.host", this.mailServerHost);    
      p.put("mail.smtp.port", this.mailServerPort);    
      p.put("mail.smtp.auth", validate ? "true" : "false");    
      return p;    
    }    
    public String getMailServerHost() {    
      return mailServerHost;    
    }    
    public void setMailServerHost(String mailServerHost) {    
      this.mailServerHost = mailServerHost;    
    }   
    public String getMailServerPort() {    
      return mailServerPort;    
    }   
    public void setMailServerPort(String mailServerPort) {    
      this.mailServerPort = mailServerPort;    
    }   
    public boolean isValidate() {    
      return validate;    
    }   
    public void setValidate(boolean validate) {    
      this.validate = validate;    
    }   
    public String[] getAttachFileNames() {    
      return attachFileNames;    
    }   
    public void setAttachFileNames(String[] fileNames) {    
      this.attachFileNames = fileNames;    
    }   
    public String getFromAddress() {    
      return fromAddress;    
    }    
    public void setFromAddress(String fromAddress) {    
      this.fromAddress = fromAddress;    
    }   
    public String getPassword() {    
      return password;    
    }   
    public void setPassword(String password) {    
      this.password = password;    
    }   
    public String getToAddress() {    
      return toAddress;    
    }    
    public void setToAddress(String toAddress) {    
      this.toAddress = toAddress;    
    }    
    public String getUserName() {    
      return userName;    
    }   
    public void setUserName(String userName) {    
      this.userName = userName;    
    }   
    public String getSubject() {    
      return subject;    
    }   
    public void setSubject(String subject) {    
      this.subject = subject;    
    }   
    public String getContent() {    
      return content;    
    }   
    public void setContent(String textContent) {    
      this.content = textContent;    
    }    
}   

  3.2 SimpleMailSender

  SimpleMailSender 實現傳送郵件的功能。

package com.leesf.util;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Date;    
import java.util.Properties;   
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;    
import javax.mail.BodyPart;    
import javax.mail.Message;    
import javax.mail.MessagingException;    
import javax.mail.Multipart;    
import javax.mail.Session;    
import javax.mail.Transport;    
import javax.mail.internet.InternetAddress;    
import javax.mail.internet.MimeBodyPart;    
import javax.mail.internet.MimeMessage;    
import javax.mail.internet.MimeMultipart;    
import javax.mail.internet.MimeUtility;
 
public class SimpleMailSender  {    
    
    /**   
     * 以文字格式傳送郵件   
     * @param mailInfo 待傳送的郵件的資訊   
     * @throws UnsupportedEncodingException
     */    
    public boolean sendTextMail(MailSenderInfo mailInfo) {    
      // 判斷是否需要身份認證    
      MyAuthenticator authenticator = null;    
      Properties pro = mailInfo.getProperties();   
      if (mailInfo.isValidate()) {    
      // 如果需要身份認證,則建立一個密碼驗證器    
        authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());    
      }   
      // 根據郵件會話屬性和密碼驗證器構造一個傳送郵件的session    
      Session sendMailSession = Session.getDefaultInstance(pro, authenticator);    
      try {    
          // 根據session建立一個郵件訊息    
          Message mailMessage = new MimeMessage(sendMailSession);    
          // 建立郵件傳送者地址    
          Address from = new InternetAddress(mailInfo.getFromAddress());    
          // 設定郵件訊息的傳送者    
          mailMessage.setFrom(from);    
          // 建立郵件的接收者地址,並設定到郵件訊息中    
          Address to = new InternetAddress(mailInfo.getToAddress());    
          mailMessage.setRecipient(Message.RecipientType.TO, to);    
          // 設定郵件訊息的主題    
          mailMessage.setSubject(mailInfo.getSubject());    
          // 設定郵件訊息傳送的時間    
          mailMessage.setSentDate(new Date());    
          // 設定郵件訊息的主要內容    
          String mailContent = mailInfo.getContent();    
          mailMessage.setText(mailContent);
          // 傳送郵件    
          Transport.send(mailMessage);   
          return true;    
      } catch (MessagingException ex) {    
          ex.printStackTrace();    
      }    
      return false;    
    }    
       
    /**   
      * 以HTML格式傳送郵件   
      * @param mailInfo 待傳送的郵件資訊   
      */    
    public boolean sendHtmlMail(MailSenderInfo mailInfo) {    
      // 判斷是否需要身份認證    
      MyAuthenticator authenticator = null;   
      Properties pro = mailInfo.getProperties();   
      //如果需要身份認證,則建立一個密碼驗證器     
      if (mailInfo.isValidate()) {    
        authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());   
      }    
      // 根據郵件會話屬性和密碼驗證器構造一個傳送郵件的session    
      Session sendMailSession = Session.getDefaultInstance(pro, authenticator);    
      try {    
          // 根據session建立一個郵件訊息    
          Message mailMessage = new MimeMessage(sendMailSession);    
          // 建立郵件傳送者地址    
          Address from = new InternetAddress(mailInfo.getFromAddress());    
          // 設定郵件訊息的傳送者    
          mailMessage.setFrom(from);    
          // 建立郵件的接收者地址,並設定到郵件訊息中    
          Address to = new InternetAddress(mailInfo.getToAddress());    
          // Message.RecipientType.TO屬性表示接收者的型別為TO    
          mailMessage.setRecipient(Message.RecipientType.TO,to);    
          // 設定郵件訊息的主題    
          mailMessage.setSubject(mailInfo.getSubject());    
          // 設定郵件訊息傳送的時間    
          mailMessage.setSentDate(new Date());    
          // MiniMultipart類是一個容器類,包含MimeBodyPart型別的物件    
          Multipart mainPart = new MimeMultipart();    
          // 建立一個包含HTML內容的MimeBodyPart    
          BodyPart html = new MimeBodyPart();    
          // 設定HTML內容    
          html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");    
          mainPart.addBodyPart(html);    
          // 將MiniMultipart物件設定為郵件內容    
          mailMessage.setContent(mainPart);    
          // 傳送郵件    
          Transport.send(mailMessage);    
          return true;    
      } catch (MessagingException ex) {    
          ex.printStackTrace();    
      }    
      return false;    
    }  
    
    /**   
      * 以HTML格式傳送郵件   
      * 並且新增附件格式
      * @param mailInfo 待傳送的郵件資訊   
      */  
    
    public boolean sendAttachMail(MailSenderInfo mailInfo) throws UnsupportedEncodingException {    
        // 判斷是否需要身份認證    
        MyAuthenticator authenticator = null;    
        Properties pro = mailInfo.getProperties();
        if (mailInfo.isValidate()) {    
            // 如果需要身份認證,則建立一個密碼驗證器    
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());    
        }   
        // 根據郵件會話屬性和密碼驗證器構造一個傳送郵件的session    
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);    
        try {    
                // 根據session建立一個郵件訊息    
            Message mailMessage = new MimeMessage(sendMailSession);    
              // 建立郵件傳送者地址    
              Address from = new InternetAddress(mailInfo.getFromAddress());    
              // 設定郵件訊息的傳送者    
              mailMessage.setFrom(from);    
              // 建立郵件的接收者地址,並設定到郵件訊息中    
              Address to = new InternetAddress(mailInfo.getToAddress());    
              mailMessage.setRecipient(Message.RecipientType.TO, to);    
              // 設定郵件訊息的主題    
              mailMessage.setSubject(mailInfo.getSubject());
              
              // 設定郵件訊息傳送的時間    
              mailMessage.setSentDate(new Date());  
            
              //設定帶附件的格式
              Multipart multipart = new MimeMultipart();  
              //設定正文
              MimeBodyPart textBodyPart = new MimeBodyPart();   
              textBodyPart.setText(mailInfo.getContent());  
              multipart.addBodyPart(textBodyPart);   
              
              //設定附件  
              MimeBodyPart attrBodyPart = new MimeBodyPart();
              DataSource dataSource = new FileDataSource(new File("C:\\Users\\LEESF\\Desktop\\test.txt"));  
              attrBodyPart.setDataHandler(new DataHandler(dataSource));  
              // 設定編碼格式,使附件能正常顯示中文名  
              attrBodyPart.setFileName(MimeUtility.encodeText("test.txt", "gbk", "B"));   
              multipart.addBodyPart(attrBodyPart);  
              
              mailMessage.setContent(multipart, "text/html;charset=gbk");  
              Transport.send(mailMessage); // 傳送郵件  
              
              return true;    
        } catch (MessagingException ex) {    
            ex.printStackTrace();    
        }    
        return false;    
    }    
}   

  3.3 MyAuthenticator

  MyAuthenticator類主要實現郵箱的認證。

package com.leesf.util;

import javax.mail.*;   

public class MyAuthenticator extends Authenticator {   
    String userName=null;   
    String password=null;   
        
    public MyAuthenticator() {   
        
    }
    
    public MyAuthenticator(String username, String password) {    
        this.userName = username;    
        this.password = password;    
    }  
    
    protected PasswordAuthentication getPasswordAuthentication() {   
        return new PasswordAuthentication(userName, password);   
    }   
}

  3.4 Main

  用作測試使用。 

package com.leesf.Main;

import java.io.UnsupportedEncodingException;
import com.leesf.util.MailSenderInfo;
import com.leesf.util.SimpleMailSender;
public class Main {
    public static void main(String[] args) throws UnsupportedEncodingException {   
     //這個類主要是設定郵件   
     MailSenderInfo mailInfo = new MailSenderInfo();   
     //伺服器埠
     mailInfo.setMailServerHost("smtp.126.com");   
     //或者是通過qq郵箱傳送
     //mailInfo.setMailServerHost("smtp.qq.com");
     mailInfo.setMailServerPort("25");    
     mailInfo.setValidate(true);    
     //您的郵箱使用者名稱
     mailInfo.setUserName("leesf456@126.com");  
     //您的郵箱密碼   
     mailInfo.setPassword("**********");
     //傳送郵件源地址
     mailInfo.setFromAddress("leesf456@126.com");   
     //傳送郵件目的地址
     mailInfo.setToAddress("********@126.com");   
     //主題
     mailInfo.setSubject("設定郵箱標題 如:http://www.cnblogs.com/leesf456/ 我的部落格園");  
     //內容
     mailInfo.setContent("設定郵箱內容 如:http://www.cnblogs.com/leesf456/ 我的部落格園");    
     //這個類主要來傳送郵件   
     SimpleMailSender sms = new SimpleMailSender();   
     sms.sendTextMail(mailInfo);//傳送文體格式    
     sms.sendHtmlMail(mailInfo);//傳送html格式
     sms.sendAttachMail(mailInfo);//傳送帶附件格式
   }  
}

四、總結

  整個傳送郵件的流程就完成了,如果按照上文來,應該是不會出現什麼問題,原始碼已經上傳至github,歡迎fork,謝謝各位園友的觀看~

 

參考的連結如下:

http://akanairen.iteye.com/blog/1171713
http://www.blogjava.net/wangfun/archive/2009/04/15/265748.html  

如果轉載,請註明出處:http://www.cnblogs.com/leesf456/

相關文章