JavaMail 發送郵件類

fwe3 9年前發布 | 2K 次閱讀 Java

 
/**

  • 郵件發送組件類
  • 該類需要三個jar文件: mail.jar,activation.jar,htmlparser.jar
  • @author Winter Lau (winter.lau[at]163.com)
  • @version 1.0 */ package lius.util.mail;

import java.io.File; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Date; import java.util.Properties;

import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Authenticator; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.SendFailedException; 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 org.htmlparser.Node; import org.htmlparser.Parser; import org.htmlparser.tags.ImageTag; import org.htmlparser.util.ParserException;

/**

  • 郵件發送組件,具體的使用方法參照該類的main方法
  • @author Winter Lau */ public abstract class MailSender extends Authenticator{

    private String username = null; //郵件發送帳號用戶名 private String userpasswd = null; //郵件發送帳號用戶口令 protected BodyPart messageBodyPart = null; protected Multipart multipart = new MimeMultipart(\"related\"); protected MimeMessage mailMessage = null; protected Session mailSession = null; protected Properties mailProperties = System.getProperties(); protected InternetAddress mailFromAddress = null; protected InternetAddress mailToAddress = null; protected Authenticator authenticator = null; protected String mailSubject = \"\"; protected Date mailSendDate = null;

    /**

    • 構造函數
    • @param smtpHost
    • @param username
    • @param password */ protected MailSender(String smtpHost, String username, String password) { this.username = username; this.userpasswd = password; mailProperties.put(\"mail.smtp.host\", smtpHost); mailProperties.put(\"mail.smtp.auth\", \"true\"); //設置smtp認證,很關鍵的一句 mailSession = Session.getDefaultInstance(mailProperties, this); mailMessage = new MimeMessage(mailSession); messageBodyPart = new MimeBodyPart(); } /**
    • 構造一個純文本郵件發送實例
    • @param smtpHost
    • @param username
    • @param password
    • @return */ public static MailSender getTextMailSender(String smtpHost, String username, String password) {
      return new MailSender(smtpHost,username,password) {
       public void setMailContent(String mailContent) throws MessagingException {
           messageBodyPart.setText(mailContent);
           multipart.addBodyPart(messageBodyPart);
       }            
      
      };
      } /**
    • 構造一個超文本郵件發送實例
    • @param smtpHost
    • @param username
    • @param password
    • @return */ public static MailSender getHtmlMailSender(String smtpHost, String username, String password) { return new MailSender(smtpHost,username,password) {

       private ArrayList arrayList1 = new ArrayList();
       private ArrayList arrayList2 = new ArrayList();
      
       public void setMailContent(String mailContent) throws MessagingException {
           String htmlContent = getContent(\"<img src=\", mailContent);
           messageBodyPart.setContent(htmlContent, \"text/html;charset=GB2312\");
           multipart.addBodyPart(messageBodyPart);
           //調用處理html文件中的圖片方法
           processHtmlImage(mailContent);
       }
      
       //處理html頁面上的圖片方法如下:
       private void processHtmlImage(String mailContent) throws MessagingException {
           for (int i = 0; i < arrayList1.size(); i++) {
               messageBodyPart = new MimeBodyPart();
               DataSource source = new FileDataSource((String) arrayList1.get(i));
               messageBodyPart.setDataHandler(new DataHandler(source));
               String contentId = \"<\" + (String) arrayList2.get(i) + \">\";
               messageBodyPart.setHeader(\"Content-ID\", contentId);
               messageBodyPart.setFileName((String) arrayList1.get(i));
               multipart.addBodyPart(messageBodyPart);
           }
       }
      
       //處理要發送的html文件,主要是針對html文件中的圖片
       private String getContent(String searchString, String mailContent) {
           try {
               Parser parser = Parser.createParser(new String(mailContent.getBytes(), ISO8859_1));
               Node[] images = parser.extractAllNodesThatAre(ImageTag.class);
               for(int i=0;i<images.length;i++) {
                   ImageTag imgTag = (ImageTag) images[i];
                   if(!imgTag.getImageURL().toLowerCase().startsWith(\"http://\"))
                       arrayList1.add(imgTag.getImageURL());
               }
           } catch (UnsupportedEncodingException e1) {
           } catch (ParserException e) {}
           String afterReplaceStr = mailContent;
           //在html文件中用\"cid:\"+Content-ID來替換原來的圖片鏈接
           for (int m = 0; m < arrayList1.size(); m++) {
               arrayList2.add(createRandomStr());
               String addString = \"cid:\" + (String) arrayList2.get(m);
               afterReplaceStr = mailContent.replaceAll(
                       (String) arrayList1.get(m), addString);
           }
           return afterReplaceStr;
       }
      
       //產生一個隨機字符串,為了給圖片設定Content-ID值
       private String createRandomStr() {
           char[] randomChar = new char[8];
           for (int i = 0; i < 8; i++) {
               randomChar[i] = (char) (Math.random() * 26 + \'a\');
           }
           String replaceStr = new String(randomChar);
           return replaceStr;
       }
      
       private final static String ISO8859_1 = \"8859_1\";  
      

      }; } /**

    • 用于實現郵件發送用戶驗證
    • @see javax.mail.Authenticator#getPasswordAuthentication */ protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, userpasswd); }

      /**

    • 設置郵件標題
    • @param mailSubject
    • @throws MessagingException */ public void setSubject(String mailSubject) throws MessagingException { this.mailSubject = mailSubject; mailMessage.setSubject(mailSubject); }

      /**

    • 所有子類都需要實現的抽象方法,為了支持不同的郵件類型
    • @param mailContent
    • @throws MessagingException */ protected abstract void setMailContent(String mailContent) throws MessagingException;

      /**

    • 設置郵件

</pre>

 本文由用戶 fwe3 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!