发送邮件失败提示validity check failed 处理

前几天发现发送邮件服务失效了,通过查看日志发现异常提示为Exception reading response 。 在本地开始调试排查原因。之前发送代码如下:

public static void sendEmail(Map<String, Object> map) {

		/**
		 * 参数配置--装信封写地址
		 */
		Properties prop = new Properties();// 配置参数类
		prop.setProperty("mail.transport.protocol", "smtp");// 参数一:使用电子邮件协议smtp
		prop.setProperty("mail.smtp.host", EmailSMTPHost); // 参数二:协议所在服务器
		prop.setProperty("mail.smtp.auth", "true");// 参数三:需要请求认证改为true 不然553报错
		/**
		 * 根据配置创建会话对象, 用于和邮件服务器交互---检查地址是否能对打个电话问问
		 */
		final String smtpPort = "465";
		prop.setProperty("mail.smtp.port", smtpPort);
		prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		prop.setProperty("mail.smtp.socketFactory.fallback", "false");
		prop.setProperty("mail.smtp.socketFactory.port", smtpPort);
		Session session = null;
		Transport transport = null;
		try {
			session = Session.getDefaultInstance(prop);// 将参数与会话结合
			// session.setDebug(true);// 这个是开启debug 方便查看
			/**
			 * 邮件封装
			 */
			MimeMessage message = createMimeMessage(session, EmailAccount, map);
			/**
			 * 邮递员
			 */
			transport = session.getTransport();
			transport.connect(EmailAccount, EmailPassword);// 敲门开门
			transport.sendMessage(message, message.getAllRecipients());// 送到对方手里
			System.err.println("发送完毕");
		} catch (NoSuchProviderException e) {
			logger.error(e.getMessage());
		} catch (MessagingException e) {
			logger.error(e.getMessage());
		} catch (Exception e) {
			logger.error(e.getMessage());
		} finally {
			if (transport != null) {
				try {
					transport.close();
				} catch (MessagingException e) {
					logger.error(e.getMessage());
				}
			}
		}
	}

由于之前一直没问题,问题肯定出现在邮件服务器,但是通过telnet 发送邮件测试是没有问题,所以问题出现在java 代码中通过设置session.setDebug(true); 打印详细的日志信息。如下:

DEBUG: setDebug: JavaMail version 1.4ea
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host “smtp.cailian.net”, port 465, isSSL false
DEBUG SMTP: exception reading response: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed
15:30:00.252 [main] ERROR com.vtax.utils.MailSend - Exception reading response

通过异常提示我们知道了有效检查性失败 是因为请求证书过期,为啥我们之前么有 是因为stmp 没有开启ssl,所以只有账户密码对就可以发送邮件。现在开启后更严格1要不你有对应证书2、就是信任所有证书。我们https 请求时候也有类似问题。通过查阅资料我使用的mail jar 是1.4 不加jar 前提需要升级,目前是使用jar 1.4.5 他实现了MailSSLSocketFactory通过设置该类的属性trustAllHosts 同时开启mail.smtp.ssl.enable = true 即可。完善后代码如下:

	public static void sendEmail(Map<String, Object> map) {
		/**
		 * 参数配置--装信封写地址
		 */
		Properties prop = new Properties();// 配置参数类
		prop.setProperty("mail.transport.protocol", "smtp");// 参数一:使用电子邮件协议smtp
		prop.setProperty("mail.smtp.host", EmailSMTPHost); // 参数二:协议所在服务器
		prop.setProperty("mail.smtp.auth", "true");// 参数三:需要请求认证改为true 不然553报错
		/**
		 * 根据配置创建会话对象, 用于和邮件服务器交互---检查地址是否能对打个电话问问
		 */
		final String smtpPort = "465";
		MailSSLSocketFactory sf = null;
		      try {
		            sf = new MailSSLSocketFactory();
		            sf.setTrustAllHosts(true);
		      } catch (GeneralSecurityException e1) {
		            e1.printStackTrace();
		      }
		prop.setProperty("mail.smtp.port", smtpPort);
		prop.setProperty("mail.smtp.ssl.enable", "true");
		prop.put("mail.smtp.ssl.socketFactory", sf);
		prop.setProperty("mail.smtp.socketFactory.port", smtpPort);
		
		Session session = null;
		Transport transport = null;
		try {
			session = Session.getDefaultInstance(prop);// 将参数与会话结合
			session.setDebug(true);// 这个是开启debug 方便查看
			/**
			 * 邮件封装
			 */
			MimeMessage message = createMimeMessage(session, EmailAccount, map);
			/**
			 * 邮递员
			 */
			transport = session.getTransport();
			transport.connect(EmailSMTPHost,EmailAccount, EmailPassword);// 敲门开门
			transport.sendMessage(message, message.getAllRecipients());// 送到对方手里
			System.err.println("发送完毕");
		} catch (NoSuchProviderException e) {
			logger.error(e.getMessage(),e);
		} catch (MessagingException e) {
			logger.error(e.getMessage());
		} catch (Exception e) {
			logger.error(e.getMessage());
		} finally {
			if (transport != null) {
				try {
					transport.close();
				} catch (MessagingException e) {
					logger.error(e.getMessage());
				}
			}
		}
	}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛乌龟一起走

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值