采用了多线程的方式来发送
主要是以qq邮箱为例来写的,当然你需要生成qq的授权码
主要用到两个协议:
smtp:发送
pop3:接受
邮件发送需要依赖两个.jar包,分别是 activation-1.1.1.jar 和 mail-1.4.7.jar 这两个是我用的,当然你也可以去maven上下载
两个jar的网盘链接:https://pan.baidu.com/s/1N6GX1vEYlgh5Wa-w0UUj8g
提取码:6qas
邮件发送实体类
package com.zkw.untils;
//网站的3s原则
//多线程是为了优化用户的体验
import com.zkw.pojo.User;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
public class SendMailThread extends Thread {
private User user;
//设置用于给用户发送邮件的用户名
private String fromMail = "发送者的邮箱@qq.com";
//邮箱的授权码
private String emailPwd = "授权码";
//发送邮件的服务器地址
private String host = "smtp.qq.com";
public SendMailThread(User user) {
this.user = user;
}
@Override
public void run() {
try{
Properties prop = new Properties();
prop.setProperty("mail.host",host);//设置qq邮件服务器
prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码
//关于QQ邮箱,换需要设置SSL加密(QQ邮箱特有的)
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",sf);
//1.创建定义整个应用程序所需要的环境信息的session对象
//qq特有的
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//发件人的用户名和授权码
return new PasswordAuthentication(fromMail,emailPwd);
}
});
//开启session的debug模式,这样可以查看到程序发送的Email的运行状态
session.setDebug(true);
//2.通过session得到transport对象
Transport ts = session.getTransport();
//3.使用邮件的用户名和授权码连接上邮件服务器
ts.connect(host,fromMail,emailPwd);
//4.创建邮件对象
//注意需要传递Session
MimeMessage mimeMessage = imageMail(session,user,fromMail);
//5.发送邮件
ts.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
//6.关闭连接
ts.close();
}catch (Exception e){
e.getMessage();
}
}
public static MimeMessage imageMail(Session session,User user,String fromMail) throws Exception {
//消息的固定信息
MimeMessage mimeMessage = new MimeMessage(session);
//邮件发送人
mimeMessage.setFrom(new InternetAddress(fromMail));
//邮件接收人
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmailName()));
//设置主题
mimeMessage.setSubject("欢迎来到112青训课堂");
/*
编写邮件内容
1.图片
2.附件
3.文本
*/
//图片
MimeBodyPart body1 = new MimeBodyPart();
body1.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\10404\\Desktop\\123.png")));
body1.setContentID("zkw.png");//设置图片的ID
//文本
MimeBodyPart body2 = new MimeBodyPart();
body2.setContent("请注意,我不是广告<img src='cid:zkw.png'/>","text/html;charset=utf-8");
//附件
MimeBodyPart body3 = new MimeBodyPart();
body3.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\10404\\Desktop\\12345.docx")));
body3.setFileName("log4j.docx");//附件设置名字
MimeBodyPart body4 = new MimeBodyPart();
body4.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\10404\\Desktop\\123.txt")));
body4.setFileName("log4j.txt");
//拼接邮件正文内容
MimeMultipart multipart1 = new MimeMultipart();
multipart1.addBodyPart(body1);
multipart1.addBodyPart(body2);
multipart1.setSubType("related");//1.文本和图片内嵌成功
//将拼接好的正文内容设置成主题
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(multipart1);
//拼接附件
MimeMultipart allFile = new MimeMultipart();
allFile.addBodyPart(body3);//附件
allFile.addBodyPart(body4);//附件
allFile.addBodyPart(contentText);//正文
allFile.setSubType("mixed");//正文和附件都存在邮件中,所有类型设置为mixes
//放到Message消息中
mimeMessage.setContent(allFile);
mimeMessage.saveChanges();//保存修改
return mimeMessage;
}
}
Servlet实体类
package com.zkw.servlet;
import com.zkw.pojo.User;
import com.zkw.untils.SendMailThread;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MailServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String emailName = req.getParameter("emailName");
User user = new User();
user.setUsername(username);
user.setEmailName(emailName);
//多线程启动邮件送
new SendMailThread(user).start();
req.setAttribute("massage","亲爱的用户:"+username+"。"+"你在XXX网站上注册的账号为:"+username+",密码为:"+password+",请妥善保管。");
req.getRequestDispatcher("info.jsp").forward(req,resp);
}
}
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>email</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/email.do" method="post">
<p>用 户 名:<input type="text" name="username"></p>
<p>密 码:<input type="password" name="password"></p>
<p>邮  箱:<input type="text" name="emailName"></p>
<p><input type="submit" value="注册"></p>
</form>
</body>
</html>
info.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>XXX网站温馨提示我们已经给你发了一份邮件,因为网络原因你收到的邮件可能会有延迟,请注意查收。</h1>
${massage}
</body>
</html>
User类
package com.zkw.pojo;
public class User {
private String username;
private String password;
private String emailName;
public User() {
}
public User(String username, String password, String emailName) {
this.username = username;
this.password = password;
this.emailName = emailName;
}
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 getEmailName() {
return emailName;
}
public void setEmailName(String emailName) {
this.emailName = emailName;
}
@Override
public String toString() {
return "user{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", emailName='" + emailName + '\'' +
'}';
}
}
整体的运行效果如下
如果你直接拿着这个代码去跑可能会出错,而且还是一个500的错误。
错误如下
原因也很简单,就是tomcat找不到这两个jar,只需要把这两个jar拷贝一份放到tomcat的lib目录就可以了。