春季:未通过电子邮件接收消息

时间:2019-08-31 16:09:28

标签: java spring spring-boot email dependency-injection

我没有通过激活注册在电子邮件帐户上收到消息。 在注册时,在数据库中我看到激活码,并且可以登录,但是我想向激活的帐户发送电子邮件。

我尝试更改端口,并尝试更改“ smtp”上的“ smtps” 我的属性:

spring.mail.host=smtp.gmail.com
spring.mail.username=mymail@gmail.com
spring.mail.password=mypass
spring.mail.port=587
spring.mail.protocol= smtps
spring.mail.properties.mail.smtp.auth = true;
spring.mail.properties.mail.smtp.starttls.enable = true;
mail.debug= true

MailConfig:

@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;
    @Value("${spring.mail.properties.mail.smtp.auth}")
    private String auth;
    @Value("${spring.mail.properties.mail.smtp.starttls.enable}")
    private String enable;

    @Bean
    public JavaMailSender javaMailSender() {
        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", auth);
        properties.setProperty("mail.smtp.starttls.enable", enable);

        return mailSender;
    }

}

UserService:

@Service
public class UserService implements UserDetailsService {

    private final UserRepository userRepository;
    private final MailSender mailSender;

    public UserService(UserRepository userRepository, MailSender mailSender) {
        this.userRepository = userRepository;
        this.mailSender = mailSender;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return userRepository.findByUsername(username);
    }

    public boolean registerUser(User user) {
        User userFromDb = userRepository.findByUsername(user.getUsername());

        if (userFromDb != null) {
            return false;
        }

        user.setActive(true);
        user.setRoles(Collections.singleton(Role.USER));
        user.setActivationCode(UUID.randomUUID().toString());
        userRepository.save(user);

        if (StringUtils.isEmpty(user.getEmail())) {
            String message = String.format("Hello, %s \n" + "Welcome to Sweater. Please visit link: http://localhost:8080/activate/%s",
                    user.getUsername(),
                    user.getActivationCode()
            );
            mailSender.send(user.getEmail(), "Activation code", message);
        }
        return true;
    }

    public boolean activateCode(String code) {
        User user = userRepository.findByActivationCode(code);

        if (user == null) {
            return false;
        }

        user.setActivationCode(null);
        userRepository.save(user);

        return true;
    }
}

控制器

@GetMapping("/activate/{code}")
    public String activate(Model model, @PathVariable String code) {

        boolean isActivated = userService.activateCode(code);

        if(isActivated){
            model.addAttribute("info", "User activated");
        }else {
            model.addAttribute("info", "Activation code is not found");
        }

        return "login";

    }

1 个答案:

答案 0 :(得分:1)

@Autowired MailSender

依赖注入:春季中的@Autowired注释自动将依赖豆注入POJO类的关联引用中。此注释将通过匹配数据类型来注入依赖的bean(即在内部作为自动装配byType)。我们可以

  • @Autowired关于财产
  • @Autowired上的setter方法
  • @Autowired(在构造函数上更好)(优于单个字段的自动装配)