读书人

java中怎么实现邮件的发送包括网页文件

发布时间: 2013-04-05 10:24:33 作者: rapoo

java中如何实现邮件的发送包括网页文件的发送
原创作品:http://gaoqifang.blog.51cto.com/2270113/758306?说明:1、本程序可实现网页文件、普通文件的发送。?????????????2、实现邮件发送需要三个jar包的支持:commons-codec-1.3.jar、commons-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?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();?
????}?
??}?
}?

读书人网 >编程

热点推荐