Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Gmail从Spring Boot应用程序发送电子邮件_Java_Email_Spring Boot_Smtp_Gmail - Fatal编程技术网

Java 使用Gmail从Spring Boot应用程序发送电子邮件

Java 使用Gmail从Spring Boot应用程序发送电子邮件,java,email,spring-boot,smtp,gmail,Java,Email,Spring Boot,Smtp,Gmail,我研究了以下问题和答案: 我想做同样的事情——使用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.starttl

我研究了以下问题和答案:

我想做同样的事情——使用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
这是从另一个问题复制过来的,只有用户名和密码根据我的需要进行了更改。我的scienario唯一不同的地方是,电子邮件地址的域名不是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

您使用了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>

smtp
真的
真的
真的

您使用了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>

smtp
真的
真的
真的

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

所需的属性集如下所示:

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;
}

不知道为什么我需要重复配置,但这对我来说很有效。参考资料:

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

所需的属性集如下所示:

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;
}

不知道为什么我需要重复配置,但这对我来说很有效。参考资料:

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

依赖关系

"org.springframework.boot:spring-boot-starter-mail"
应用程序属性

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);
    }
}

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

依赖关系

"org.springframework.boot:spring-boot-starter-mail"
应用程序属性

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);
    }
}

你的意思是在其他领域,你使用谷歌的工作帐户与自定义域?或者该域与任何Google帐户完全无关?这是我自己的域,其MX记录指向Gmail。您是否尝试指定
spring.mail.properties.mail.smtp.port=465
?socketFactory.port仅设置您的本地端口,而不是SMTP服务器上应使用的端口。您的意思是在其他域中,您使用自定义域的Google for work帐户吗?或者该域与任何Google帐户完全无关?这是我自己的域,其MX记录指向Gmail。您是否尝试指定
spring.mail.properties.mail.smtp.port=465
?socketFactory.port仅设置您的本地端口,而不是应该在SMTP服务器上使用的端口。不确定您的意思,但我尝试使用不同的gmail帐户,其中电子邮件地址为...@gmail.com。相同的结果。尝试使用port=25,而不是465。我不确定你的意思,但我尝试使用不同的gmail帐户,其中的电子邮件地址是...@gmail.com。相同的结果。请尝试使用端口=25,而不是465