Java中如何實(shí)現(xiàn)郵件的發(fā)送包括網(wǎng)頁文件的發(fā)送
說明:
1、本程序可實(shí)現(xiàn)網(wǎng)頁文件、普通文件的發(fā)送。
2、實(shí)現(xiàn)郵件發(fā)送需要三個jar包的支持:commons-codec-1.3.jar、commons-httpclient-3.0.jar(這兩個jar包實(shí)現(xiàn)抓取互聯(lián)網(wǎng)網(wǎng)頁內(nèi)容)以及mail.jar
具體實(shí)現(xiàn):
一、首先建立MailAuthenticator類,繼承自javax.mail.Authenticator類。此類實(shí)現(xiàn)發(fā)件箱的登陸驗(yàn)證。
- package com.company.simplemail;
- import javax.mail.Authenticator;
- import javax.mail.PasswordAuthentication;
- /**
- * 服務(wù)器郵箱登錄驗(yàn)證
- */
- 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類,此類實(shí)現(xiàn)郵件的單發(fā)、群發(fā)等等,是郵件發(fā)送的核心類。
- 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;
- /**
- * 簡單郵件發(fā)送器,可單發(fā),群發(fā)。
- */
- public class SimpleMailSender {
- // 發(fā)送郵件的props文件
- private final transient Properties props = System.getProperties();
- // 郵件服務(wù)器登錄驗(yàn)證
- private transient MailAuthenticator authenticator;
- // 郵箱session
- private transient Session session;
- /**
- * 初始化郵件發(fā)送器
- * @param smtpHostName SMTP郵件服務(wù)器地址
- * @param username 發(fā)送郵件的用戶名(地址)
- * @param password 發(fā)送郵件的密碼
- */
- public SimpleMailSender(final String smtpHostName, final String username,
- final String password) {
- init(username, password, smtpHostName);
- }
- /**
- * 初始化郵件發(fā)送器
- * @param username 發(fā)送郵件的用戶名(地址),并以此解析SMTP服務(wù)器地址
- * @param password 發(fā)送郵件的密碼
- */
- public SimpleMailSender(final String username, final String password) {
- // 通過郵箱地址解析出smtp服務(wù)器,對大多數(shù)郵箱都管用
- final String smtpHostName = "smtp." + username.split("@")[1];
- init(username, password, smtpHostName);
- }
- /**
- * 初始化
- * @param username 發(fā)送郵件的用戶名(地址)
- * @param password 密碼
- * @param smtpHostName SMTP主機(jī)地址
- */
- private void init(String username, String password, String smtpHostName) {
- // 初始化props
- props.put("mail.smtp.auth", "true");
- props.put("mail.smtp.host", smtpHostName);
- // 驗(yàn)證
- authenticator = new MailAuthenticator(username, password);
- // 創(chuàng)建session
- session = Session.getInstance(props, authenticator);
- }
- /**
- * 發(fā)送郵件
- * @param recipient收件人郵箱地址
- * @param subject郵件主題
- * @param content郵件內(nèi)容
- * @throws AddressException
- * @throws MessagingException
- */
- public void send(String recipient, String subject, String content)
- throws AddressException, MessagingException {
- // 創(chuàng)建mime類型郵件
- final MimeMessage message = new MimeMessage(session);
- // 設(shè)置發(fā)信人
- message.setFrom(new InternetAddress(authenticator.getUsername()));
- // 設(shè)置收件人
- message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
- // 設(shè)置主題
- message.setSubject(subject);
- // 設(shè)置郵件內(nèi)容
- Multipart mp = new MimeMultipart("related");
- MimeBodyPart mbp = new MimeBodyPart();
- mbp.setContent(content.toString(),"text/html;charset=utf-8");
- mp.addBodyPart(mbp);
- message.setContent(mp);
- // 設(shè)置郵件內(nèi)容
- // message.setContent(content.toString(), "text/html;charset=utf-8");
- // 發(fā)送
- Transport.send(message);
- }
- /**
- * 群發(fā)郵件
- * @param recipients收件人們
- * @param subject 主題
- * @param content 內(nèi)容
- * @throws AddressException
- * @throws MessagingException
- */
- public void send(List<String> recipients, String subject, String content)
- throws AddressException, MessagingException {
- // 創(chuàng)建mime類型郵件
- final MimeMessage message = new MimeMessage(session);
- // 設(shè)置發(fā)信人
- message.setFrom(new InternetAddress(authenticator.getUsername()));
- // 設(shè)置收件人們
- 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);
- // 設(shè)置主題
- message.setSubject(subject);
- // 設(shè)置郵件內(nèi)容
- message.setContent(content.toString(), "text/html;charset=utf-8");
- // 發(fā)送
- Transport.send(message);
- }
- /**
- * 發(fā)送郵件
- * @param recipient收件人郵箱地址
- * @param mail郵件對象
- * @throws AddressException
- * @throws MessagingException
- *
- */
- public void send(String recipient, SimpleMail mail)
- throws AddressException, MessagingException {
- send(recipient, mail.getSubject(), mail.getContent());
- }
- /**
- * 群發(fā)郵件
- * @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類,這只是個普通郵件類,主要用來封裝所要發(fā)送的郵件信息。
- package com.company.simplemail;
- public class SimpleMail {
- //郵件中的主題
- private String subject;
- //郵件的內(nèi)容(正文)
- private String content;
- //可根據(jù)需要增加其他郵件元素
- 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類,此類用來讀取網(wǎng)頁文件(當(dāng)然也能讀取普通文件),將文件轉(zhuǎn)換成String用來發(fā)送
- 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;
- }
- /**
- *
- * 所要發(fā)送的網(wǎng)頁中,不要使用外聯(lián)樣式,腳本等,
- * 因?yàn)楦鞔筻]箱后臺的過濾算法會過濾掉css,script等
- * 樣式用標(biāo)簽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();
- }
- }
五、建立測試類,可以發(fā)送郵件了?。。?/p>
- package com.company.simplemail;
- import java.util.ArrayList;
- import java.util.List;
- import org.junit.Test;
- import com.company.util.ReadHtmlFile;
- public class MailTest {
- /**
- * 單發(fā)
- * */
- @Test
- public void testSingleSend(){
- SimpleMail sm=new SimpleMail();
- sm.setSubject("第一封郵件");
- String str = ReadHtmlFile.getSource("http://www.baidu.com");
- //String str = ReadHtmlFile.readFile("這里填寫你需要發(fā)送的本地文件路徑");
- System.out.println(str);
- sm.setContent(str);
- SimpleMailSender sms=new SimpleMailSender(""這里填寫你的發(fā)件箱","這里填寫你的發(fā)件箱密碼");
- try {
- sms.send("這里需要填寫接收郵件的郵箱", sm);
- System.out.println("執(zhí)行完成??!");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 群發(fā)
- *
- * */
- @Test
- public void testMassSend(){
- SimpleMail sm=new SimpleMail();
- sm.setSubject("第一封郵件");
- String str = ReadHtmlFile.getSource("http://www.baidu.com");
- //String str = ReadHtmlFile.readFile("這里填寫需要發(fā)送的本地文件路徑");
- System.out.println(str);
- sm.setContent(str);
- SimpleMailSender sms=new SimpleMailSender("這里填寫你的發(fā)件箱","這里填寫你的發(fā)件箱密碼");
- List<String> recipients=new ArrayList<String>();
- recipients.add("這里需要填寫接收郵件的郵箱");
- recipients.add("這里需要填寫接收郵件的郵箱");
- recipients.add("這里需要填寫接收郵件的郵箱");
- recipients.add("這里需要填寫接收郵件的郵箱");
- try {
- sms.send(recipients, sm);
- System.out.println("執(zhí)行完成??!");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
最后再次強(qiáng)調(diào):
1,所要發(fā)送的網(wǎng)頁中,不要使用外聯(lián)樣式,腳本等,因?yàn)楦鞔筻]箱后臺的過濾算法會過濾掉css,script等。
2,樣式用標(biāo)簽style屬性寫。
3, 圖片、鏈接必須使用絕對地址 (http://.....) 形式才能接收顯示。
4,一般用于發(fā)送的網(wǎng)頁文件都是按上面說的要求,自己另外制作的,專門用于郵件發(fā)送的網(wǎng)頁。在互聯(lián)網(wǎng)上抓取的網(wǎng)頁發(fā)送后,一般都不能在收件箱中完美的顯示。
原文鏈接:http://gaoqifang.blog.51cto.com/2270113/758306
【編輯推薦】