1.什么是javamail技术?
javamail通俗易懂就是通过java程序来实现发送邮件的一项技术。
2.邮件是通过什么发出去呢?
邮件都是通过邮件服务器发送出去的,也是通过邮件服务器接受的。邮件服务器按通讯协议可以划分为两种类型:
①smtp服务器(发送邮件服务器)
②pop3服务器(接受邮件服务器)
就比如我们的QQ邮箱的服务器就是分为发送QQ邮件服务器为smtp.qq.com,QQ的接受邮件服务器为pop3.qq.com。那么我们的smtp和pop3协议是分别是什么协议呢?
smtp协议:全称为Simple Mail Transfer Protocol(简单邮件传输协议),它定义了邮件客户端软件与SMTP服务器之间、以及两台SMTP服务器之间的通讯规则。
pop3协议:全称为Post Office Protocol(邮局协议),它定义了邮件客户端软件与POP3服务器的通讯规则。
3.接下来就说明一下javamail的使用实例。这里用的是QQ邮箱进行测试的。程序的流程图如下:
根据以上的流程图我们来具体的学习一下javamail的API:
JavaMail API按其功能划分通常可分为如下三大类:
①创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
②发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。
③ 接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
其中javamail中还有一个很重要的类就是Session
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。那么通过以上的类我们就可以完成一个简单邮件的发送。那么在具体的进行实现时首先我们需要引入javamail的jar包:
截图如下:
要说明的是如果你的jdk的版本在1.6以上那么就只需要mail.jar包即可。
①首先对Session邮件会话对象的属性进行配置,如下图:
配置内容如下图:
这里需要说明的是
mail.smtp.host配置的是qq发送邮件的服务器主机为smtp.qq.com
mail.smtp.port=587是指发送服务器的端口
mail.debug是设置邮件的调试模式
mail.smtp.auth是设置发送服务器需要对邮件进行身份验证
mail.user这个是设置你在qq发送邮件的账号
mail.password这个设置的是在你开启pop3和smtp服务时分配给你的密码而不是你的qq密码,这个需要注意的,具体设置可以自己查询。
那么接下来就根据具体的代码来进行解析具体的java代码实现如下:
package com.yd.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import org.eclipse.jdt.internal.compiler.ast.ThisReference;
//邮件发送类
public class SendMail {
public static void main(String[] args) throws MessagingException, IOException {
//获得类加载器 并且获得资源的读取流
InputStream is=SendMail.class.getClassLoader().getResourceAsStream("mail.properties");
//设置发送邮件服务器的属性
Properties properties=new Properties();
properties.load(is);
//创建一个验证授权对象
Authenticator authenticator=new Authenticator() {
//密码验证的方法
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(properties.getProperty("mail.user"),properties.getProperty("mail.password"));
}
};
//1.首先创建一个发送邮件会话对象 将会话属性和验证对象加入到邮件会话对象当中
Session session=Session.getInstance(properties, authenticator);
//创建一个邮件对象
MimeMessage message=new MimeMessage(session);
//对邮件对象设置参数
//1.标题
message.setSubject("这是我发的邮件");
//2.邮件的发送人
message.setSentDate(new Date());
//设置发送人
message.setFrom(new InternetAddress("xxxxxxxxx@qq.com"));
//接受人
message.setRecipient( RecipientType.TO, new InternetAddress("xxxxxxxxx@qq.com"));
//设置正文部分
message.setText("这是第一封我给你发的邮件");
//最后保存文件
message.saveChanges();
//Transport.send(message);
//创建一个发送对象
Transport transport=session.getTransport("smtp");
//发送对象发送到发送到发送服务器中 连接需要主机名 用户名和密码
//设置smtp协议发送的对象
transport.connect(properties.getProperty("mail.smtp.host"),properties.getProperty("mail.user") ,properties.getProperty("mail.password"));
//发送对象发送邮件
transport.sendMessage(message,message.getAllRecipients());
//关闭发送对象
transport.close();
}
}
4.那么我们如何发送一个有图片和一个有附件的邮件呢?那么就首先要了解一下javamail的mime的组织结构,如下图:
如图可以看出复杂邮件内容可以分为三个级别:
①就是很简单的纯文本和超文本格式的邮件
②就是带有内嵌资源的邮件,比如在邮件中添加连接,图片,多媒体等。
③就是带有附件的邮件
javamail是如何实现的呢?javamail将邮件组织定义成如下图:
其实很简单,每一个邮件简单内容如文本,图片,附件都当作一个MimeBodyPart,而MimeMutipart就是由多个MimeBodyPart组成,相当于是一个大容器。而最外层的MimeMultipart则是邮件Message对象的内容。以下实现了一个带有图片和附件的邮件,具体的java代码实现如下:
package com.yd.util;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
public class SendRelated {
public static void main(String[] args) throws IOException, MessagingException {
//设置邮件的信息
InputStream is=SendRelated.class.getClassLoader().getResourceAsStream("mail.properties");
//获得邮件的属性
Properties properties=new Properties();
properties.load(is);
//创建一个验证邮件用户的对象
Authenticator authenticator=new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(properties.getProperty("mail.user"), properties.getProperty("mail.password"));
}
};
//创建一个邮件会话对象
Session session=Session.getInstance(properties, authenticator);
//创建一个邮件对象
MimeMessage message=new MimeMessage(session);
//创建邮件附件的内容块
MimeMultipart mixed=new MimeMultipart("mixed");
//创建一个内容块放正文部分
MimeBodyPart c=new MimeBodyPart();
mixed.addBodyPart(c);
//MimeBodyPart attch=new MimeBodyPart();
//创建附件
MimeBodyPart attch1=new MimeBodyPart();
//mimeBodyPart.setDataHandler(arg0);
//创建附件模块
String attch1path=SendRelated.class.getClassLoader().getResource("usermanage.sql").getPath();
DataSource ds1=new FileDataSource(new File(attch1path));
DataHandler dh1=new DataHandler(ds1);
attch1.setDataHandler(dh1);
attch1.setFileName("usermanage.sql");
//创建附件二
MimeBodyPart attch2=new MimeBodyPart();
String attch1path2=SendRelated.class.getClassLoader().getResource("usermanage.sql").getPath();
DataSource ds2=new FileDataSource(new File(attch1path2));
DataHandler dh2=new DataHandler(ds2);
attch2.setDataHandler(dh2);
attch2.setFileName("b.sql");
//将附件加入
mixed.addBodyPart(attch1);
mixed.addBodyPart(attch2);
//创建邮件的复杂内容块 此内容块为正文部分
Multipart multipart=new MimeMultipart("related"); //创建一个带有内嵌资源和文本的复杂内容块
c.setContent(multipart);
//设置复杂块内容 文本内容
MimeBodyPart content=new MimeBodyPart();
content.setContent("<img src='cid:8.png'/><img src='cid:9.png'/>这是我的爱你的人嗯啊","text/html;charset=utf-8");
String path=SendRelated.class.getClassLoader().getResource("8.png").getPath();
MimeBodyPart image=new MimeBodyPart();
DataSource dataSource=new FileDataSource(path);
DataHandler dataHandler=new DataHandler(dataSource);
image.setDataHandler(dataHandler);
//给内嵌资源设置id号 在正文的超文本中就可以直接通过cid:id来使用
image.setContentID("8.png");
String path2=SendMail.class.getClassLoader().getResource("9.png").getPath();
MimeBodyPart image2=new MimeBodyPart();
DataSource dataSource2=new FileDataSource(path2);
DataHandler dataHandler2=new DataHandler(dataSource2);
image2.setDataHandler(dataHandler2);
image2.setContentID("9.png");
//multipart.addBodyPart(content);
multipart.addBodyPart(content);
multipart.addBodyPart(image);
multipart.addBodyPart(image2);
//邮件设置标题
message.setSubject("本的邮件");
message.setFrom(new InternetAddress(properties.getProperty("mail.user")));
//设置收件人
message.setRecipient(RecipientType.TO, new InternetAddress("xxxxxx@qq.com"));
//邮件对象设置内容
message.setContent(mixed);
//设置smtp协议发送的对象
Transport transport=session.getTransport("smtp");
transport.connect(properties.getProperty("mail.smtp.host"),properties.getProperty("mail.user") ,properties.getProperty("mail.password"));
transport.sendMessage(message,message.getAllRecipients());
transport.close();
}
}