如何为Gmail配置Spring JavaMailSenderImpl

如何为Gmail配置Spring JavaMailSenderImpl,java,spring,gmail,Java,Spring,Gmail,我正在尝试使用JavaMailSenderImpl类查找用于连接Gmail SMTP服务器的正确属性 首先,我要说的是,我已经尝试了找到的方法。这很有效。但当我使用完全相同的身份验证信息尝试该帖子下面的配置时,我收到了javax.mail.AuthenticationFailedException 我当前的配置如下所示 <bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" &g

我正在尝试使用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>

smtp.gmail.com
587
真的
真的
如果我知道我的凭据是正确的,为什么我仍然得到这个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>

XXX@gmail.com
XXX@gmail.com
XXX
smtp.gmail.com
587
真的
真的

这似乎没有明显不同,但不妨尝试一下:

<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.user" value="XXX@gmail.com" />
        <prop key="mail.smtp.password" value="XXX" />
        <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>

smtp.gmail.com
587
真的
真的
您应该将“发件人”地址指定为
XXX@gmail.com
,或者在创建消息时。

这对我很有用:

        <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>
    public JavaMailSender getJavaMailSender()
    {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setProtocol("smtp");
        sender.setHost("smtp.gmail.com");
        sender.setPort(587);
        sender.setUsername("username");
        sender.setPassword("password");

        Properties mailProps = new Properties();
        mailProps.put("mail.smtps.auth", "true");
        mailProps.put("mail.smtp.starttls.enable", "true");
        mailProps.put("mail.smtp.debug", "true");

        sender.setJavaMailProperties(mailProps);

        return sender;
    }
smtp.gmail.com
587
smtp
${mail.username}
${mail.password}
真的
真的
假的

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

GMail唯一需要的属性是

<prop key="mail.smtp.starttls.enable">true</prop>
true

这对我来说很有效:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.gmail.com" />
    <property name="port" value="465" />
    <property name="protocol" value="smtps" />
    <property name="username" value="my_email@domain.tld" />
    <property name="password" value="my_password" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtps.auth">true</prop>
    </props>
    </property>
</bean>

真的

有关更多信息,请参阅谷歌支持:

谷歌有时/首次阻止任何第三方应用程序或使用您的代码登录您的帐户。当您在浏览器中登录到您的帐户时,您将收到一条消息 “谷歌阻止可疑的登录尝试”“请参见下面的屏幕截图。


点击“是你吗”并允许登录。

让Gmail使用TLS或SSL:

TLS/STARTTLS的端口:587
SSL端口:465

这两个都是复杂的参数,分别是
javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.fallback
和make
mail.smtp.starttls.enable
为false

<beans>
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host"><value>smtp.gmail.com</value></property>
        <property name="port"><value>465</value></property>
        <property name="protocol"><value>smtp</value></property>
        <property name="username"><value>XXXXX@gmail.com</value></property>
        <property name="password"><value>XXXX</value></property>
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">false</prop>
                <prop key="mail.smtp.quitwait">false</prop>
                <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
                <prop key="mail.smtp.socketFactory.fallback">false</prop>
                <prop key="mail.debug">true</prop>
            </props>
        </property>
    </bean>
    <bean id="mailMail" class="com.embitel.service.email.EmailService">
        <property name="mailSender" ref="mailSender" />
        <property name="simpleMailMessage" ref="customeMailMessage" />
    </bean>
    <bean id="customeMailMessage" class="org.springframework.mail.SimpleMailMessage">
        <property name="from" value="XXXX@gmail.com" />
        <property name="to" value="yyyyy@gmail.com" />
        <property name="subject" value="Testing Subject Line for email senind.." />
        <property name="text">
            <value>
        <![CDATA[
            Dear %s,
            Mail Content : %s
        ]]>
            </value>
        </property>
    </bean>
</beans>

smtp.gmail.com
465
smtp
XXXXX@gmail.com
XXXX
真的
假的
假的
javax.net.ssl.SSLSocketFactory
假的
真的

工作得很有魅力

我喜欢你的问题


注意,这在Spring3上有效,所以我不确定Spring2是否有效。

我也面临这个身份验证异常,这是因为gmail的安全性。打开以下url


并启用安全性较低的功能。

以下是适用于我的javaConfig:

        <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>
    public JavaMailSender getJavaMailSender()
    {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setProtocol("smtp");
        sender.setHost("smtp.gmail.com");
        sender.setPort(587);
        sender.setUsername("username");
        sender.setPassword("password");

        Properties mailProps = new Properties();
        mailProps.put("mail.smtps.auth", "true");
        mailProps.put("mail.smtp.starttls.enable", "true");
        mailProps.put("mail.smtp.debug", "true");

        sender.setJavaMailProperties(mailProps);

        return sender;
    }

我想你需要使用587端口才能让TLS正常工作。

我花了一个小时努力找到正确的设置,用javamailsender从Gmail发送电子邮件,最后终于做到了。我之所以发布这篇文章,是因为我找不到一个通过gmail发送javamailsender的全面示例,所以希望这能帮助那些想做同样事情的人:

步骤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类中,@在以下内容中对其进行赋值:

@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:

点击此链接并选择打开对不太安全的应用程序的访问

步骤3:

如果电脑上有AVAST,请关闭它。AVAST邮件屏蔽与发送电子邮件冲突。如果不将其关闭,将出现以下错误:

Servlet[dispatcherServlet]在具有路径的上下文中的Servlet.service() []引发异常[请求处理失败;嵌套异常为 org.springframework.mail.MailSendException:邮件服务器连接 失败;嵌套异常为javax.mail.MessaginException:异常 正在读取响应;嵌套异常为: javax.net.ssl.SSLHandshakeException: sun.security.validator.validator异常:PKIX路径生成失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效证书路径

下面的配置(yaml格式)在之后对我有效

  • 我禁用了双因素身份验证
  • 我启用了不太安全的应用程序


我以前尝试过,但运气不好。我也尝试过mail.smtp.passwd属性,只是为了好玩。我在创建邮件时设置了它,但我也在更新的帖子中添加了该属性。这里有一个工作示例:我很喜欢你的问题。这篇文章非常好:@vvursT,正如我在帖子中所说的:它对我有效。我很喜欢n、 Ken的解决方案(即使用
smtp
而不是
smtps
)没有。当我在smtp.gmail.com上使用smtp.auth=true,starttls.enable=true时,我得到了错误“MessaginException:无法将套接字转换为TLS-SunCertPathBuilderException”,然后我添加了*,然后它工作正常!!您的实现是动态的,这就是我所需要的。最佳答案
mail.smtp.debug
不正确。应该是
mail.debug
。另外,587(不是487)
mail.smtp.debug
不正确。它应该是
mail.debug