Ramesh Khadka
Ramesh Khadka

Reputation: 506

How to send mail via outlook using spring boot?

My application.properties file contains following configuration :-

spring.mail.properties.mail.smtp.connecttimeout=5000
  spring.mail.properties.mail.smtp.timeout=3000
  spring.mail.properties.mail.smtp.writetimeout=5000
  spring.mail.host=smtp.office365.com
  spring.mail.password=password
  spring.mail.port=587
  [email protected]
  spring.mail.properties.mail.smtp.starttls.enable=true
  security.require-ssl=true
  spring.mail.properties.mail.smpt.auth=true

Java classes for implemting the mail servers are :

@Component
public class SmtpMailSender {
@Autowired
private JavaMailSender javaMailSender;

public void sendMail(String to, String subject, String body) throws MessagingException {
    MimeMessage message = javaMailSender.createMimeMessage();
    MimeMessageHelper helper;
    helper = new MimeMessageHelper(message, true);//true indicates multipart message
    helper.setSubject(subject);
    helper.setTo(to);
    helper.setText(body, true);//true indicates body is html
    javaMailSender.send(message);
}
}

My controller class is :

@RestController
public class MailController {

@Autowired
SmtpMailSender smtpMailSender;

@RequestMapping(path = "/api/mail/send")
public void sendMail() throws MessagingException {
    smtpMailSender.sendMail("[email protected]", "testmail", "hello!");
}
}

when I send get request (/api/mail/send) following error occurs:

{
"timestamp": 1496815958863,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.mail.MailAuthenticationException",
"message": "Authentication failed; nested exception is 
javax.mail.AuthenticationFailedException: ;\n  nested exception 
is:\n\tjavax.mail.MessagingException: Exception reading response;\n  nested 
exception is:\n\tjava.net.SocketTimeoutException: Read timed out",
"path": "/api/mail/send"
}

Any help would be heartily appreciated.

Upvotes: 8

Views: 34909

Answers (3)

JackSlow
JackSlow

Reputation: 11

application.properties

spring.mail.properties.mail.smtp.connecttimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000
spring.mail.host=smtp-mail.outlook.com
spring.mail.password=password
spring.mail.username=username
spring.mail.properties.mail.store.protocol=pop3
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smpt.auth=true

you should connect to Outlook.com using the POP3 protocol instead of the IMAP protocol

This is JavaMAil Frequently Asked Question.

Upvotes: 1

German20
German20

Reputation: 15

You need these options:

spring:
  mail:
    protocol: smtp
    host: smtp.gmail.com
    username: email@..
    password: password..email
    port: 587
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: false
    test-connection: false  

If it still doesn't run, you have to be sure that your source email is available to send emails by letting insecure connections. If not, it could be the proxy.

Upvotes: -4

frederik brooks
frederik brooks

Reputation: 81

You must specify the sender using setFrom method to perform authentication on outlook.com:

@Component
public class SmtpMailSender {

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

    @Autowired
    private JavaMailSender javaMailSender;

    public void sendMail(String to, String subject, String body) throws MessagingException {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper;
        helper = new MimeMessageHelper(message, true);//true indicates multipart message

        helper.setFrom(from) // <--- THIS IS IMPORTANT

        helper.setSubject(subject);
        helper.setTo(to);
        helper.setText(body, true);//true indicates body is html
        javaMailSender.send(message);
    }
}

outlook.com checks that you're not trying to pretend you're somebody else.

Upvotes: 8

Related Questions