在Javaweb中实现发送简单邮件_javaweb发送post请求
前言
当我们在一个网站中进行注册账户成功后,通常会收到一封来自该网站的邮件。邮件中显示我们刚刚申请的账户和密码以及一些其他的广告信息。在上一篇中用Java实现了发送qq邮件的功能,今天我们来实现一个这样的功能,用户注册成功后,网站将用户的注册信息(账号和密码等)以Email的形式发送到用户的注册邮箱当中。
a、电子邮件协议
电子邮件在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。
b、JavaMail
我们平时通过 Java 代码打开一个 http 网页链接时,通常可以使用已经对 http 协议封装好的 HttpURLConnection 类来快速地实现。Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,需要我们自己去官方下载。
1、准备工作
需要两个jar包 activation.jar / mail.jar
所要用到的授权码:qq邮件登录 -> 设置 -> 账户
其中
SMTP是接收协议
POP3是接收协议
2、 编写实体类
public class User {
private String name;
private String password;
private String email;
public User(String name, String password, String email) {
this.name = name;
this.password = password;
this.email = email;
}
//省略get/set和toString方法...
}
3、编写静态页面
index.jsp:一个简单的表单 包含用户名、密码、邮箱
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
4、编写发送邮件的工具类
发送邮件的步骤
- 1.创建定义整个应用程序所需的环境信息的sessio对象
- 2.通过session得到transport对象
- 3.使用邮箱的用户名和授权码连上邮件服务器
- 4.创建邮件
- 5.发送邮件
这里用到了多线程,因为发送邮件是需要时间去连接邮箱的服务器,若不使用多线程,则会卡在提交的网页中不断加载直至响应 使用多线程可以异步处理,提高用户的体验度
public class SendMail extends Thread {
private String from = "发件人邮箱";
private String username = "发件人用户名";
private String password = "授权码";
private String host = "smtp.qq.com"; //QQ邮箱的主机协议
private User user;
public SendMail(User user) {
this.user = user;
}
public void run() {
Transport ts = null;
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);
//使用JavaMail发送邮件的5个步骤
//1.创建定义整个应用程序所需的环境信息的sessio对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username,password);
}
});
session.setDebug(true);//开启debug模式 看到发送的运行状态
//2.通过session得到transport对象
ts = session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect(host,username,password);
//4.创建纯文本的简单邮件
MimeMessage message = new MimeMessage(session);
message.setSubject("只包含文本的普通邮件");//邮件主题
message.setFrom(new InternetAddress(from));// 发件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));//收件人
String info = "注册成功!你的账号信息为: username = " + user.getName() + "password = " + user.getPassword();
message.setContent("" + info + "
","text/html;charset=UTF-8");//邮件内容
message.saveChanges();//保存设置
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
} catch (GeneralSecurityException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} finally {
//关闭连接
try {
ts.close();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
}
5、编写处理请求的Servlet以及注册Servlet
public class MailServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前端数据
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
//封装成一个User对象
User user = new User(username,password,email);
SendMail send = new SendMail(user);
send.start();//启动线程
req.setAttribute("message","已发送 请等待");
req.getRequestDispatcher("info.jsp").forward(req,resp);//发送成功跳转到提示页面
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
mail
com.xiaoyao.servlet.MailServlet
mail
/mail.do
测试ok!
补充:
工作中我用的是JavaMail 1.6.2的版本遇到过以下这个问题
这个问题就是没有使用授权码引起的,需要去发件人邮箱设置开启授权码;
1、怎么获取授权码?
先进入设置,帐户页面找到入口,按照以下流程操作。
(1)点击“开启”
(2)验证密保
(3)获取授权码
总结:项目中可能会遇到的问题
1、使用JavaMail发送邮件时发现,将邮件发送到sina或者sohu的邮箱时,不一定能够马上收取得到邮件,总是有延迟,有时甚至会延迟很长的时间,甚至会被当成垃圾邮件来处理掉,或者干脆就拒绝接收,有时候为了看到邮件发送成功的效果
2、在执行到 message.saveChanges(); 方法报错无法进行保存设置,也有可能时你的mail版本较低造成的。
在书写 File file = new File(); 时注意修改正确的路径,也可以写在form表单里用file进行传值,主题和内容也写在了方法里因人而异如果其他需求可以需改参数进行传值。
3、在执行到 File file = new File(“D:\Chat_Software\sky.JPG”);时出现错误,之前写的是xlsx文件,测试期间可以对.xls,jpg,文本,.doc文件进行发送。发送xlsx文件时出现报错。 问题解决方案: .xls文件扩展名对应的是Microsoft Office EXCEL 2003及以前的版本。 .xlsx文件扩展名对应的是Microsoft Office EXCEL 2007及后期的版本。 有可能时你下载的mai不是1.6以上版本的,建议下载1.6以上版本的mail