从 Spring Boot 应用程序发送电子邮件时遇到问题

Posted

技术标签:

【中文标题】从 Spring Boot 应用程序发送电子邮件时遇到问题【英文标题】:Having troubles sending emails from spring boot application 【发布时间】:2018-02-21 13:30:16 【问题描述】:

我一直在尝试通过 Spring Boot 发送电子邮件,但似乎无法成功。我已经使用 javamail api 很长时间了,但想将 springboot 与 spring mail 一起使用。

public class SendMail 

    @Autowired
    private JavaMailSender javaMailSender;

    public void sendingMail(String to, String subject, String body) 
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(body);
        javaMailSender.send(message);
    


这是我的邮件

@Controller
public class ExamPle 

    @Autowired
    private SendMail  sendMail;

    @RequestMapping("/he")
    public String homePage() 
        sendMail.sendingMail("bobobush007@gmail.com", "Welcome George", "Sample Message here");
        return "Sent";
        

我的 pom 文件中已经有 sprint-boot-starter-mail,但我不断收到此错误消息。我什至看过有关如何执行此操作的教程的 youtube 视频,但它不起作用。我正在使用 Spring Tool Suite 版本:3.9.0.RELEASE。

属性文件

spring.mail.host=smtp.gmail.com
spring.mail.username=my-email-address
spring.mail.password=my-password
spring.mail.port=587
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.defaultEncoding=UTF-8

2017-09-14 05:25:57.811 信息 12576 --- [主要] com.example.demo.EmaildemoApplication : 开始 带有 PID 12576 的 Georges-MacBook-Pro.local 上的 EmaildemoApplication (由 /Users/georgetebo/STS Projects/Emaildemo 中的 georgetebo 开始) 2017-09-14 05:25:57.814 信息 12576 --- [主要] com.example.demo.EmaildemoApplication :没有活动的配置文件集, 回退到默认配置文件:默认 2017-09-14 05:25:57.845 信息 12576 --- [主要] ationConfigEmbeddedWebApplicationContext:刷新 org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@3d3fcdb0: 启动日期 [Thu Sep 14 05:25:57 WAT 2017];上下文层次的根 2017-09-14 05:25:58.652 信息 12576 --- [主要] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat 初始化为 端口:8080 (http) 2017-09-14 05:25:58.662 INFO 12576 --- [ main] o.apache.catalina.core.StandardService : 启动服务 [Tomcat] 2017-09-14 05:25:58.662 INFO 12576 --- [主要] org.apache.catalina.core.StandardEngine :启动 Servlet 引擎: Apache Tomcat/8.5.20 2017-09-14 05:25:58.714 信息 12576 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]: 初始化 Spring 嵌入式 WebApplicationContext 2017-09-14 05:25:58.714 信息 12576 --- [ost-startStop-1] os.web.context.ContextLoader:根 WebApplicationContext: 初始化在 871 毫秒内完成 2017-09-14 05:25:58.821 INFO 12576 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean:映射 servlet:'dispatcherServlet' 到 [/] 2017-09-14 05:25:58.823 信息 12576 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean :映射过滤器: 'characterEncodingFilter' 到:[/] 2017-09-14 05:25:58.824 INFO 12576 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:“hiddenHttpMethodFilter”到:[/] 2017-09-14 05:25:58.824 信息 12576 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean :映射过滤器: 'httpPutFormContentFilter' 到:[/] 2017-09-14 05:25:58.824 信息 12576 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : 映射过滤器:“requestContextFilter”到:[/] 2017-09-14 05:25:58.848 警告 12576 --- [主要] ationConfigEmbeddedWebApplicationContext:遇到异常 在上下文初始化期间 - 取消刷新尝试: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“example”的 bean 时出错:不满足的依赖关系 通过字段“sendMail”表示;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 'com.example.demo.SendMail' 类型的合格 bean 可用: 预计至少有 1 个 bean 有资格作为 autowire 候选者。 依赖注解: @org.springframework.beans.factory.annotation.Autowired(required=true) 2017-09-14 05:25:58.850 信息 12576 --- [主要] o.apache.catalina.core.StandardService :停止服务 [Tomcat] 2017-09-14 05:25:58.861 信息 12576 --- [主要] utoConfigurationReportLoggingInitializer:

启动 ApplicationContext 时出错。显示自动配置 报告启用“调试”后重新运行您的应用程序。 2017-09-14 05:25:58.927 错误 12576 --- [主要] o.s.b.d.LoggingFailureAnalysisReporter:

***************************应用程序启动失败


说明:

com.example.demo.Example 中的字段 sendMail 需要一个 bean 类型 'com.example.demo.SendMail' 找不到。

行动:

考虑在你的 配置。

这是我的 Pom 文件

http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0

<groupId>com.mailsender</groupId>
<artifactId>MailSender</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>MailSender</name>
<description>ZemoPoint for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

我已经卸载了我的 jdk 以及 STS 并安装了新副本。现在我收到此错误

【问题讨论】:

检查你的 pom 文件,看看 javax.mail 是否被意外标记为“提供”;因此它在运行时丢失 请发布您的 pom.xml 文件的内容。没有它,很难确定为什么会出现此错误。 @spiritwalker @g00glen00b 按要求添加 pom 文件。 这很奇怪,我使用的代码完全相同,但没有遇到此错误。我认为您的 IDE 中一定有问题。您可以尝试使用 Maven 运行它吗? (在命令行执行mvn spring-boot:run 我尝试了新安装的 eclipse 和 STS,但仍然遇到同样的错误。我正在使用 macOS Sierra @g00glen00b 你能告诉我你使用的 IDE 和版本吗? 【参考方案1】:

我认为您应该使用的密码是 gmail 生成的应用程序密码,它不应该只是我猜的任何密码。

【讨论】:

Marc,是什么让您认为原始发布者没有使用正确的密码?我在错误消息中没有看到任何类似的内容。【参考方案2】:

这行得通。

@Service
public class SendMail 

@Autowired
private JavaMailSender javaMailSender;

  public void sendingMail(String to, String subject, String body) 
    MimeMessage message=javaMailSender.createMimeMessage();
    MimeMessageHelper helper;
    helper=new MimeMessageHelper(message,true);
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(body);
    javaMailSender.send(message);

 

【讨论】:

【参考方案3】:

似乎您的属性未正确获取,例如:

spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

你应该尝试使用像这样的其他方式:

JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

mailSender.setHost(emailProperties.getHost());
mailSender.setPort(Integer.parseInt(emailProperties.getPort()));
mailSender.setUsername(emailProperties.getUsername());
mailSender.setPassword(emailProperties.getPassword());

Properties javaMailProperties = new Properties();
javaMailProperties.put("mail.smtp.starttls.enable", "true");
javaMailProperties.put("mail.smtp.auth", "true");
javaMailProperties.put("mail.transport.protocol", "smtp");
javaMailProperties.put("mail.debug", "true");

mailSender.setJavaMailProperties(javaMailProperties);

从Spring Boot Freemarker Email Template的帖子中查看更多信息

希望对您有所帮助!

【讨论】:

【参考方案4】:

您是否尝试将 javax.mail 添加到您的 pom 中? Spring 邮件发送者依赖于 JavaMail。

【讨论】:

没关系,spring-boot-starter-mail 已经包含邮件 API 实现:github.com/spring-projects/spring-boot/blob/… 我看到同样的问题你需要添加 javax.mail ClassNotFoundException: javax.mail.MessagingException

以上是关于从 Spring Boot 应用程序发送电子邮件时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 应用程序中使用 Freemarker 模板发送电子邮件?

让 Spring Boot 应用程序通过 AWS SES 发送简单电子邮件需要哪些配置步骤?

使用Spring Boot 优雅地发送邮件

使用 Spring Boot OAuth2 针对 Google 进行身份验证时如何将 google 用户电子邮件发送到白名单用户

Spring Boot - spring-boot-starter-mail 为 Smartermail 发送电子邮件不起作用

spring boot发送邮件