Java mail使用QQ邮箱发送邮件配置方案
Java mail使用QQ邮箱发送邮件配置方案
Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 530 Error: A secure connection is requiered(such as ssl).
如果要正确发送邮件,需要确定几件事情:
正确的邮件服务配置
我使用的是零配置的方式:
@Autowired JavaMailSenderImpl javaMailSender; public void sendMail(String code) { MimeMessage mailMessage = javaMailSender.createMimeMessage(); try { MimeMessageHelper helper = new MimeMessageHelper(mailMessage, true, "utf-8"); helper.setFrom("邮箱名@foxmail.com");// 设置发件人 helper.setTo("收件人@163.com");// 设置收件人 // helper.setCc(cc);// 设置抄送 helper.setSubject("验证码");// 设置主题 helper.setText("验证码:【"+code+"】");// 邮件体 javaMailSender.send(mailMessage);// 发送邮件 log.info("邮件发送成功..."); } catch (Exception e) { log.error("邮件发送发生异常:" + e.getMessage(), e); try { Thread.sleep(1000 * 1000); this.sendMail(code); } catch (InterruptedException e1) { log.error("重发邮件发生异常:" + e1.getMessage(), e1); } } }
这里面最重要的是端口【mail.smtp.port】和协议【mail.transport.protocol】,一定不能写错。
配置一个邮件发送类,然后再配置一个任务线程池,每次发送邮件的时候,将发送任务放到任务线程池中,提高性能,减少发送邮件过程对性能的影响。
/** * 邮件发送类 * @return */ @Bean(name="javaMailSender") public JavaMailSender javaMailSender(){ JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); javaMailSender.setDefaultEncoding(emailEncoding); javaMailSender.setHost(emailHost); javaMailSender.setPort(emailPort); javaMailSender.setUsername(emailUsername); javaMailSender.setPassword(emailPassword); Properties pp = new Properties(); pp.setProperty("email.smtp.auth", "true"); pp.setProperty("email.smtp.timeout", "50000"); javaMailSender.setJavaMailProperties(pp); return javaMailSender; } /** * 任务线程池 * @return */ @Bean(name="taskExecutor") public ThreadPoolTaskExecutor taskExecutor(){ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(theadPoolMinSize); taskExecutor.setMaxPoolSize(theadPoolMaxSize); taskExecutor.setQueueCapacity(theadPoolQueueSize); taskExecutor.initialize(); return taskExecutor; }
@Autowired private JavaMailSender javaMailSender; @Autowired private ThreadPoolTaskExecutor taskExecutor; /** * 发送邮件 * @param recipient 收件人 * @param subject 主题(邮件标题) * @param content 邮件内容 */ public void sendMail(final String recipient, final String subject, final String content){ taskExecutor.execute(new Runnable() { public void run() { try { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(MAIL_FROM); message.setTo(recipient); message.setSubject(subject); message.setText(content); javaMailSender.send(message); } catch (Exception e) { logger.error("邮件发送失败:", e); } } }); }