如何配置Spring JavaMailSenderImpl for Gmail更新

2022-09-01 03:03:14

我正在尝试找到正确的属性,以使用JavaMailSenderImpl类连接到Gmail SMTP服务器。

首先让我说,我尝试了这里找到的方法。这工作正常。但是,当我尝试使用完全相同的身份验证信息在下面的帖子进行配置时,我收到了javax.mail.AuthenticationFailedException。

我当前的配置如下所示。

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="XXX@gmail.com" />
    <property name="password" value="XXX" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.host">smtp.gmail.com</prop>
        <prop key="mail.smtp.port">587</prop>
        <prop key="mail.smtp.auth">true</prop>
        <prop key="mail.smtp.starttls.enable">true</prop>
    </props>
    </property>
</bean>

为什么我仍然得到这个javax.mail.AuthenticationFailedException,如果我知道我的凭据是正确的。

更新

这是我根据以下答案更新的代码。我仍然收到相同的异常。

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="XXX@gmail.com" />
    <property name="password" value="XXX" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.from">XXX@gmail.com</prop>
        <prop key="mail.smtp.user">XXX@gmail.com</prop>
        <prop key="mail.smtp.password">XXX</prop>
        <prop key="mail.smtp.host">smtp.gmail.com</prop>
        <prop key="mail.smtp.port">587</prop>
        <prop key="mail.smtp.auth">true</prop>
        <prop key="mail.smtp.starttls.enable">true</prop>
    </props>
    </property>
</bean>

答案 1

这对我有用:

        <property name="host"><value>smtp.gmail.com</value></property>
        <property name="port"><value>587</value></property>
        <property name="protocol"><value>smtp</value></property>
        <property name="username"><value>${mail.username}</value></property>
        <property name="password"><value>${mail.password}</value></property>
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
                <prop key="mail.smtp.quitwait">false</prop>
            </props>
        </property>

对我来说,真正的诀窍是“协议”值必须是“smtp”(而不是“smtps”)。


答案 2

我花了一个小时的时间寻找正确的设置,使用javamailsender从Gmail发送电子邮件,最后做到了。我发布这个,因为我找不到一个全面的例子来通过javamailmailsender发送,所以希望这将有助于想要做同样的事情的人:

第 1 步:

将以下设置添加到 mail.properties:

mail.protocol=smtp
mail.host=smtp.gmail.com
mail.port=465
mail.smtp.socketFactory.port=465
mail.smtp.auth=true
mail.smtp.starttls.enable=true
mail.smtp.debug=true
mail.smtp.starttls.required=true
mail.smtp.socketFactory.fallback=false
mail.from=XXX@gmail.com
mail.username=XXX@gmail.com
mail.password=my_password

然后在 mailConfiguration 类中,将它们@Value:

@Configuration
@PropertySource("classpath:mail.properties")
public class MailConfiguration {

    @Value("${mail.protocol}")
    private String protocol;
    @Value("${mail.host}")
    private String host;
    @Value("${mail.port}")
    private int port;
    @Value("${mail.smtp.socketFactory.port}")
    private int socketPort;
    @Value("${mail.smtp.auth}")
    private boolean auth;
    @Value("${mail.smtp.starttls.enable}")
    private boolean starttls;
    @Value("${mail.smtp.starttls.required}")
    private boolean startlls_required;
    @Value("${mail.smtp.debug}")
    private boolean debug;
    @Value("${mail.smtp.socketFactory.fallback}")
    private boolean fallback;
    @Value("${mail.from}")
    private String from;
    @Value("${mail.username}")
    private String username;
    @Value("${mail.password}")
    private String password;

    @Bean
    public JavaMailSender javaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

        Properties mailProperties = new Properties();
        mailProperties.put("mail.smtp.auth", auth);
        mailProperties.put("mail.smtp.starttls.enable", starttls);
        mailProperties.put("mail.smtp.starttls.required", startlls_required);
        mailProperties.put("mail.smtp.socketFactory.port", socketPort);
        mailProperties.put("mail.smtp.debug", debug);
        mailProperties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        mailProperties.put("mail.smtp.socketFactory.fallback", fallback);

        mailSender.setJavaMailProperties(mailProperties);
        mailSender.setHost(host);
        mailSender.setPort(port);
        mailSender.setProtocol(protocol);
        mailSender.setUsername(username);
        mailSender.setPassword(password);
        return mailSender;
    }
}

请注意,我的Spring服务器启用了SSL,因此这就是我使用端口465的原因。对于 SSL,请使用端口 465。如果您使用的是 487,则必须使用 TLS。

第 2 步:

点击此链接并选择启用对安全性较低的应用的访问权限。

https://www.google.com/settings/security/lesssecureapps

第 3 步:

关闭AVAST,如果你的电脑上有它。AVAST邮件盾与发送电子邮件冲突。如果不将其关闭,您将收到以下错误:

Servlet.service() for servlet [dispatcherServlet] 在上下文中与路径 [] 抛出异常 [请求处理失败;嵌套异常为 org.springframework.mail.MailSendException: 邮件服务器连接失败;嵌套异常为 javax.mail.MessagingException:异常读取响应;嵌套异常为:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX 路径构建失败: sun.security.provider.certpathPassException: 无法查找请求目标的有效证书路径。


推荐