java中如何實現郵件的發送包括網頁文件的發送

說明:1、本程序可實現網頁文件、普通文件的發送。
             2、實現郵件發送需要三個jar包的支持:commons-codec-1.3.jarcommons-httpclient-3.0.jar(這兩個jar包實現抓取互聯網網頁內容)、commons-logging.jar(打印一些數據)以及mail.jar
 
具體實現:
一、首先建立MailAuthenticator類,繼承自javax.mail.Authenticator類。此類實現發件箱的登陸驗證。
package com.company.simplemail; 

import javax.mail.Authenticator; 

import javax.mail.PasswordAuthentication; 

/** 
* 服務器郵箱登錄驗證 
*/
 
public class MailAuthenticator extends Authenticator { 
    
//     用戶名(登錄郵箱) 
  private String username; 

//     密碼 
  private String password; 

  /** 
    * 初始化郵箱和密碼 
    * @param username 郵箱 
    * @param password 密碼 
    */
 
  public MailAuthenticator(String username, String password){ 
    this.username = username; 
    this.password = password; 
  } 

  String getPassword() { 
    return password; 
  } 

  @Override 
  protected PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(username, password); 
  } 

  String getUsername() { 
    return username; 
  } 

  public void setPassword(String password) { 
    this.password = password; 
  } 

  public void setUsername(String username) { 
    this.username = username; 
  } 

}
 
二、 建立SimpleMailSender類,此類實現郵件的單發、羣發等等,是郵件發送的核心類
package com.company.simplemail; 

import java.util.List; 
import java.util.Properties; 

import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMessage.RecipientType; 
import javax.mail.internet.MimeMultipart; 


/** 
* 簡單郵件發送器,可單發,羣發。 
*/
 
public class SimpleMailSender { 
//  發送郵件的props文件 
  private final transient Properties props = System.getProperties(); 

//    郵件服務器登錄驗證 
  private transient MailAuthenticator authenticator; 

//    郵箱session 
  private transient Session session; 
    
  /** 
    * 初始化郵件發送器 
    * @param smtpHostName SMTP郵件服務器地址 
    * @param username 發送郵件的用戶名(地址) 
    * @param password 發送郵件的密碼 
    */
 
  public SimpleMailSender(final String smtpHostName, final String username, 
      final String password) { 
    init(username, password, smtpHostName); 
  } 

  /** 
    * 初始化郵件發送器 
    * @param username 發送郵件的用戶名(地址),並以此解析SMTP服務器地址 
    * @param password 發送郵件的密碼 
    */
 
  public SimpleMailSender(final String username, final String password) { 
    // 通過郵箱地址解析出smtp服務器,對大多數郵箱都管用 
    final String smtpHostName = "smtp." + username.split("@")[1]; 
    init(username, password, smtpHostName); 
  } 

  /** 
    * 初始化 
    * @param username 發送郵件的用戶名(地址) 
    * @param password 密碼 
    * @param smtpHostName SMTP主機地址 
    */
 
  private void init(String username, String password, String smtpHostName) { 
    // 初始化props 
    props.put("mail.smtp.auth""true"); 
    props.put("mail.smtp.host", smtpHostName); 
    // 驗證 
    authenticator = new MailAuthenticator(username, password); 
    // 創建session 
    session = Session.getInstance(props, authenticator); 
  } 

  /** 
    * 發送郵件 
    * @param recipient收件人郵箱地址 
    * @param subject郵件主題 
    * @param content郵件內容 
    * @throws AddressException 
    * @throws MessagingException 
    */
 
  public void send(String recipient, String subject, String content) 
      throws AddressException, MessagingException { 
    // 創建mime類型郵件 
    final MimeMessage message = new MimeMessage(session); 
    // 設置發信人 
    message.setFrom(new InternetAddress(authenticator.getUsername())); 
    // 設置收件人 
    message.setRecipient(RecipientType.TO, new InternetAddress(recipient)); 
    // 設置主題 
    message.setSubject(subject); 
    // 設置郵件內容 
    Multipart mp = new MimeMultipart("related"); 
                MimeBodyPart mbp = new MimeBodyPart(); 
                mbp.setContent(content.toString(),"text/html;charset=utf-8"); 
                mp.addBodyPart(mbp); 
                message.setContent(mp); 
     
     
    // 設置郵件內容 
  //  message.setContent(content.toString(), "text/html;charset=utf-8"); 
    // 發送 
    Transport.send(message); 
  } 

  /** 
    * 羣發郵件 
    * @param recipients收件人們 
    * @param subject 主題 
    * @param content 內容 
    * @throws AddressException 
    * @throws MessagingException 
    */
 
  public void send(List<String> recipients, String subject, String content) 
      throws AddressException, MessagingException { 
    // 創建mime類型郵件 
    final MimeMessage message = new MimeMessage(session); 
    // 設置發信人 
    message.setFrom(new InternetAddress(authenticator.getUsername())); 
    // 設置收件人們 
    final int num = recipients.size(); 
    InternetAddress[] addresses = new InternetAddress[num]; 
    for (int i = 0; i < num; i++) { 
      addresses[i] = new InternetAddress(recipients.get(i)); 
    } 
    message.setRecipients(RecipientType.TO, addresses); 
    // 設置主題 
    message.setSubject(subject); 
    // 設置郵件內容 
    message.setContent(content.toString(), "text/html;charset=utf-8"); 
    // 發送 
    Transport.send(message); 
  } 

  /** 
    * 發送郵件 
    * @param recipient收件人郵箱地址 
    * @param mail郵件對象 
    * @throws AddressException 
    * @throws MessagingException 
    *                           
    */
 
  public void send(String recipient, SimpleMail mail) 
      throws AddressException, MessagingException { 
    send(recipient, mail.getSubject(), mail.getContent()); 
  } 

  /** 
    * 羣發郵件 
    * @param recipients 收件人們 
    * @param mail 郵件對 象  
    * @throws AddressException 
    * @throws MessagingException 
    */
 
  public void send(List<String> recipients, SimpleMail mail) 
      throws AddressException, MessagingException { 
    send(recipients, mail.getSubject(), mail.getContent()); 
  } 
}
 
 
三、   建立SimpleMail,這只是個普通郵件類,主要用來封裝所要發送的郵件信息。
package com.company.simplemail; 

public class SimpleMail { 
  //郵件中的主題 
  private String subject; 
  //郵件的內容(正文) 
  private String content; 
  //可根據需要增加其他郵件元素 

  public void setSubject(String subject) { 
    this.subject = subject; 
  } 

  public void setContent(String content) { 
    this.content = content; 
  } 

  public String getSubject() { 
    return subject; 
  } 

  public String getContent() { 
    return content; 
  } 
}
 
 
四、建立ReadHtmlFile類,此類用來讀取網頁文件(當然也能讀取普通文件),將文件轉換成String用來發送
package com.company.util; 

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 

import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.HttpException; 
import org.apache.commons.httpclient.methods.GetMethod; 

public class ReadHtmlFile { 

  public static HttpClient client = new HttpClient(); 
    
  //讀取普通文件 
  public static String readFile(String filename) { 
    File file = new File(filename); 
    Reader reader = null
    StringBuffer stb = new StringBuffer(); 
    int charread = 0; 
    char[] temps = new char[100]; 
    try { 
      reader = new InputStreamReader(new FileInputStream(file)); 
      while ((charread = reader.read(temps)) != -1) { 
        if (charread == temps.length) { 
          stb.append(temps); 
          temps = new char[100]; 
          charread = 0; 
        } 
      } 
      stb.append(temps); 
      reader.close(); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    String str = stb.toString(); 
    return str; 
  } 

  /** 
    *    
    * 所要發送的網頁中,不要使用外聯樣式,腳本等, 
    * 因爲各大郵箱後臺的過濾算法會過濾掉css,script等 
    * 樣式用標籤style屬性寫 
    * 圖片、鏈接必須使用絕對地址 (http://.....) 形式才能接收顯示 
    * */
 
  public static String getSource(String url) { 

    GetMethod method = new GetMethod(url); 

    try { 
      client.executeMethod(method); 
    } catch (HttpException e) { 
      e.printStackTrace(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    InputStream in = null
    try { 
      in = method.getResponseBodyAsStream(); 
    } catch (IOException e1) { 

      // e1.printStackTrace(); 
    } 
    in = new BufferedInputStream(in); 
    Reader r = new InputStreamReader(in); 
    int c; 
    StringBuffer buffer = new StringBuffer(); 

    try { 
      while ((c = r.read()) != -1) 
        buffer.append((char) c); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    try { 
      in.close(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    method.releaseConnection(); 

    return buffer.toString(); 
  } 

 
 
五、建立測試類,可以發送郵件了!!!
package com.company.simplemail; 

import java.util.ArrayList; 
import java.util.List; 

import org.junit.Test; 

import com.company.util.ReadHtmlFile; 

public class MailTest { 
  /** 
    * 單發 
    * */
 
  @Test 
  public void testSingleSend(){ 
    SimpleMail sm=new SimpleMail(); 
    sm.setSubject("第一封郵件"); 
    String str = ReadHtmlFile.getSource("http://www.baidu.com"); 
    //String str = ReadHtmlFile.readFile("這裏填寫你需要發送的本地文件路徑"); 
    System.out.println(str); 
    sm.setContent(str); 
    SimpleMailSender sms=new SimpleMailSender(""這裏填寫你的發件箱","這裏填寫你的發件箱密碼"); 
    try { 
      sms.send("這裏需要填寫接收郵件的郵箱", sm); 
      System.out.println("執行完成!!"); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
    
    
  /** 
    * 羣發 
    *    
    * */
 
  @Test 
  public void testMassSend(){ 
    SimpleMail sm=new SimpleMail(); 
    sm.setSubject("第一封郵件"); 
    String str = ReadHtmlFile.getSource("http://www.baidu.com"); 
    //String str = ReadHtmlFile.readFile("這裏填寫需要發送的本地文件路徑"); 
    System.out.println(str); 
    sm.setContent(str); 
    SimpleMailSender sms=new SimpleMailSender("這裏填寫你的發件箱","這裏填寫你的發件箱密碼"); 
    List<String> recipients=new ArrayList<String>(); 
    recipients.add("這裏需要填寫接收郵件的郵箱"); 
    recipients.add("這裏需要填寫接收郵件的郵箱"); 
    recipients.add("這裏需要填寫接收郵件的郵箱"); 
    recipients.add("這裏需要填寫接收郵件的郵箱"); 
    try { 
      sms.send(recipients, sm); 
      System.out.println("執行完成!!"); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 

 
 
最後再次強調:1,所要發送的網頁中,不要使用外聯樣式,腳本等,因爲各大郵箱後臺的過濾算法會過濾掉css,script等。
                  2,樣式用標籤style屬性寫
                  3, 圖片、鏈接必須使用絕對地址 (http://.....) 形式才能接收顯示
                  4,一般用於發送的網頁文件都是按上面說的要求,自己另外製作的,專門用於郵件發送的網頁。在互聯網上抓取的網頁發送後,一般都不能在收件箱中完美的顯示



轉載自:http://gaoqifang.blog.51cto.com/2270113/758306

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章