我们这里是使用qq邮箱来演示邮件的发送,需要先对qq邮箱先进行一些设置。在设置-账户我需要开启这个pop3协议,他会生成一个授权码。
常用的邮件传输协议有2种:POP3/SMTP、IMAP/SMTP。
POP和IMAP的区别:在邮箱客户端的操作,比如移动邮件、标记已读,如果使用POP,是不会同步到邮箱服务器上的;如果使用IMAP,这些操作会同步到邮箱服务器上。
发送使用SMTP协议,接受使用POP3协议。
这是我们还需要准备 activation-1.1.1 , mail-1.4.7 我们需要准备这连个jar包。
简单邮件发送
1.定义整个应用程序所需要的环境信息(Session对象的)
2.创建session对象
3.通过session对象获取transport对象
4.使用邮件用户连接邮箱服务器
5.创建邮箱
6.发送邮箱、关闭连接
创建一个普通的java项目,把上面那两个jar导入。
创建一个普通的java项目,写好main方法
我们需要执行第一步 定义整个应用程序所需要的环境信息。这些都是固定不变。
Properties properties = new Properties();properties.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议properties.setProperty("mail.smtp.auth","true");//需要验证用户名
由于qq浏览器的独特我们需要给他添加上SSL认证。
//qq邮箱,还要设置SSL加密,加上一下代码即可,大厂MailSSLSocketFactory sf= new MailSSLSocketFactory();sf.setTrustAllHosts(true);properties.put("mail.smtp.ssl.enable","true");properties.put("mail.smtp.ssl.scoketFactory", sf);
第二步 创建session对象
普通的邮箱 Session session = Session.getDefaultInstance(properties);这样写就可以了,而qq邮箱需要一些信息认证
Session session = Session.getDefaultInstance(properties, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("发件人邮箱", "授权码");}});
第三步 通过session获取transport对象 改对象是获取连接邮箱服务器的。
Transport transport = session.getTransport();
第四步 连接邮箱服务器
transport.connect("smtp.qq.com","发件人邮箱","授权码");
第五步 写邮件
写邮件就是把这里面的信息补全。
收件人、主题、内容这是必须要写的。
我们这些新都会存在MimeMsessage对象里面。
//这里需要进行传入sessionMimeMessage mimeMessage = new MimeMessage(session);//指明发送邮件人mimeMessage.setFrom(new InternetAddress("发件人的邮箱"));//指明邮件收件人 收件人可以填写多个mimeMessage.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("收件人邮箱"));//邮件主题mimeMessage.setSubject("javamail");//邮件内容mimeMessage.setContent("<h1 style='color : red' >你好</h1>","text/html;charset=utf-8");
第六步 发送邮件、关闭连接
transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
transport.close();
复杂邮箱发送
什么是复杂的邮箱呢?言外之意就是给这个邮件添加上图片和附件。
我们仍样遵循上面简单邮箱的步骤走,他们两个不同的地方在写邮件的时候不同,我们需要通过这张图来进行分析他们的分布位置。
我们可以看到纯文本(正常的文本)超文本(图片),这里的内嵌资源其实就是说的是把文本和超文本合并在一起看成文本,然后在和附件进行合并。
MimeBodyPart MimeMultipart 在写代码之前我们需要先了解这两个类,
MimeBodyPart他是MimeMultipart的子类,MimeBodyPart里面是写文本和超文本的 类型为alternative或related,MimeMultipart相当于一个大的容器他里面可以添加多个MimeBodyPart对象。
public static void main(String[] args) throws Exception {Properties properties = new Properties();properties.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议properties.setProperty("mail.smtp.auth","true");//需要验证用户名//qq邮箱,还要设置SSL加密,加上一下代码即可,大厂MailSSLSocketFactory sf= new MailSSLSocketFactory();sf.setTrustAllHosts(true);properties.put("mail.smtp.ssl.enable","true");properties.put("mail.smtp.ssl.scoketFactory", sf);//javaMail 五个步骤//1.创建定义整个应用程序所需的环境信息Session对象//只有qq邮箱有用Session session = Session.getDefaultInstance(properties, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("发件人邮箱", "授权码");}});// 开启Session的debug模式,这样可以查看Emil发送的状态session.setDebug(true);//2.通过Session得到transport对象Transport transport = session.getTransport();//3.使用邮箱用户连接邮箱服务器transport.connect("smtp.qq.com","发件人邮箱","授权码");//写邮件 我们把他单独写成了一个方法 这里需要注意的给他传参数MimeMessage mimeMessage=getMimeMessage(session);//5.发送邮件transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());//6.关闭transport.close();}private static MimeMessage getMimeMessage(Session session) throws Exception {//这些是写邮件的固定部分//这里需要进行传入sessionMimeMessage mimeMessage = new MimeMessage(session);//指明发送邮件人mimeMessage.setFrom(new InternetAddress("发件人邮箱"));//指明邮件收件人mimeMessage.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("收件人邮箱"));//邮件主题mimeMessage.setSubject("javamail");// 邮件的内容 正文 图片 附件 MimeBodyPart//正文 MimeBodyPart mimeBodyPart1 = new MimeBodyPart();mimeBodyPart1.setContent("背景图片<img src='cid:bj.jpg'>","text/html;charset=utf-8");//图片MimeBodyPart mimeBodyPart2 = new MimeBodyPart();//DataHandler进行数据处理mimeBodyPart2.setDataHandler(new DataHandler(new FileDataSource("D:\\java\\fileupload\\mailtest\\src\\5c78f3f44f03241b.jpg")));mimeBodyPart2.setContentID("bj.jpg");//设置ID//附件 同样我们的附件可以添加多个 就是多new MimeBodyPart()MimeBodyPart mimeBodyPart3 = new MimeBodyPart();mimeBodyPart3.setDataHandler(new DataHandler(new FileDataSource("D:\\java\\fileupload\\mailtest\\lid\\c3p0-0.9.5.5.jar")));mimeBodyPart3.setFileName("c3p0.jar");//这里设置的是FileName//拼接邮件内容 文本和图片 形成内嵌资源MimeMultipart mimeMultipart1 = new MimeMultipart();mimeMultipart1.addBodyPart(mimeBodyPart1);mimeMultipart1.addBodyPart(mimeBodyPart2);mimeMultipart1.setSubType("related");//文本和图片的嵌入//将拼接好的内容设置成正文内容MimeBodyPart mimeBodyPartImgeText = new MimeBodyPart();mimeBodyPartImgeText.setContent(mimeMultipart1);// 正文与附件进行拼接MimeMultipart mimeMultipart2 = new MimeMultipart();mimeMultipart2.addBodyPart(mimeBodyPartImgeText);mimeMultipart2.addBodyPart(mimeBodyPart3);mimeMultipart2.setSubType("mixed");//正文和附件 设置类型为mixed//放到message中mimeMessage.setContent(mimeMultipart2);mimeMessage.saveChanges();//保存修改return mimeMessage;}
补充说明一下 开启Session的debug模式,这样可以查看Emil发送的状态 session.setDebug(true);
网站注册
首先是我们创建以web项目,把所用到的jar进行导入,因为我们需要走tomcat所以我们需要在tomcat下lib目录添加mail-1.1.47 ,activation-1.1.1两个jar。 同时我们还需要在java下创建三个包pojo存放实体类、servlet存放servlet、utils存放工具类
现在我们开始写jsp,先写一个表单,我们要写完整他的type name……
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body><form action="${pageContext.request.contextPath}/Register.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>
然后写一个servlet来接收,在写之前我们应该先把用到的实体类写出来,就是User类在pojo包中 ,我们给这类添加了Serializable接口,让他可序列化。
package aw.pojo;import java.io.Serializable;public class User implements Serializable {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;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +'}';}
}
现在开始写servlet
@WebServlet(name = "RegisterServlet",urlPatterns = {"/Register.do"})
public class RegisterServlet 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 {//接收参数request.setCharacterEncoding("utf-8");String username = request.getParameter("username");String password = request.getParameter("password");String email = request.getParameter("email");//传给实体类User user = new User(username, password, email);//写邮件
我们这里写邮件单独写一个工具类在utils下,我们这里是使用类线程,这样是为了避免网站访问人过多,导致延时等待,其他邮件发送和简单邮箱一样。
package aw.utils;import aw.pojo.User;
import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;public class Sendmail extends Thread{//用户给用发送邮件的邮箱private String from="2331890842@qq.com";//邮件的用户名private String username="2331890842@qq.com";//邮件密码 /授权码private String password="bezsbrqgdqicecff";//接受用户信息private User user;public Sendmail(User user){this.user=user;}//在run中写发送给邮件的制定用户@Overridepublic void run() {try {Properties properties = new Properties();properties.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议properties.setProperty("mail.smtp.auth","true");//需要验证用户名//qq邮箱,还要设置SSL加密,加上一下代码即可,大厂MailSSLSocketFactory sf= null;sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);properties.put("mail.smtp.ssl.enable","true");properties.put("mail.smtp.ssl.scoketFactory", sf);//javaMail 五个步骤//1.创建定义整个应用程序所需的环境信息Session对象//只有qq邮箱有用Session session = Session.getDefaultInstance(properties, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(from, password);}});//开启Session的debug模式,这样可以查看Emil发送的状态session.setDebug(true);//2.通过Session得到transport对象Transport transport = session.getTransport();//3.使用邮箱用户连接邮箱服务器transport.connect("smtp.qq.com",from,password);//4.写邮件//这里需要进行传入sessionMimeMessage mimeMessage = new MimeMessage(session);//指明发送邮件人mimeMessage.setFrom(new InternetAddress(from));//指明邮件收件人 这里的收件人是从网站中获取的mimeMessage.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(user.getEmail()));//邮件主题mimeMessage.setSubject("javamail web ");//邮件内容String info="恭喜注册成功,用户名:"+user.getUsername()+",密码:"+user.getPassword();mimeMessage.setContent(info,"text/html;charset=utf-8");//5.发送邮件transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());//6.关闭transport.close();} catch (Exception e) {e.printStackTrace();}}
}
先在我们在补全servlet
package aw.servlet;import aw.pojo.User;
import aw.utils.Sendmail;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet(name = "RegisterServlet",urlPatterns = {"/Register.do"})
public class RegisterServlet 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 {request.setCharacterEncoding("utf-8");String username = request.getParameter("username");String password = request.getParameter("password");String email = request.getParameter("email");User user = new User(username, password, email);//这里使用线程来 是因为防止网站访问人数过多Sendmail sendEmail = new Sendmail(user);sendEmail.start();//注册用户request.setAttribute("message","邮件以发送,请耐心等待");request.getRequestDispatcher("info.jsp").forward(request,response);
// response.sendRedirect("info.jsp");}
}
完结撒花 有不懂的评论留言。