一.原理
1.首先介绍一下邮件传输协议的概念:(以下图片来自百度百科)
1.POP3协议:
2.SMTP协议:
简单来说,POP3协议是用来存储用户发来的邮件,而SMTP协议则用于用户发送邮件之间的传输。
邮件发送的原理如下图:
A用户要给B用户发一封邮件,收件人是B,地址为…@163.com,A点击发送后,邮件会首先上传至QQ服务器,然后通过SMTP协议发送至网易服务器,并提醒B用户取信,B用户登录自己的邮箱账户后,网易服务器便会通过POP3协议将邮件发送给B,完成邮件传输。
二.实现步骤
1.创建一个maven项目
2.需要导入commons-fileupload包,pom文件配置如下
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
3.编写前端页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/MailDemo01" method="post">
请输入你要发送的邮箱地址:<input type="email" name="email">
<input type="submit">
</form>
</body>
</html>
效果如下:
4.编写servlet
这里方便起见,将功能实现写在了servlet里,可以编写实体类进行servlet的请求转发来完成,当然也可以使用原生java类来编写,但需要导入上面所述的jar包就可以实现。
我的目录配置如下:
别忘了配置相应的web.xml
<servlet>
<servlet-name>MailDemo01</servlet-name>
<servlet-class>com.zovz.mail.MailDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MailDemo01</servlet-name>
<url-pattern>/MailDemo01</url-pattern>
</servlet-mapping>
源码如下:
package com.zovz.mail;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Properties;
public class MailDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String from = "xxx@qq.com";//发件人邮箱
final String username = "xxx@qq.com";//发件人的用户名
final String password = "xxxxxxx";//发件人的授权码
String host = "smtp.qq.com";//服务器
String receiveUser = req.getParameter("email");//设置收件人的邮箱地址,从前端页面传送回来的email
try {
System.out.println("进入了方法");
Properties prop = new Properties();
prop.setProperty("mail.host", host);//设置QQ邮件服务器
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);
//使用javamail发送邮件的五个步骤
//1.创建session
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//发件人的用户名,授权码
return new PasswordAuthentication(username, password);
}
});
//查看程序发送Email的状态
session.setDebug(true);
//2.通过session得到Transport对象
Transport transport = session.getTransport();
//3.连接
transport.connect(host, username, password);
//4.创建邮件
MimeMessage message = new MimeMessage(session);
//设置邮件的发件人
message.setFrom(new InternetAddress(from));
//设置邮件的收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiveUser));
//邮件标题
message.setSubject("hello");
//邮件的内容
message.setContent("<h1>你好</h1>", "text/html;charset=UTF-8");
//5.发送邮件
transport.sendMessage(message, message.getAllRecipients());
//关闭
transport.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
邮箱的授权码在邮箱的设置里,以QQ邮箱为例,在设置–>用户里面,开启服务,就能获取到对应的授权码。
以上的代码只能负责纯文本的传输,如果想要加上图片,word文档等附件,需要加上格外的代码,如下。
将文件放在src目录下:
源码如下:
//邮件标题
message.setSubject("hello");
//-->图片
//准备图片数据
MimeBodyPart img = new MimeBodyPart();
//图片需要经过处理
DataHandler dataHandler = new DataHandler(new FileDataSource("xxx"));//-->这里放入图片的绝对地址
//在img中放入这个处理过的图片数据
img.setDataHandler(dataHandler);
img.setContentID("1.jpg");//cid
//准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("<h1>你好</h1><img src='cid:1.jpg'>", "text/html;charset=UTF-8");
//-->附件
//准备附件数据
MimeBodyPart word = new MimeBodyPart();
DataHandler dataHandler1 = new DataHandler(new FileDataSource("xxx"));//-->这里放入文件的绝对地址
word.setDataHandler(dataHandler1);
word.setFileName("文件.word");
//文本和图片内嵌成功-->
MimeMultipart allfile = new MimeMultipart();
allfile.addBodyPart(img);
allfile.addBodyPart(text);
allfile.addBodyPart(word);
allfile.setSubType("mixed");//当有邮件有附件时,需要设置为"mixed"
//设置到消息中,保存修改
message.setContent(allfile);
message.saveChanges();
//发送邮件
transport.sendMessage(message, message.getAllRecipients());
//关闭
transport.close();
最后启动tomcat服务器,输入收件人的地址,点击提交就可以看到邮件啦!