1.第一步,下载jar包(我用的是Eclipse【dom4j-1.6.1.jar,jaxen-full.jar,mail.jar,pop3.jar,saxpath.jar,smtp.jar】,如果用的MyEclipse的话(javaee6)必须导入【dom4j-1.6.1.jar,jaxen-full.jar,saxpath.jar】)
2.将jar包导入Eclipse的lib目录下
3.然后就是创建所需的类Encrypt(对密码进行加密和解密)
package sendmail;
/**
* Module: Encrypt.java Description: 对密码进行加密和解密 Company: Author: ptp Date: Mar
* 6, 2012
*/
public class EnCrypt {
public static final int pass1 = 10;
public static final int pass2 = 1;
public EnCrypt() {
}
/**
* @Title: DoEncrypt
* @Description: 对密码进行加密的方法
* @param @param str
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
public static String DoEncrypt(String str) {
StringBuffer enStrBuff = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
int tmpch = str.charAt(i);
tmpch ^= 1;
tmpch ^= 0xa;
enStrBuff.append(Integer.toHexString(tmpch));
}
return enStrBuff.toString().toUpperCase();
}
/**
* @Title: DoDecrypt
* @Description: 对密码进行解密的方法
* @param @param str
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
public static String DoDecrypt(String str) {
String deStr = str.toLowerCase();
StringBuffer deStrBuff = new StringBuffer();
for (int i = 0; i < deStr.length(); i += 2) {
String subStr = deStr.substring(i, i + 2);
int tmpch = Integer.parseInt(subStr, 16);
tmpch ^= 1;
tmpch ^= 0xa;
deStrBuff.append((char) tmpch);
}
return deStrBuff.toString();
}
public static void main(String args[]) {
String source = "123456";
String s = DoEncrypt(source);
System.out.println("de=" + s);
source = DoDecrypt(s);
System.out.println("en=" + source);
}
}
定义邮件实体类,包含邮件相关信息
package sendmail;
/**
* Module: MailInfo.java Description: 定义发送邮件的所有字段的javabean Company: Author: ptp
* Date: Mar 1, 2012
*/
public class MailInfo {
private String host;// 邮件服务器域名或IP
private String from;// 发件人
private String to;// 收件人
private String cc;// 抄送人
private String username;// 发件人用户名
private String password;// 发件人密码
private String title;// 邮件的主题
private String content;// 邮件的内容
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getCc() {
return cc;
}
public void setCc(String cc) {
this.cc = cc;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
定义邮件授权类
package sendmail;
/**
*Module: MailInfo.java
*Description: 邮件授权类
*Company:
*Author: ptp
*Date: Mar 6, 2012
*/
import javax.mail.PasswordAuthentication;
public class MyAuthenticator extends javax.mail.Authenticator {
private String strUser;
private String strPwd;
public MyAuthenticator(String user, String password) {
this.strUser = user;
this.strPwd = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(strUser, strPwd);
}
}
发送邮件类
package sendmail;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
/**
* Module: SendMail.java
* Description: 发送邮件
* Company:
* Author: ptp
* Date: Mar 1, 2012
*/
public class SendMail {
// 配置文件xml的路径
private final static String XML_PATH = "src" + File.separator + "sendmail"
+ File.separator + "SendMail.xml";
//xml文件中字段对应的javabean对象
private static MailInfo mailInfo = new MailInfo();
/**
* <p>Title: readXML</p>
* <p>Description:读取xml文件,把文件内容以字符串形式输出</p>
* @param xmlPath 配置文件的路径
* @return
* @throws Exception
*/
private String readXML(String xmlPath) throws Exception {
String fileContent = "";
File file = new File(xmlPath);
if (file.isFile() && file.exists()) {
try {
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), "UTF-8");
BufferedReader reader = new BufferedReader(read);
String line;
try {
while ((line = reader.readLine()) != null) {
fileContent += line;
}
reader.close();
read.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}else{
throw new Exception("config目录下的配置文件SendMail.xml不存在,请检查");
}
return fileContent;
}
/**
* <p>Title: parseXML</p>
* <p>Description:发送邮件给指定的收件人和抄送人,同时进行一些简单的校验判断,如必填项的字段、type的值</p>
* @param xml 配置文件的内容
* @param type 邮件类型
*/
private void parseXML(String xml, String type) {
type=type.toLowerCase();//忽略type字段的大小写
try {
// 解析XML,获得doc对象
Document doc = DocumentHelper.parseText(xml);
// 判断type的值是否正确,type的值应是报文二级节点中的一个
String flag = doc.getRootElement().element(type) + "";
if (null == flag || flag.equals("null"))
throw new DocumentException(
"传入的type值不对,type的值应是SendMail.xml报文中二级节点的一个,请查看文件然后重新传入type的值");
// 设置主机名称
Element hostEle = (Element) doc.selectSingleNode("/mail/" + type
+ "/host");
if (null == hostEle || "".equals(hostEle.getTextTrim())) {
throw new DocumentException("邮件服务器域名或IP不能为空,请检查配置文件SendMail.xml");
}
mailInfo.setHost(hostEle == null ? "" : hostEle.getTextTrim());
// 设置发件人
Element fromEle = (Element) doc.selectSingleNode("/mail/" + type
+ "/from");
if (null == fromEle || "".equals(fromEle.getTextTrim())) {
throw new DocumentException("发件人地址不能为空,请检查配置文件SendMail.xml");
}
mailInfo.setFrom(fromEle == null ? "" : fromEle.getTextTrim());
// 设置邮件主题
Element titleEle = (Element) doc.selectSingleNode("/mail/" + type
+ "/title");
mailInfo.setTitle(titleEle == null ? "" : titleEle.getTextTrim());
// 设置收件人,对多个收件人的处理放在后面
Element toEle = (Element) doc.selectSingleNode("/mail/" + type
+ "/to");
if (null == toEle || "".equals(toEle.getTextTrim())) {
throw new DocumentException("收件人地址不能为空,请检查配置文件SendMail.xml");
}
mailInfo.setTo(toEle == null ? "" : toEle.getTextTrim());
// 设置抄送,对多个抄送人的处理放在后面
Element ccEle = (Element) doc.selectSingleNode("/mail/" + type
+ "/cc");
mailInfo.setCc(ccEle == null ? "" : ccEle.getTextTrim());
//设置发件人用户名
Element nameEle = (Element) doc.selectSingleNode("/mail/" + type
+ "/username");
if(null==nameEle||"".equals(nameEle.getTextTrim())){
throw new DocumentException("发件人用户名不能为空,请检查配置文件SendMail.xml");
}
mailInfo.setUsername(nameEle == null ? "" : nameEle.getTextTrim());
//设置发件人密码
Element passEle = (Element) doc.selectSingleNode("/mail/" + type
+ "/password");
if(null==passEle||"".equals(passEle.getTextTrim())){
throw new DocumentException("发件人密码不能为空,请检查配置文件SendMail.xml");
}
mailInfo.setPassword(passEle == null ? "" : passEle.getTextTrim());
} catch (DocumentException e) {
e.printStackTrace();
}
}
/**
* <p>Title: sendMailOfValidate</p>
* <p>Description:发送邮件的方法,Authenticator类验证</p>
*/
private void sendMailOfValidate() {
Properties props = System.getProperties();
props.put("mail.smtp.host", mailInfo.getHost());//设置邮件服务器的域名或IP
props.put("mail.smtp.auth", "true");//授权邮件,mail.smtp.auth必须设置为true
String password=mailInfo.getPassword();//密码
try {
password=EnCrypt.DoDecrypt(password);//如果密码经过加密用此方法对密码进行解密
} catch (NumberFormatException e1) {
//如果密码未经过加密,则对密码不做任何处理
}
//传入发件人的用户名和密码,构造MyAuthenticator对象
MyAuthenticator myauth = new MyAuthenticator(mailInfo.getUsername(),password);
//传入props、myauth对象,构造邮件授权的session对象
Session session = Session.getDefaultInstance(props, myauth);
//将Session对象作为MimeMessage构造方法的参数传入构造message对象
MimeMessage message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress(mailInfo.getFrom()));//发件人
// 对多个收件人的情况进行处理,配置文件SendMail.xml中每个收件人之间必须用逗号隔开的
if (mailInfo.getTo() != null && !"".equals(mailInfo.getTo())) {
String to[] = mailInfo.getTo().split(",");
for (int i = 0; i < to.length; i++) {
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to[i]));// 收件人
}
}
// 对多个抄送人的情况进行处理,每个抄送人之间用逗号隔开的
if (mailInfo.getCc() != null && !"".equals(mailInfo.getCc())) {
String cc[] = mailInfo.getCc().split(",");
for (int j = 0; j < cc.length; j++) {
message.addRecipient(Message.RecipientType.CC,
new InternetAddress(cc[j]));// 抄送
}
}
message.setSubject(mailInfo.getTitle());// 主题
message.setText(mailInfo.getContent());// 内容
Transport.send(message);// 调用发送邮件的方法
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* <p>Title: sendMail</p>
* <p>Description:外部程序调用的入口</p>
* @param type 邮件的类型,目前有三种,即logmessage、checkmessage、ordermessage,type只能传这三个值中一个,传其他的任何值都不行
* @param content 邮件的内容
* @throws Exception
*/
public void sendMail(String type,String content) throws Exception{
if (null == type || "".equals(type) || null == content
|| "".equals(content)) {
throw new Exception("方法的入参type和content字段的值都不能为空或null");
}
String xml=readXML(XML_PATH);//获得xml字符串
parseXML(xml,type);//解析xml字符串,把对应字段的值放入到mailInfo对象中
mailInfo.setContent(content);//设置发送的内容
sendMailOfValidate();//发送邮件
System.out.println("邮件发送成功!");
}
/**
* 为了方便直接用main方法测试
* @param args
* @throws Exception
*/
public static void main(String args[]) throws Exception {
SendMail mail = new SendMail();
// type类型,根据此字段去配置文件SendMail.xml中匹配,然后发到相应的邮箱
String type = "logmessage";
// 邮件的内容,实际开发中这个内容是前台传到后台
String content = "你好,欢饮使用JavaMail包开发邮件功能";
// 在其他类中调用时只能看到sendMail方法,为了保护内部细节,其它的方法都声明为私有的
mail.sendMail(type, content);
}
}
最后就是SendMail.xml配置文件
<?xml version="1.0" encoding="UTF-8"?><!-- 此处编码格式必须用UTF-8格式,这样和程序中的解码是统一的,不会出现乱码 -->
<mail>
<logmessage><!--报文的二级节点,为了使传入的type值对大小写不限制,故此处必须用小写 -->
<host>smtp.qq.com</host><!-- 邮件服务器域名或IP,必填项 -->
<from>9¥¥¥¥10@qq.com</from><!-- 发件人 ,必填项 -->
<to>523####0@qq.com</to><!-- 收件人,多个收件人之间用英文状态下的逗号隔开,必填项 -->
<cc>435####@qq.com</cc><!-- 抄送,多个抄送人之间用英文状态下的逗号隔开-->
<title>Send JavaMail</title><!-- 邮件主题-->
<username>#####0@qq.com</username><!-- 发件人邮箱的用户名,即email的全地址,必填项 -->
<password>#####</password><!-- 发件人邮箱的密码,像QQ邮箱如果设置了独立密码应输入独立密码,必填项,为了安全起见填写密码之前最好用Encrypt类的DoEncrypt方法加密 -->
</logmessage>
<checkmessage>
<host></host>
<from></from>
<to></to>
<cc></cc>
<title></title>
<username></username>
<password></password>
</checkmessage>
<ordermessage>
<host></host>
<from></from>
<to></to>
<cc></cc>
<title></title>
<username></username>
<password></password>
</ordermessage>
</mail>
试试吧。。。