Spring doesn't work sending smtp: mail com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first
Asked Answered
P

1

5

I am triying to send a mail from my spring app what was generate with jhipster 1.1.0. and my spring-boot version is 1.5.2

I have this code:

Application-dev.yml:

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: [email protected]
    password: mypass
    protocol: smtp
    tls: true
  properties.mail.smtp:
    auth: true
    starttls.enable: true
    #ssl.trust: smtp.gmail.com
    starttls.required: true
jhipster:
  mail: # specific JHipster mail property, for standard properties see MailProperties
    from: [email protected]  
    base-url: http://127.0.0.1:8080

MailService.java

package com.pfg.easyschedule.service;

import com.pfg.easyschedule.domain.User;

import io.github.jhipster.config.JHipsterProperties;

import org.apache.commons.lang3.CharEncoding;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.context.MessageSource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring4.SpringTemplateEngine;

import javax.inject.Inject;
import javax.mail.internet.MimeMessage;
import java.util.Locale;
import java.util.Map;

/**
 * Service for sending e-mails.
 * <p>
 * We use the @Async annotation to send e-mails asynchronously.
 * </p>
 */
@Service
public class MailService {

    private final Logger log = LoggerFactory.getLogger(MailService.class);
    private static final String USER = "user";
    private static final String BASE_URL = "baseUrl";
    private final JHipsterProperties jHipsterProperties;
    private final JavaMailSender javaMailSender;
    private final MessageSource messageSource;
    private final SpringTemplateEngine templateEngine;


    public MailService(JHipsterProperties jHipsterProperties, JavaMailSender javaMailSender,
            MessageSource messageSource, SpringTemplateEngine templateEngine) {

        this.jHipsterProperties = jHipsterProperties;
        this.javaMailSender = javaMailSender;
        this.messageSource = messageSource;
        this.templateEngine = templateEngine;
    }

    @Async
    public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) {
        log.debug("Send e-mail[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}",
            isMultipart, isHtml, to, subject, content);

        // Prepare message using a Spring helper
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper message = new MimeMessageHelper(mimeMessage, isMultipart, CharEncoding.UTF_8);
            message.setTo(to);
            message.setFrom(jHipsterProperties.getMail().getFrom());
            message.setSubject(subject);
            message.setText(content, isHtml);
            javaMailSender.send(mimeMessage);
            log.debug("Sent e-mail to User '{}'", to);
        } catch (Exception e) {
            log.warn("E-mail could not be sent to user '{}'", to, e);
        }
    }

    @Async
    public void sendActivationEmail(User user) {
        log.debug("Sending activation e-mail to '{}'", user.getEmail());
        Locale locale = Locale.forLanguageTag(user.getLangKey());
        Context context = new Context(locale);
        context.setVariable(USER, user);
        context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl());
        String content = templateEngine.process("activationEmail", context);
        String subject = messageSource.getMessage("email.activation.title", null, locale);
        sendEmail(user.getEmail(), subject, content, false, true);
    }

    @Async
    public void sendCreationEmail(User user) {
        log.debug("Sending creation e-mail to '{}'", user.getEmail());
        Locale locale = Locale.forLanguageTag(user.getLangKey());
        Context context = new Context(locale);
        context.setVariable(USER, user);
        context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl());
        String content = templateEngine.process("creationEmail", context);
        String subject = messageSource.getMessage("email.activation.title", null, locale);
        sendEmail(user.getEmail(), subject, content, false, true);
    }

    @Async
    public void sendPasswordResetMail(User user) {
        log.debug("Sending password reset e-mail to '{}'", user.getEmail());
        Locale locale = Locale.forLanguageTag(user.getLangKey());
        Context context = new Context(locale);
        context.setVariable(USER, user);
        context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl());
        String content = templateEngine.process("passwordResetEmail", context);
        String subject = messageSource.getMessage("email.reset.title", null, locale);
        sendEmail(user.getEmail(), subject, content, false, true);
    }
}

finally I use from controller this one to send mails.

Controller.java

@RestController

@RequestMapping("/api") public class MyClassResource{

private final Logger log = 
LoggerFactory.getLogger(MyClassResource.class);

@Autowired
EntityManager entityManager;
@Autowired
MailService mailService;
@PostMapping ("/myurl")
@Timed
public ResponseEntity<Boolean> mymethod(@RequestBody myObject data) {
mailService.sendEmail(
            "[email protected]",
            "message from spring",
            "hi world. this message is from spring",
            true,
            true
        );
}

Finally I get this error:

c....MailService   : E-mail could not be sent to user '[email protected]'

org.springframework.mail.MailSendException: Failed messages: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. w125sm9354452wmb.45 - gsmtp

at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:474)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:345)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
.........

I have been reading about this error and I add some thing to configuration like is in application-dev.yml but this one doesn't work. I tried to get one password application from gmail because I read that it was necesary but I couldn't because I don have authentication by 2 steps, and finally I change to accept conexion from less secure applications and neither worked it. I don't know why doesn't work it.

Pharaoh answered 16/12, 2018 at 20:52 Comment(4)
You have a whole lot of content spammed in your application.yml, but if you'll check the documentation, the keys are spring.mail.*.Abutment
I forgot to write spring tag before mail tag. I have updated application-dev.ymlPharaoh
properties.mail.smtp is not indented correctly, it must be nested under mail as in official doc: jhipster.tech/tips/011_tip_configuring_email_in_jhipster.html and Jhipster version is very unlikely 1.1.0 as it would be 5 years old and not using spring boot 1.5Turgent
Try setting the following properties: EnableSSL.enable: true, socketFactory.class: "javax.net.ssl.SSLSocketFactory", socketFactory.fallbac k: false, socketFactory.port: 587Premaxilla
P
6

Thank you for your help everyone.

Finally I use @Gaël recomendation and it is working now. This one is my new configuration

Application-dev.yml:

mail:
    host: smtp.gmail.com
    port: 587
    username: [email protected]
    password: mypass        
    protocol: smtp
    tls: true
    properties.mail.smtp:
        auth: true
        starttls.enable: true
        ssl.trust: smtp.gmail.com
jhipster:
    mail: # specific JHipster mail property, for standard properties see MailProperties
    from: [email protected]
    base-url: http://127.0.0.1:8080
Pharaoh answered 17/12, 2018 at 20:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.