使用Javamail发送邮件例子 eclipse

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> 

试试吧。。。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值