邮件发送案例
狂神的案例
在做邮件传送案例之前首先要理清楚两个协议就是smtp和pop3协议,smtp是负责发送的,pop3是负责接收的。smtp通常负责把邮件发送到对方的服务器,或者是把邮件先寄存到自己的服务器上面。而pop就是我们用户想要获取邮件的时候就通过访问pop3来获取邮件。
而我们通过java代码也可以实现邮件发送,原本我们是需要通过qq邮箱来发送邮件,但是我们可以开启smtp和pop3服务来做到使用第三方来发送邮件。
第一个案例(只发送文字)
这里的一个流程就是
1.设置服务器和协议
2.为qq邮箱加密
3.创建session对象配置好应用所需要的环境
4.获取传送对象,并且获取连接
5.编写邮件对象
6.发送邮件
7.关闭连接
下面给出狂神老师在讲解的时候的简图(这里是java代码的简图):
代码(EmailTest)
public class EmailTest {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties prop=new Properties();
prop.setProperty("mail.host","smtp.qq.com");///设置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);
//获取Seesion,并且定义应用所需要的环境session
Session session=Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 验证码和要送往的地址
return new PasswordAuthentication("xxxx@qq.com","验证码");
}
});
// 测试session debug
session.setDebug(true);
//获取session里面的transport对象
Transport transport = session.getTransport();
// 连接服务器
transport.connect("smtp.qq.com","xxxx@qq.com","验证码");
// 创建邮件对象
MimeMessage message=new MimeMessage(session);
// 发送人,也就是发送的位置
message.setFrom(new InternetAddress("xxxx@qq.com"));
// 设置接收人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxx@qq.com"));
//邮箱标题
message.setSubject("我的标题");
// 设置邮箱的内容
message.setContent("我是一个好人","text/html;charset=UTF-8");
//发送邮箱到我们设置的接收者上面去
transport.sendMessage(message,message.getAllRecipients());
transport.close();
}
}
第二个案例(图片文字和附件)
这里解释一下MimeMessage就是一个最大的容器,MimeMutiPart是一个小容器,而MimeBodyPart是最小的容器来装载图片,附件,还有文字。这些小body最后都是加入到mutipart的,最后才交给message来管理
代码(第二个案例)
public class EmailTest2 {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties prop=new Properties();
prop.setProperty("mail.host","smtp.qq.com");///设置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);
//获取Seesion,并且定义应用所需要的环境session
Session session=Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 验证码和要送往的地址
return new PasswordAuthentication("1xxxx@qq.com","xx验证码");
}
});
// 测试session debug
session.setDebug(true);
//获取session里面的transport对象
Transport transport = session.getTransport();
// 连接服务器,连接我们qq邮箱的服务器
transport.connect("smtp.qq.com","xxx@qq.com","fxx验证码");
// 创建邮件对象,需要知道在哪个服务器
MimeMessage message=new MimeMessage(session);
// 发送人,也就是发送的位置
message.setFrom(new InternetAddress("xxx@qq.com"));
// 设置接收人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxx@qq.com"));
// 标题
message.setSubject("你是好人");
// 设置图片
MimeBodyPart img=new MimeBodyPart();
DataHandler imgHandler=new DataHandler(new FileDataSource("C:\\xxxxs\\xxx\\Desktop\\小图标\\1.jpg"));
img.setDataHandler(imgHandler);
img.setContentID("1.jpg");
// 设置普通内容
MimeBodyPart text=new MimeBodyPart();
text.setContent("<h1>这是一张漂亮的图片</h1><img src='cid:1.jpg'>","text/html;charset=utf-8");
// 附件自身就是占据一个body
MimeBodyPart accessory=new MimeBodyPart();
accessory.setDataHandler(new DataHandler("C:\\Uxxx\\xxxx\\Desktop\\小图标\\3.png","text/html;charset=utf-8"));
accessory.setFileName("3.png");
//把这些内容放进大框框里面
MimeMultipart all=new MimeMultipart();
all.addBodyPart(img);
all.addBodyPart(text);
all.addBodyPart(accessory);
all.setSubType("mixed");
message.setContent(all);
message.saveChanges();
//发送邮箱到我们设置的接收者上面去
transport.sendMessage(message,message.getAllRecipients());
transport.close();
}
}
第三个案例就是注册邮件发送。
在这里我们可以把发送邮件的这个过程直接单独拿出来当做一个工具类。至于为什么要使用线程,其实是为了提高用户的体验感,我们连接服务器的过程是非常长的,所以我们提前跳转,然后程序在另一个线程里面继续连接和传送。这样就增强了程序流畅度。
说说流程吧
1.首先需要创建一个表单注册
2.创建一个工具类继承Thread,然后重写run来加上传输邮件的任务
3.写一个pojo类
4.写一个servlet,获取所有参数,然后开启工具类线程,然后再主线程这里请求转发,不需要等待工具类线程传输和连接
代码(regist.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/registServlet" method="post" >
用户名:<input type="text" name="username">
密码 :<input type="text" name="pwd">
邮箱 :<input type="text" name="email">
<input type="submit" value="注册">
</form>
</body>
</html>
代码(pojo,也就是User接收参数)
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 + '\'' +
'}';
}
}
代码(servlet)
@WebServlet("/registServlet")
public class RegistServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("pwd");
String email = request.getParameter("email");
User user=new User(username,password,email);
SendUtils utils=new SendUtils(user);
utils.start();
request.getRequestDispatcher("/test.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
代码(工具类)
//使用线程来提高服务质量
public class SendUtils extends Thread{
// 在哪个地方发送
private String from="xxxx8@qq.com";
// 服务器地址
private String host="smtp.qq.com";
// pojo
private User user;
public SendUtils(User user){
this.user=user;
}
@Override
public void run() {
try{
Properties prop=new Properties();
//设置QQ邮件服务器
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);
//获取Seesion,并且定义应用所需要的环境session
Session session=Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 验证码和要送往的地址
return new PasswordAuthentication("1xxx@qq.com","fzxxx验证码");
}
});
// 测试session debug
session.setDebug(true);
//获取session里面的transport对象
Transport transport = session.getTransport();
// 连接服务器,连接我们qq邮箱的服务器
transport.connect("smtp.qq.com","xxx@qq.com","xx验证码");
// 创建邮件对象,需要知道在哪个服务器
MimeMessage message=new MimeMessage(session);
// 发送人,也就是发送的位置
message.setFrom(new InternetAddress("xxx@qq.com"));
// 设置接收人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxx@qq.com"));
// 标题
message.setSubject("你是好人");
// 设置内容
message.setContent("恭喜你"+user.getUsername()+"注册成功"+",你的密码是:"+user.getPassword(),"text/html;charset=utf-8");
message.saveChanges();
//发送邮箱到我们设置的接收者上面去
transport.sendMessage(message,message.getAllRecipients());
transport.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}