JavaMail发送简单邮件

时间:2022-03-30 18:09:06

一、环境搭建 导包

1、下载JavaMail API包

http://www.oracle.com/technetwork/java/javamail/index-138643.html

解压后里面有个mail.jar包

下载JavaBeans Activation FrameworkJavaBeans激活框架)

解压后有个activation.jar(JDK6.0以后官方API自带)

注意:

 JDK6.0 以后开发 只需要导入 mail.jar  ----- rt.jar这个包里提供javax.activation 开发包
 JDK5.0(包括) 之前开发,需要导入mail.jar 和 activation.jar 

在开发中可能会报java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream 异常

这主要是因为MyEclipse 中javaee.jar 自带的javamai API 与 JavaMail 引入jar包发生冲突
解决 :删除javaee.jar里面的mail目录和activation目录

找到javaee.jar包后,用WinRAR打开,在里面找到mail目录和activation目录 点删除即可


二、核心类

1、javax.mail.Session类

这个类代表与邮件服务器的会话连接,要想获得这个类的实例,是不能直接new出来的,要通过这个类的静态方法

Session.getInstance(Propertiesprops);参数Properties props的作用主要是传入一些配置信息

2、javax.mail.Message类

这个类代表电子邮件,提供了一些读取和设置邮件内容的方法。如:地址信息、标题、发送和接收日期、邮件正文

这个类实际上是个抽象类,通常用的是其子类javax.mail.internet.MimeMessage  这个类代表正文符合MIME协议的电子邮件

3、javax.mail.Transport类  

这个类的主要作用就是发送邮件,这是一个抽象类,它有两种方式发送邮件

一种是,直接调用静态方法Transport.send(message);

另外一种是,由Session获取特定的Transport实例,然后传递用户名和密码(不是必要的,但如果Session的mail.smtp.auth设为true时则一定要),发送,最后关闭

通常都是用第二种方法发送

4、javax.mail.Store类

这个类的主要作用是收取邮件


三、发送邮件的步骤

1、创建邮件会话Session

2、创建MimeMessage对象,编写邮件内容

3、利用Transport发送邮件


四、发送一封简单的邮件

//1、创建与邮件服务器的会话连接  session对象
//创建Properties对象,设置配置信息,别错包,要引java.util.Properties
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com");//smtp服务器的主机名
props.put("mail.transport.protocal", "smtp");//设置发送协议
props.put("mail.smtp.auth", "true");//连接认证,设为true后,在transport发送之前一定要传用户名和密码
props.put("mail.debug", "true");//在控制台显示生成的邮件内容
//获得Session实例
Session session = Session.getInstance(props);

//2、生成邮件内容
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("JavaMailTest1615@163.com"));//发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("receiver1646@yeah.net"));//收件人
message.setSubject("JavaMail 测试");//主题
message.setText("这是一封装简单邮件");//正文

//3、发送
Transport transport = session.getTransport("smtp");
transport.connect("JavaMailTest1615", "123456");
transport.sendMessage(message,message.getAllRecipients());
transport.close();//关闭
说明:

1、关于会话连接配置信息的设置,javamail提供了很多属性供设置,如在上面的小例子中设置了

mail.smtp.host,mail.transport.protocal,mail.smtp.auth等属性

一般情况下,只需设置mail.smtp.host属性即可   通常邮件smtp服务器主机名都是以smtp开头而不是www

2、在利用Properties对象设置属性值时,属性无论是什么类型的,都要加双引号,如:对于mail.debug属性来说,虽然其值是

boolean类型的,也要在true加双引号

3、我们在发送邮件时走的是smtp协议,它的过程是这样的,比如我有一个163的邮箱,我要发一封邮件给别人(对方可以是任意类型的邮箱账户),那么我是先连接我邮箱账号对应的smtp服务器smtp.163.com,然后再由服务器根据目的地转发给对应的邮箱,邮箱服务器之间的发送走的也是smtp协议,由此可以看到,我要发邮件给别人,不是我自己直接发过去的,是我账号对应的smtp服务器帮我转发的,所以我们在编写邮件发送程序的时候,mail.smtp.host属性要设置为我账号所在的smtp服务器的主机名或ip地址

4、Message的setRecipient()、addRecipient()方法中第一个参数是Message.RecipientType类型(消息接收类型)

RecipientType是Message的一个内部类,在这个内部类里定义了以下几个常量,分别是:TO ,CC ,BCC

5、在设置邮件正文时,如果正文只是简单的纯文本可以直接用setText()方法即可,但如果是复杂内容就要用setContent()方法



五、因为用JavaMail发送邮件时,创建Session对象和发送这两个步骤都是不变的,所以可以提取出来,写进一个工具类里面

/**
* 这是一个发送邮件的工具类
* @author charlie
*
*/
public class MailUtil {
/**
* 创建会话
* @param hostName smtp服务器主机名
*/
public static Session createSession(String hostName){
Properties props = new Properties();
props.put("mail.transport.protocal", "smtp");
props.put("mail.smtp.host", hostName);
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props);
return session;
}

/**
* 发送邮件
* @param user 发送方邮箱账号
* @param password 发送方邮箱密码
*/
public static void sendMail(Session session,Message message,String user,String password)
throws Exception{
Transport transport = session.getTransport("smtp");
transport.connect(user, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}

}