使用spring boot使用gmail smtp发送电子邮件

时间:2016-01-22 13:41:47

标签: java spring spring-boot

我正在尝试使用spring boot发送电子邮件。我有3个文件如下

MailSender.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

public class MailSender
{
    @Autowired
    private static JavaMailSender mailSender;

    public static void main(String[] args)
    {
        sendemail();
    }
    public static void sendemail() {
        MimeMessage mail = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(mail, true);
            helper.setTo("emailsendertester24@gmail.com");
            //helper.setReplyTo("someone@localhost");
            helper.setFrom("emailsendertester24@gmail.com");
            helper.setSubject("Lorem ipsum");
            helper.setText("Lorem ipsum dolor sit amet [...]");
        } catch (MessagingException e) {
            e.printStackTrace();
        } finally {}
        mailSender.send(mail);
        //return helper;
    }
}

的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>Example</groupId>
    <artifactId>SendingEmail</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.2.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.5</version>
        </dependency>
    </dependencies>


</project>

application.properties

spring.mail.host=smtp.gmail.com
spring.mail.username=*****
spring.mail.password=*****
spring.mail.properties.mail.smtp.auth = true
spring.mail.properties.mail.smtp.socketFactory.port = 25
spring.mail.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback = false
spring.mail.properties.mail.smtp.ssl.enable=true

所以现在当我尝试运行我的MailSender类时,它给我一个错误“线程中的异常”主“java.lang.NullPointerException”在行 MimeMessage mail = mailSender.createMimeMessage(); 我知道mailSender属性为null,因为它无法从application.properties文件中获取属性。

3 个答案:

答案 0 :(得分:4)

您可以选择在Spring-Boot-Email-Tools项目中提供开箱即用的解决方案。

它还提供了有用的功能,如调度,模板引擎支持和REDIS持久性。

如果您需要发送纯文本电子邮件,则只需导入核心模块

<dependency>
    <groupId>it.ozimov</groupId>
    <artifactId>spring-boot-email-core</artifactId>
    <version>0.5.0</version>
</dependency>

按如下方式注释主要内容:

package com.myapplication;

@SpringBootApplication
@EnableEmailTools
public class MainApplication  {

    public static void main(final String... args) {

    }
}

application.yml(o properties)中提供配置,并在组件类中自动装配EmailService,例如

@Autowired
public EmailService emailService;

public void sendEmailWithoutTemplating(){
   final Email email = EmailImpl.builder()
        .from(new InternetAddress("cicero@mala-tempora.currunt", "Marco Tullio Cicerone "))
        .to(Lists.newArrayList(new InternetAddress("titus@de-rerum.natura", "Pomponius Attĭcus")))
        .subject("Laelius de amicitia")
        .body("Firmamentum autem stabilitatis constantiaeque eius, quam in amicitia quaerimus, fides est.")
        .encoding(Charset.forName("UTF-8")).build();

   emailService.send(email);
}

可以在项目的GitHub存储库中找到更多示例。另外,LinkedIn上有this article

答案 1 :(得分:2)

出现此问题导致您在此块中使用未正确终止的递归:

public static void send() {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setFrom("abc@gmail.com");
    message.setTo("xyz@gmail.com");
    message.setSubject("hello");
    mailSender.send();
}

您调用自己引用的mailSender.send()方法。在方法内更改你的电话。

答案 2 :(得分:0)

尝试这样的事情:

@SpringBootApplication
public class MyMailSender {

@Bean
public SenderService senderService() {
    return new SenderService();
}

public static void main(String[] args) {
    SpringApplication.run(MyMailSender.class, args);
}
}

public class SenderService {

@Autowired
private JavaMailSender mailSender;

@PostConstruct
public void send() {
    MimeMessage mail = mailSender.createMimeMessage();
    try {
        MimeMessageHelper helper = new MimeMessageHelper(mail, true);
        helper.setTo("emailsendertester24@gmail.com");
        //helper.setReplyTo("someone@localhost");
        helper.setFrom("emailsendertester24@gmail.com");
        helper.setSubject("Lorem ipsum");
        helper.setText("Lorem ipsum dolor sit amet [...]");
    } catch (MessagingException e) {
        e.printStackTrace();
    } finally {}
    mailSender.send(mail);
    //return helper;
}

}