注册Spring之后通过电子邮件发送激活码

时间:2020-09-22 12:17:10

标签: spring spring-mvc email

尝试设置发送激活码时遇到以下问题

ERROR 7020 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for
servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; 
nested exception is org.springframework.mail.MailAuthenticationException: Authentication failed;
nested exception is javax.mail.AuthenticationFailedException: 535-5.7.8 
Username and Password not accepted. Learn more at 535 5.7.8  
https://support.google.com/mail/?p=BadCredentials i15sm26828262wrb.91 - gsmtp ] with root cause

我已经尝试过解决此问题的所有建议:两步验证功能已关闭,安全性较低的应用程序被允许使用,并且添加了所有其他属性,但没有任何帮助。请问出什么问题了。

application.properties

spring.datasource.url=jdbc:postgresql://localhost/myDB
spring.datasource.username=postgres
spring.datasource.password=*password for DB*
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

spring.freemarker.expose-request-attributes=true

spring.mail.host=smtp.gmail.com
spring.mail.username=mymail@gmail.com (100% correct - copypasted)
spring.mail.password=*password for mail* (also 100% correct)
spring.mail.port=465
spring.mail.protocol=smtps
mail.debug=true
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
mail.smtp.starttls.enable=true
mail.smtp.auth=true

MailService

package com.example.myproject.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@Service
public class MailService {
private final JavaMailSender javaMailSender;

public MailService(JavaMailSender javaMailSender) {
    this.javaMailSender = javaMailSender;
}

@Value("${spring.mail.username}")
private String username;

public void send(String mailTo, String subject, String message){
    SimpleMailMessage mailMessage = new SimpleMailMessage();

    mailMessage.setFrom(username);
    mailMessage.setTo(mailTo);
    mailMessage.setSubject(subject);
    mailMessage.setText(message);

    javaMailSender.send(mailMessage);
}
}

MailConfig

package com.example.myproject.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import java.util.Properties;
@Configuration
public class MailConfig {
@Value("${spring.mail.host}")
private String host;

@Value("${spring.mail.username}")
private String username;

@Value("${spring.mail.password}")
private String password;

@Value("${spring.mail.port}")
private int port;

@Value("${spring.mail.protocol}")
private String protocol;

@Value("${mail.debug}")
private String debug;

@Bean
public JavaMailSender getMailSender(){
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost(host);
    mailSender.setPort(port);
    mailSender.setUsername(username);
    mailSender.setPassword(password);

    Properties properties = mailSender.getJavaMailProperties();
    properties.setProperty("mail.transport.protocol", protocol);
    properties.setProperty("mail.debug", debug);
    properties.setProperty("mail.smtp.auth", "true");

    return mailSender;

}
}

我还应该注意MailService中的

private final JavaMailSender javaMailSender;

public MailService(JavaMailSender javaMailSender) {
    this.javaMailSender = javaMailSender;
}

我收到这样的消息:

无法自动接线。 有一个以上的“ JavaMailSender”类型的bean。 豆子: getMailSender(MailConfig.java)mailSender(MailSenderPropertiesConfiguration.class)

1 个答案:

答案 0 :(得分:0)

正如异常消息所说,Spring已经有超过1个用于注入的“ JavaMailSender”。 发生这种情况是因为您不需要在MailConfiig中手动创建JavaMailSender。 Spring根据属性文件创建它。