【问题标题】:Sending email from Spring Boot application using Gmail使用 Gmail 从 Spring Boot 应用程序发送电子邮件
【发布时间】:2023-03-18 16:35:01
【问题描述】:

我研究了以下问题和答案: Spring Boot - Could not connect to SMTP host: smtp.gmail.com, port: 25, response: 421

我想做同样的事情 - 使用 Gmail 服务器从 Spring Boot 应用程序发送电子邮件。

我的配置是这样的:

spring.mail.host = smtp.gmail.com
spring.mail.username = ***@otherdomain
spring.mail.password = ***
spring.mail.properties.mail.smtp.auth = true
spring.mail.properties.mail.smtp.starttls.enable=true 
spring.mail.properties.mail.smtp.socketFactory.port = 465
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

这是从另一个问题中复制的,仅根据我的需要更改了用户名和密码。我的方案的唯一不同之处在于电子邮件地址的域不是 gmail.com。

我的电子邮件客户端课程是:

@Service
public class MailClient {

  @Autowired
  private JavaMailSender mailSender;

  public void prepareAndSend(String recipient, String message) {
    MimeMessagePreparator messagePreparator = mimeMessage -> {
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
        messageHelper.setFrom("staffing@readingbeerfestival.org.uk");
        messageHelper.setTo(recipient);
        messageHelper.setSubject("Sample mail subject");
        messageHelper.setText(message);
    };
    mailSender.send(messagePreparator);
  }
}

我的例外是:

Failed message 1: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. g78sm6788965wrd.11 - gsmtp

【问题讨论】:

  • 您的意思是对于其他域,您使用具有自定义域的 Google for Work 帐户?还是该域与任何 Google 帐户完全无关?
  • 这是我自己的域,其 MX 记录指向 Gmail。
  • 您是否尝试指定spring.mail.properties.mail.smtp.port=465? socketFactory.port 仅设置您的本地端口,而不是应该在 SMTP 服务器上使用的端口。

标签: java email spring-boot smtp gmail


【解决方案1】:

您可以在不复制配置的情况下执行此操作(在这种情况下 From Email 除外,但这取决于您的 SMTP 提供商):

依赖关系

"org.springframework.boot:spring-boot-starter-mail"

application.properties

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=from.email@gmail.com
spring.mail.password=*******
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

电子邮件服务

@Component
public class EmailService {

    private final JavaMailSender sender;

    @Autowired
    public EmailService(JavaMailSender sender) {
        this.sender = sender;
    }

    public void send(String emailTo, String subject, String body) {
        MimeMessagePreparator message = newMessage -> {
            newMessage.setRecipient(
                    Message.RecipientType.TO,
                    new InternetAddress(emailTo)
            );
            newMessage.setFrom("from.email@gmail.com");
            newMessage.setSubject(subject);
            newMessage.setText(body);
        };

        this.sender.send(message);
    }
}

【讨论】:

    【解决方案2】:

    回答我自己的问题以防其他人发现它有用:

    所需的属性集如下:

    spring.mail.host=smtp.gmail.com
    spring.mail.port=587
    spring.mail.username=****
    spring.mail.password=****
    spring.mail.properties.mail.smtp.auth=true
    spring.mail.properties.mail.smtp.starttls.enable=true
    

    您还需要自己提供 JavaMailSender 并设置其他属性:

    @Bean
    public JavaMailSender getJavaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost("smtp.gmail.com");
        mailSender.setPort(587);
    
        mailSender.setUsername("***");
        mailSender.setPassword("***");
    
        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.debug", "true");
    
        return mailSender;
    }
    

    不知道为什么我需要重复配置,但这对我有用。参考:baeldung.com

    【讨论】:

      【解决方案3】:

      您使用的是 smtp.gmail.com,因此电子邮件应该是 gmail

      编辑: 在我的 spring mvc 应用程序中,我喜欢这样: 服务:

      import org.springframework.mail.MailSender;
      import org.springframework.mail.SimpleMailMessage;
      
      
          /**
               * This method will send compose and send the message
               * */
              public void sendMail(String to, String subject, String body)
              {
                  SimpleMailMessage message = new SimpleMailMessage();
                  message.setTo(to);
                  message.setSubject(subject);
                  message.setText(body);
                  mailSender.send(message);
              }
      

      在控制器中我使用了我的服务

      applicationMailer.sendMail("*******@gmail.com", "Message from "+ userName , mailModel.getBody());
      

      对于配置

      <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
              <property name="host" value="smtp.gmail.com"/>
              <property name="port" value="587"/>  <!--   ou 25 -->
              <property name="username" value="*****@gmail.com"/>
              <property name="password" value="******"/>
              <property name="javaMailProperties">
                  <props>
                      <prop key="mail.transport.protocol">smtp</prop>
                      <prop key="mail.smtp.auth">true</prop>
                      <prop key="mail.smtp.starttls.enable">true</prop>
                      <prop key="mail.debug">true</prop>
                  </props>
              </property>
          </bean>
      

      【讨论】:

      • 不确定您的意思,但我尝试使用电子邮件地址为 ...@gmail.com 的其他 gmail 帐户。结果相同。
      • 尝试使用 port = 25 ,而不是 465
      猜你喜欢
      • 2019-03-04
      • 1970-01-01
      • 2017-10-15
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 2018-02-21
      相关资源
      最近更新 更多