java 阿里云邮箱发送邮件并判断验证码是否过期
一. 发送邮件
链接: java给各个邮箱发邮件,不包括阿里邮箱发送邮件 https://www.cnblogs.com/java-h/p/11344331.html
参考链接:阿里云邮箱发送邮件 https://www.cnblogs.com/lccsdncnblogs/p/15793357.html
总体流程:首先需要一个企业邮箱,及这个邮箱的密码。相当于发送者。由这个邮箱可以给任意邮箱发送邮件。
如使用QQ邮箱当作发送者,则还需要设置鉴权码。具体百度
pom.xml 引入 mail 发送邮件的依赖 jdk使用1.8.0.121 tomcat使用8.5.59
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
注意:更换电脑后,jdk使用1.8.0333,tomcat使用8.5.82
相同的代码以及pom,会报No appropriate protocol (protocol is disabled or cipher suites are inappropriate)这个错误。查了网上很多方法,去掉TLSv1,TLSv1.1配置之类的,更换发送方法等都会报错。
解决办法:经由大神指导,降低了pom中mail的版本,把1.4.7的版本降为了1.4。就可以正常发送邮件了。
代码实现:
package com.systron.utils; import org.apache.commons.lang.StringUtils; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import java.security.Security; import java.util.Properties; /** * 使用阿里云邮箱发送邮件工具类 * 阿里云邮箱为联想企业邮箱 */ public class SendMailUtil { public static final String ALIDM_SMTP_HOST = "smtp.qiye.aliyun.com"; public static final String ALIDM_SMTP_PORT = "25"; /** * 发送邮件 * @param sendAddress 发件人地址 * @param sendPassword 发件人密码 * @param host 协议 * @param port 端口 * @param subject 标题 * @param content 内容 * @param filePath 附件地址 * @param CC 抄送人 * @throws Exception * @throws AddressException */ public static void sendMail(String sendAddress, String sendPassword, String host, String port, String subject, String content, String internetAddress, String filePath, String CC) throws AddressException, Exception { //设置SSL连接、邮件环境 Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; Properties props = System.getProperties(); props.setProperty("mail.smtp.host", host); props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.port", port);//设置端口 props.setProperty("mail.debug", "true");//启用调试 props.setProperty("mail.smtp.socketFactory.port", "465"); props.setProperty("mail.smtp.auth", "true"); //建立邮件会话 Session session = Session.getDefaultInstance(props, new Authenticator() { //身份认证 protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(sendAddress, sendPassword);//发件人账号、密码 } }); //建立邮件对象 MimeMessage message = new MimeMessage(session); //设置邮件的发件人、收件人、主题 //附带发件人名字 // message.setFrom(new InternetAddress("from_mail@qq.com", "optional-personal")); message.setFrom(new InternetAddress(sendAddress));//发件人账号 message.setRecipients(Message.RecipientType.TO, internetAddress);//收件人账号 //标题 message.setSubject(subject);//邮件标题 //内容 Multipart multipart = new MimeMultipart(); BodyPart contentPart = new MimeBodyPart(); contentPart.setContent(content, "text/html;charset=utf-8");//邮件内容 multipart.addBodyPart(contentPart); //附件部分 if (StringUtils.isNotEmpty(filePath)) { BodyPart attachPart = new MimeBodyPart(); FileDataSource fileDataSource = new FileDataSource(filePath);//附件地址 attachPart.setDataHandler(new DataHandler(fileDataSource)); attachPart.setFileName(MimeUtility.encodeText(fileDataSource.getName())); multipart.addBodyPart(attachPart); } message.setContent(multipart); //抄送地址 if (StringUtils.isNotBlank(CC)) { InternetAddress[] internetAddressCC = new InternetAddress().parse(CC); message.setRecipients(Message.RecipientType.CC, internetAddressCC); } //发送邮件 Transport.send(message); } // 测试 public static void main(String[] args) { // CacheConfigUtil.getProperty("ali.email.name"); // CacheConfigUtil.getProperty("ali.email.password"); try { sendMail("发送者邮箱", "发送者邮箱密码", ALIDM_SMTP_HOST, ALIDM_SMTP_PORT, "邮件标题", "邮件内容", "接收者邮箱", null, null); } catch (Exception e) { e.printStackTrace(); } } }
二. 判断邮件中验证码是否过期
步骤一:给接收人发送邮件,邮件中包含6位验证码。将验证码存入缓存,10分钟过期
步骤二:判断用户输入的验证码和缓存中的验证码是否一致,一致则验证通过,不一致则提示验证码过期
import org.apache.commons.lang.StringUtils; import org.springframework.ui.Model; import org.systron.utils.SendMailUtil; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.Timer; import java.util.TimerTask; public class Test { /** * 步骤一:给接收人发送邮件,邮件中包含6位验证码。将验证码存入缓存,10分钟过期 * @param request * @param response * @param model */ public void sendCode(HttpServletRequest request, HttpServletResponse response, Model model) { String userEmail = "XXX@qq.com"; // 接收人邮箱 String random = "123456"; // 6位验证码 String title = "邮件标题"; String content = "邮件内容"; try { SendMailUtil.sendMail(title, content, userEmail, null, null); try { final HttpSession httpSession = request.getSession(); httpSession.setAttribute(userEmail, random); // 将接收人邮箱和验证码存入缓存 final Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { httpSession.removeAttribute(userEmail); timer.cancel(); } }, 10 * 60 * 1000); // 10分钟后过期 10 * 60 * 1000 } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } } /** * 步骤二:判断用户输入的验证码和缓存中的验证码是否一致,一致则验证通过,不一致则提示验证码过期 * @param request * @param response * @param model */ public void validateCodeApi(HttpServletRequest request, HttpServletResponse response, Model model) { String userEmail = request.getParameter("userEmail"); String validateCode = request.getParameter("validateCode"); String code = (String) request.getSession().getAttribute(userEmail); // 根据用户邮箱取得session中的验证码 if (StringUtils.isNotEmpty(code)) { if (!code.equals(validateCode)) { // 验证用户输入的验证码和缓存中的验证码是否一致 // 不一致,返回验证码过期信息 System.out.println("验证码已过期"); } } else { System.out.println("验证码已过期"); } } }