常见的邮件协议包括 :
SMTP : 简单邮件传输协议,用于发送电子邮件的传输协议
POP3 : 用于接收电子邮件的标准协议
IMAP : 互联网消息访问协议,是 POP3 的替代协议
这三种协议都有对应 SSL 加密传输的协议,分别是 SMTPS、 POP3S 和 IMAPS
电子邮件是依靠邮箱服务器来完成的:
SMTP服务器地址:一般是 smtp.xxx.com,例如:qq邮箱是smtp.qq.com。
电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱功能;
邮件收发原理
1.发送方通过smtp协议连接到Smtp服务器,将邮件发送到服务器中,并保存到邮箱空间;
2.发送方的邮箱与接受方的邮箱建立连接,然后将邮件发送到接收方的邮箱;
3.接收方的邮箱将邮件接收并保存到邮箱空间,通知接收方有邮件;
4.接收方通过Pop3协议连接到Pop3服务器收取邮件;
5.接收方从邮箱空间下载邮件;
Java发送邮件
使用Java应用程序发送 E-mail 十分简单,首先就是在电脑上安装 JavaMail API 和Java Activation Framework (JAF) 。
可以从 Java 网站下载最新版本的 JavaMail,打开网页右侧有个 Downloads 链接,点击它下载。
可以从 Java 网站下载最新版本的 JAF(版本 1.1.1)。
也可以使用以下链接:
JavaMail mail.jar 1.4.5
https://www.oracle.com/technetwork/java/javamail/index-138643.html
JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。
传送纯文本文件(本文使用的是QQ邮箱传送)
先在Java中导入包;
QQ邮箱中获取对应的权限
QQ邮箱需要安全验证,我们需要获取他对应的权限;
QQ邮箱–>邮箱设置–>账户
将第一条的服务开启(开启服务会生成16位的授权码)
测试编写代码
编写步骤:
创建包含邮件服务器的网络连接信息的Session对象。
创建代表邮件内容的Message对象
连接服务器 transport 通过session对象获取transport,需要捕获抛出异常
连接服务器,需要抛出异常
连接成功,需要编写邮件
创建邮件对象
邮件发送人
邮件接收人
邮件主题
邮件内容
发送邮件
关闭连接
纯文本邮件
package com.kscng.mail;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class SendMail {
public static void main(String[] args) throws MessagingException {
Properties prop = new Properties();
//设置QQ邮件服务器
prop.setProperty("mail.host","smtp.qq.com");
//设置发送的协议
prop.setProperty("mail.transport.protocol","smtp");
//需要验证用户名密码
prop.setProperty("mail.stmp.auth","true");
//1.创建一个session对象,定义整个应用程序所需的环境
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("QQ邮箱", "16位授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.获取连接对象,通过session对象获得transport,需要捕获或抛出异常
Transport tp = session.getTransport();
//3.连接服务器,需要抛出异常
tp.connect("smtp.qq.com","QQ邮箱");
//4.连接上之后我们需要发送邮件
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("QQ邮箱"));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
message.setRecipient(Message.RecipientType.TO, new InternetAddress("QQ邮箱"));
//邮件的标题
message.setSubject("小蜜蜜");
//邮件的文本内容
message.setContent("哈速度发货单是否合适丢发送到", "text/html;charset=UTF-8");
//5、发送邮件
tp.sendMessage(message, message.getAllRecipients());
tp.close();
}
}
JavaWeb发送邮件
现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。现在也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。
第一步:创建Tomcat,并导入jar包;
第二步:编写用户实体类;
package com.kscng.pojo;
public class User {
private String username;
private String password;
private String email;
public User() {
}
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
}
第三步:编写前端注册页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/rt.do" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
邮箱:<input type="text" name="email"><br/>
<input type="submit" value="注册">
</form>
</body>
</html>
第四步:邮件发送工具类
package com.kscng.utils;
import com.kscng.pojo.User;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class SendMail extends Thread{
//发件人邮箱
private String emailFrom = "QQ邮箱";
//发件人信息
private String FromUserInfo = "QQ邮箱";
//邮箱密码
private String password = "16位授权码";
//发送邮件的服务器地址
private String host = "smtp.qq.com";
private User user;
public SendMail(User user){
this.user = user;
}
//重写run方法的实现,在run方法中发送邮件给指定的用户
@Override
public void run() {
try{
Properties prop = new Properties();
prop.setProperty("mail.host", host);
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
//1、创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名、授权码
return new PasswordAuthentication("QQ邮箱", "16授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect(host, FromUserInfo, password);
//4、创建邮件
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(emailFrom)); //发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail())); //收件人
message.setSubject("用户注册邮件"); //邮件的标题
String info = "恭喜您注册成功,用户名:" + user.getUsername() + ",密码:" + user.getPassword() + ",请妥善保管,有问题请保留";
message.setContent(info, "text/html;charset=UTF-8");
message.saveChanges();
//发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}catch (Exception e) {
throw new RuntimeException(e);
}
}
}
第五步:编写对应的servlet处理类
package com.kscng.servlet;
import com.kscng.pojo.User;
import com.kscng.utils.SendMail;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlettest1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
try {
//接收用户请求,封装成对象
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
User user = new User(username, password, email);
//用户注册成功之后,给用户发送一封邮件
//我们使用线程来专门发送邮件,防止出现耗时,和网站注册人数过多的情况;
SendMail send = new SendMail(user);
//启动线程,线程启动之后就会执行run方法来发送邮件
send.start();
request.setAttribute("message", "注册成功,我们已经发了一封带了注册信息的电子邮件,请查收!如网络不稳定,可能过会儿才能收到!!");
request.getRequestDispatcher("info.jsp").forward(request, response);//转发
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("message", "注册失败!!");
request.getRequestDispatcher("info.jsp").forward(request, response);
}
}
}
第六步:配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>Servlettest1</servlet-name>
<servlet-class>com.kscng.servlet.Servlettest1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlettest1</servlet-name>
<url-pattern>/rt.do</url-pattern>
</servlet-mapping>
</web-app>
第七步:配置提示信息
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/7/20
Time: 15:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>消息提示</title>
</head>
<body>
${message}
</body>
</html>
```
第七步:配置提示信息
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/7/20
Time: 15:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>消息提示</title>
</head>
<body>
${message}
</body>
</html>
然后测试