`

利用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发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    ### JavaMail发送邮件时遇到的问题及解决方法 在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将...

    JavaMail发送邮件(文本、html、附件)

    下面将详细介绍如何利用JavaMail发送文本、HTML和包含附件的邮件,以及在实际应用中需要注意的配置步骤。 1. **JavaMail的基本概念** - JavaMail API提供了一系列接口和类,允许开发者通过SMTP(Simple Mail ...

    javaMail 发邮件

    这个例子展示了如何使用JavaMail发送带附件的邮件。需要注意的是,实际应用中应处理各种异常,确保邮件发送的健壮性。此外,如果你的邮件服务器需要身份验证,还需要提供一个Authenticator来处理登录信息。 总的来...

    jsp 利用 javamail发送邮件(附带java web项目文件)

    本教程将深入探讨如何在JSP(JavaServer Pages)中利用JavaMail API来实现邮件发送功能,同时提供了一个完整的Java Web项目文件供参考。 首先,要使用JavaMail,你需要在项目中引入必要的依赖。在Maven项目中,可以...

    javamail实现邮箱与邮箱发送邮件

    标签“java发送邮件”意味着此示例主要关注Java语言中发送邮件的功能,而“javamail邮箱发送”则表明我们利用JavaMail库来实现这一功能。这个过程涉及到Java网络编程和邮件协议的理解,如SMTP(简单邮件传输协议)和...

    james和javamail实现邮件收发(带发送附件)

    下面是一个简化的JavaMail发送邮件的过程: 1. **配置邮件会话**:首先,我们需要创建一个`Properties`对象,并设置SMTP服务器的相关参数,如主机名和端口号。然后,通过`Session.getInstance()`方法初始化一个邮件...

    使用javaMail发送邮件

    在IT行业中,发送电子邮件是一项常见的任务,特别是在自动化...通过理解并掌握上述知识点,你将能够熟练地利用JavaMail API创建自己的邮件服务。对于那些需要发送通知、报告或自动通信的项目,这是一项非常实用的技术。

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

    以上就是利用JavaMail API 实现邮件发送类的基本步骤和关键知识点。这个类提供了发送简单邮件和带附件的邮件,以及设置抄送和密送的功能,满足日常开发需求。在实际项目中,可以根据具体需求对这个类进行扩展和定制...

    Android 使用javamail发送邮件

    总的来说,"Android使用javamail发送邮件"这个主题涵盖了Android平台上利用JavaMail API实现邮件发送的基本流程和注意事项,包括设置SMTP服务器、构建邮件消息、处理附件以及可能的安全性和用户体验优化。...

    javamail收发邮件加密和不加密

    JavaMail 是一个强大的开源库,用于在Java应用程序中处理电子邮件。它支持多种协议,包括POP3、IMAP和SMTP,这些协议分别用于接收、检索和发送邮件。...同时,保持JavaMail库更新,以利用最新的安全修复和功能改进。

    javamail发送邮件源代码

    这个压缩包文件可能包含了一个简单的JavaMail发送邮件的示例源代码,我们可以从中学习如何利用JavaMail API实现邮件的发送功能。 首先,要使用JavaMail发送邮件,你需要引入以下依赖库: ```xml &lt;groupId&gt;...

    在spring利用javamail,quartz定时发送邮件

    本文将详细探讨如何在Spring环境中,利用JavaMail和Quartz库实现定时发送邮件的功能。 #### JavaMail简介 JavaMail API是一个允许Java应用程序读取和发送邮件的工具包。它提供了与不同邮件协议(如SMTP、POP3和...

    JavaMail邮件发送源码 非常简单

    首先,我们需要了解JavaMail发送邮件的基本步骤: 1. **配置Properties对象**:创建一个`Properties`对象,并设置SMTP服务器的相关属性,如主机名(mail.smtp.host)和端口号(mail.smtp.port)。如果SMTP服务器...

    android使用javamail发送邮件jar包

    3. **编写邮件发送代码**:下面是一个简单的示例,展示了如何使用JavaMail发送一封纯文本邮件: ```java Properties props = new Properties(); props.put("mail.smtp.host", "smtp.example.com"); props.put(...

    用javaMail发送邮件

    下面是一个简单的JavaMail发送邮件的示例代码: ```java import javax.mail.*; import javax.mail.internet.*; public class SimpleMailSender { public static void main(String[] args) throws Exception { //...

    利用JavaMail实现邮件的收取.doc

    JavaMail 是一个用于处理电子邮件的开源库,它提供了发送和接收邮件的功能。本文将详细讲解如何使用JavaMail API来实现邮件的收取。 首先,我们需要了解一些基本配置。在示例代码中,创建了一个名为 `Config` 的...

    javamail收取邮件(包括附件)

    JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。它支持多种协议,如POP3(Post Office Protocol version 3)和IMAP(Internet Message Access Protocol),这两种协议常用于从邮件服务器...

Global site tag (gtag.js) - Google Analytics