Java郵件群發(web版)

雲驛站發表於2013-11-05
1、本程式可實現網頁檔案、普通檔案的傳送。
2、實現郵件傳送需要三個jar包的支援:commons-codec-1.3.jarcommons-httpclient-3.0.jar(這兩個jar包實現抓取網際網路網頁內容)以及mail.jar
具體實現:
一、首先建立MailAuthenticator類,繼承自javax.mail.Authenticator類。此類實現發件箱的登陸驗證。
package com.company.simplemail; 

import javax.mail.Authenticator; 

import javax.mail.PasswordAuthentication; 

/** 
* 伺服器郵箱登入驗證 
*/
 
public class MailAuthenticatorextends 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 finaltransient 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 = newchar[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,一般用於傳送的網頁檔案都是按上面說的要求,自己另外製作的,專門用於郵件傳送的網頁。在網際網路上抓取的網頁傳送後,一般都不能在收件箱中完美的顯示

 


相關文章