說明:1、本程序可實現網頁文件、普通文件的發送。
2、實現郵件發送需要三個jar包的支持:commons-codec-1.3.jar、commons-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;
}
}
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());
}
}
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());
}
}
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;
}
}
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();
}
}
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();
}
}
}
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://.....) 形式才能接收顯示
2,樣式用標籤style屬性寫
3, 圖片、鏈接必須使用絕對地址 (http://.....) 形式才能接收顯示
4,一般用於發送的網頁文件都是按上面說的要求,自己另外製作的,專門用於郵件發送的網頁。在互聯網上抓取的網頁發送後,一般都不能在收件箱中完美的顯示
轉載自:http://gaoqifang.blog.51cto.com/2270113/758306