`

利用JavaMail发送邮件示例

阅读更多

    最近闲来无事,为了巩固一下知识点,写了一个利用JavaMail发送邮件的例子。只写了一个发送的例子,以后有时间再写下接收的例子。

1、简单介绍一下JavaMail的发送步骤

  • 根据邮件会话属性和密码验证器构造一个发送邮件的session会话
  • 通过session会话获得一个发送对象(Transport)
  • 利用Transport对象获得与邮件服务器的连接
  • 创建一个邮件Message的对象
  • 利用Transport将邮件Message的对象发送

2、发送示例

首先,大家看下我的主程序。

package com.bao.main;

import com.bao.entities.MailEntity;
import com.bao.sendmail.SendMailHandler;

public class Main {

	public static void main(String[] args) {
		MailEntity mailEntity = new MailEntity();
		mailEntity.setSubject("设置邮件主题");     //主题
		mailEntity.setToMails("XXXXXX@163.com"); //接收人邮件地址
		mailEntity.setFrom("XXXXXX@163.com");    //发送人邮件地址
		mailEntity.setContent("设置邮件内容");     //内容
		//带附件的
//		mailEntity.setContainAttach(true);       //是否含有附件(true:有 false:无)
//		String[] aa = {"F:\\aaa.txt"};			 //附件的路径(F:\\aaa.txt)
//		mailEntity.setArchives(aa);              //将数组传入到实体的属性中
		//不带附件
		mailEntity.setContainAttach(false); 
		SendMailHandler sendMailHandler = new SendMailHandler(); //发送邮件的方法类
		sendMailHandler.sendMail(mailEntity);	 //发送
	}

}

 

 

     从主程序可以看出,存在一个邮件实体MailEntity,还有一个邮件发送的方法类SendMailHandler 。发送的步骤就是创建一个邮件实体MailEntity,然后将其作为参数,利用SendMailHandler中的sendMail方法进行发送。

     那好,下一步我们来看下实体MailEntity。

package com.bao.entities;

/**
 * 发送邮件的Mail实体
 */
public class MailEntity {

	private String mesId;   //邮件id,预留字段
	private String toMails; //收件人
	private String copyMails; //抄送人
	private String from;      //发送人
	private String content;   //内容
	private String[] archives; //上传附件路径
	private String subject; //主题
	private boolean containAttach; //是否带有附件
	
	public String getMesId() {
		return mesId;
	}

	public void setMesId(String mesId) {
		this.mesId = mesId;
	}

	public String getCopyMails() {
		return copyMails;
	}

	public void setCopyMails(String copyMails) {
		this.copyMails = copyMails;
	}

	public String getFrom() {
		return from;
	}

	public void setFrom(String from) {
		this.from = from;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String[] getArchives() {
		return archives;
	}

	public void setArchives(String[] archives) {
		this.archives = archives;
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public boolean isContainAttach() {
		return containAttach;
	}

	public void setContainAttach(boolean containAttach) {
		this.containAttach = containAttach;
	}

	public String getToMails() {
		return toMails;
	}

	public void setToMails(String toMails) {
		this.toMails = toMails;
	}
}

 

  只是一个实体bean,不做过多赘述。

 然后看一下SendMailHandler方法类。

package com.bao.sendmail;

import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import com.bao.entities.MailEntity;
import com.bao.util.MailUtil;
import com.bao.util.UserAuthentication;


/**
 * 发送邮件的实现类
 */
public class SendMailHandler {

    private static Properties properties = System.getProperties();
    Session sendMailSession = null;  
    UserAuthentication authenticator = null;  
    Transport trans = null; 
    
    private void connect() throws Exception {
    	//读取配置文件
    	URL url = MailUtil.findAsResource("mail.properties");
    	Properties props = new Properties();
    	InputStream ins;
        ins = url.openStream();
        props.load(ins);
        //给properties赋值
        properties.put("mail.smtp.host", props.getProperty("MAIL_SMTP_HOST"));    
        properties.put("mail.smtp.port", props.getProperty("MAIL_SMTP_PORT"));    
        properties.put("mail.smtp.auth", props.getProperty("MAIL_SMTP_AUTH")); 
        if ("true".equals(props.getProperty("MAIL_SMTP_AUTH"))) {     //是否需要进行安全验证
        	authenticator = new UserAuthentication(props.getProperty("MAIL_USER"),props.getProperty("MAIL_PWD"));   
        }    
        //根据邮件会话属性和密码验证器构造一个发送邮件的session会话    
        sendMailSession = Session.getDefaultInstance(properties,authenticator); 
        //根据session会话,获得发送连接
        trans = sendMailSession.getTransport("smtp");
        trans.connect(props.getProperty("MAIL_SMTP_HOST"),props.getProperty("MAIL_USER"),props.getProperty("MAIL_PWD"));
        System.out.println("<<<<===============连接成功===============>>>>");
    }
    
	/**
	 * 发送邮件类
	 * @param 邮件实体
	 */
    public boolean sendMail(MailEntity mail) {
    	boolean flag = true;
    	try {
    		this.connect();  //连接邮件服务器操作
	    	Message mailMessage = null;
	    	if(!mail.isContainAttach()) {
	    		mailMessage = getNormalMail(mail);
	    	} else {
	    		mailMessage = getArchivesMail(mail);
	    	}
			trans.send(mailMessage);
			System.out.println("<<<<===============发送成功===============>>>>");
		} catch (Exception e) {
			flag = false;
			System.out.println("<<<<===============发送失败===============>>>>");
			e.printStackTrace();
		} finally {
			try {
				trans.close();
			} catch (MessagingException e) {
				e.printStackTrace();
			}
		}
		return flag;
    }

	/**
	 * 生成简单邮件消息
	 * @param 邮件实体
	 */
    private Message getNormalMail(MailEntity mail) throws Exception {
	    //根据session创建一个邮件消息 
		Message mailMessage = new MimeMessage(sendMailSession); 
	    //设置邮件消息的发送者 
	    mailMessage.setFrom(new InternetAddress(mail.getFrom())); 
	    //设置邮件的接收者地址
	    mailMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(mail.getToMails())); 
	    //设置邮件的主题 
	    mailMessage.setSubject(mail.getSubject());
	    //设置邮件发送的时间 
	    mailMessage.setSentDate(new Date()); 
	    //设置邮件的内容 
	    mailMessage.setText(mail.getContent()); 
	    return mailMessage;
	}
	
	/**
	 * 生成带附件的邮件消息
	 * @param 邮件实体
	 */
    private Message getArchivesMail(MailEntity mail) throws Exception {
		Message mailMessage = new MimeMessage(sendMailSession); 
    	//设置邮件消息的发送者 
	    mailMessage.setFrom(new InternetAddress(mail.getFrom())); 
	    //设置邮件的接收者地址
	    mailMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(mail.getToMails())); 
	    //设置邮件的主题 
	    mailMessage.setSubject(mail.getSubject());
	    //设置邮件信息生成时间
		mailMessage.setSentDate(new Date()); 
		Multipart contentPart = new MimeMultipart();
        //设置邮件内容
		mailMessage.setContent(contentPart);
        //1 邮件文本内容
        MimeBodyPart textPart = new MimeBodyPart();
        textPart.setContent(mail.getContent(),"text/html; charset=GBK");
		contentPart.addBodyPart(textPart);//将文本部分,添加到邮件内容
        //2 附件
        if(mail.getArchives() != null){
            for(int i=0; i<mail.getArchives().length; i++){
                MimeBodyPart archivePart = new MimeBodyPart();
                //选择出每一个附件文件名
                String filename = mail.getArchives()[i];
                //得到数据源
                FileDataSource fds = new FileDataSource(filename);
                //得到附件本身并至入BodyPart
                archivePart.setDataHandler(new DataHandler(fds));
                //得到文件名同样至入BodyPart
                archivePart.setFileName(fds.getName());
                // 将附件添加到附件集
                contentPart.addBodyPart(archivePart);
            }
        }
		return mailMessage;
	}
}

 

 

     本类中有三个私有方法,和一个公共方法。对外部调用只提供了一个sendMail的方法。其余三个都是私有的方法。第一个connect方法的作用是根据javamail的Api进行与邮件服务器建立连接的过程。从而获得可以发送邮件的对象Transport 。第二和第三个私有方法是通过传入的邮件实体,构建Message的过程。一个是普通的邮件,一个带有附件的邮件。至于对外提供的公有方法sendMail,不做详细解释。

     其中值得一提的是在连接方法中用到了俩个类,一个是使用授权者类,一个是MailUtil类。前者是JavaMail提供的类,后者是本文应用到一个邮件配置的文件,该类主要是读取邮件配置的工具方法。之所以将邮件配置写成一个properties文件,用意就是可以随时对邮件进行配置修改,不用重启程序。因为在每次连接的时候会自动读取一次properties文件。

下面将俩个应用类和配置文件提供给大家。

MailUtil类:

package com.bao.util;

import java.net.URL;

public class MailUtil{
	
   /**
    * 获取文件完整路径的方法
    * @param path 文件名称
    * @return URL 文件完整路径
    */
   public static URL findAsResource(String path) {
        URL url = null;
        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
        if (contextClassLoader != null) {
            url = contextClassLoader.getResource(path);
        }
        if (url != null)
            return url;
        url = MailUtil.class.getClassLoader().getResource(path);
        if (url != null)
            return url;
        url = ClassLoader.getSystemClassLoader().getResource(path);
        return url;
    }
}
 

 

使用授权者类(UserAuthentication):

package com.bao.util;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * 邮件用户安全验证的类
 * @author Administrator
 */
public class UserAuthentication extends Authenticator {
	private String userName;
	private String password;
	
	public UserAuthentication(String userName, String password) {
		this.userName = userName;
		this.password = password;
	}

	public PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(userName, password);
	}
}

 mail.properties:

MAIL_SMTP_HOST=smtp.163.com
MAIL_SMTP_PORT=25
MAIL_SMTP_AUTH=true
MAIL_USER=
MAIL_PWD=

 

配置文件说明:前两个参数是主机和端口,第三个参数是是否进行授权验证,一般163,sohu邮箱都需要进行授权验证,否则连接不成功。第四个和第五个是发送人的用户名和密码。

3、说明

  • mail.jar与j2ee中的mail有冲突,需要用rar打开X:/Program Files/MyEclipse 6.0/myeclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_6.0.1.zmyeclipse601200710/data/libraryset/EE_5/javaee.jar
    ,然后删除mail,在重新导入mail.jar就可以了。
  • 在mail.properties文件中的第四项和第五项配置自己的邮件用户名和密码。并将文件放入到src下。

ps:附件为完整项目,和一份JavaMail的说明文档。

7
5
分享到:
评论
3 楼 让爱远航 2012-09-12  
宋建勇 写道
nice!!!不过,我要显示图片要怎么做呢

发送html格式的邮件,或许还要将图片当作附件上传!有空可以研究一下
2 楼 alice2012 2012-09-12  
相当不错哦~~~太给力了
1 楼 宋建勇 2012-09-12  
nice!!!不过,我要显示图片要怎么做呢

相关推荐

    使用JavaMail发邮件示例录屏

    需要网讯的webex打开,讲解利用JavaMail发送邮件的开发过程。

    利用javamail api实现的邮件发送类

    利用JavaMail API来发送Email的工具类 支持单发,群发及无限制数量的附件功能,并同时支持简单邮件和HTML两种格式的邮件内容 支持抄送,密送功能 具体使用参见其mail方法的使用示例

    jsp网络编程从基础到实践

    《JSP网络编程从基础到实践》光盘说明 光盘的实例代码目录中包含了前10章的所有实例的源代码,实例名称及其所处... 实例67 发送文本格式的邮件 实例68 发送 HTML邮件 实例69 发送带有附件的邮件 实例70 接收EMAIL

    JSP网络编程从基础到实践 实例代码

    《JSP网络编程从基础到实践》光盘说明 光盘的实例代码目录中包含了前10章的所有实例的源代码,实例名称及其所处... 实例67 发送文本格式的邮件 实例68 发送 HTML邮件 实例69 发送带有附件的邮件 实例70 接收EMAIL

    JSP网络编程从基础到实践的实例代码

    JSP网络编程从基础到实践的实例代码 《JSP网络编程从基础到实践》光盘说明 光盘的实例代码目录中包含了前10章的所有实例的源代码,实例名称及其所处章节如下: ... 实例69 发送带有附件的邮件 实例70 接收EMAIL

    JSP网络编程从基础到实践

    实例63 用servlet获取表单数据 实例64 用servlet读写文件数据 实例65 用servlet访问数据库 实例66 一个简单的struts应用实例——用户登录 JSP中的JavaMail开发 实例67 发送文本格式的邮件 ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    7.2.3 使用JavaMail发送邮件 277 7.2.4 使用JavaMail接收邮件 281 7.3 应用服务器的JavaMail支持 287 7.3.1 在WebLogic中配置JavaMail 288 7.3.2 通过WebLogic的邮件支持来 发送邮件 290 7.3.3 在JBoss中配置...

    Spring 2.0 开发参考手册

    19.3. 发送一条消息 19.3.1. 使用消息转换器 19.3.2. SessionCallback 和ProducerCallback 19.4. 接收消息 19.4.1. 同步接收 19.4.2. 异步接收 - 消息驱动的POJOs 19.4.3. SessionAwareMessageListener 接口 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口 ...

    spring chm文档

    8.3.5. 示例 8.3.6. 运行集成测试 8.4. 更多资源 II. 中间层数据访问 9. 事务管理 9.1. 简介 9.2. 动机 9.3. 关键抽象 9.4. 使用资源同步的事务 9.4.1. 高层次方案 9.4.2. 低层次方案 9.4.3. ...

Global site tag (gtag.js) - Google Analytics