【问题标题】:How to configure Spring JavaMailSenderImpl for Gmail如何为 Gmail 配置 Spring JavaMailSenderImpl
【发布时间】:2010-01-06 21:00:03
【问题描述】:

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

首先让我说我已经尝试过找到here的方法。这工作得很好。但是,当我使用完全相同的身份验证信息尝试该帖子下方的配置时,我收到了 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>

【问题讨论】:

标签: java spring gmail


【解决方案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”)。

【讨论】:

  • 当我使用 smtp.auth=true, starttls.enable=true 和 smtp.gmail.com 时,我收到错误消息“MessagingException:无法将套接字转换为 TLS - SunCertPathBuilderException”,然后我添加了*,然后就可以正常使用了!!
【解决方案2】:

我苦苦挣扎了一个小时才找到正确的设置,以便使用 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 类中,@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 步:

如果您的 PC 上有 AVAST,请将其关闭。 AVAST Mail Shield 与发送电子邮件发生冲突。如果不关闭,会报如下错误:

Servlet.service() 用于 servlet [dispatcherServlet] 在上下文中的路径 [] 抛出异常 [请求处理失败;嵌套异常是 org.springframework.mail.MailSendException:邮件服务器连接 失败的;嵌套异常是 javax.mail.MessagingException: Exception 阅读反应;嵌套异常是: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径。

【讨论】:

  • 您的实现是动态的,这就是我所需要的。最佳答案
  • mail.smtp.debug 不正确。应该是mail.debug
  • 另外,587(不是 487)
【解决方案3】:

让 Gmail 使用 TLS 或 SSL:

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

两者都是强制参数javax.net.ssl.SSLSocketFactorymail.smtp.socketFactory.fallback 并使mail.smtp.starttls.enable 为假。

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

像魅力一样工作!!!

【讨论】:

    【解决方案4】:

    下面的配置(yaml 格式)在

    之后对我有用
    spring.mail:
      host: smtp.gmail.com
      port: 465
      protocol: smtp
      username: xyz@gmail.com
      password: abc
      test-connection: true
      properties:
        "mail.smtp.auth": true
        "mail.smtp.starttls.enable": true
        "mail.smtp.starttls.required": true
        "mail.smtp.socketFactory.class": javax.net.ssl.SSLSocketFactory
        "mail.debug": true
    

    【讨论】:

      【解决方案5】:

      GMail 需要的唯一属性是

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          这是对我有用的 javaConfig:

              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 工作。

          【讨论】:

          • mail.smtp.debug 不正确。应该是mail.debug
          【解决方案8】:

          对我有用

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

          有关更多信息,请参阅 Google 支持:http://support.google.com/mail/bin/answer.py?hl=en&answer=78799

          【讨论】:

          • @vvursT 正如我在帖子中所说:它对我有用。我维持。 Ken 的解决方案(即使用smtp 而不是smtps)没有。
          【解决方案9】:

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

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

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

          【讨论】:

            【解决方案10】:

            这似乎没有太大的不同,但不妨试试:

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

            【讨论】:

            • 我之前尝试过,但没有运气。我也尝试了 mail.smtp.passwd 属性,只是为了好玩。
            【解决方案11】:

            您应该指定您的“发件人”地址,可以是&lt;prop key="mail.smtp.from"&gt;XXX@gmail.com&lt;/prop&gt;,也可以在创建消息时指定。

            【讨论】:

            • 我在创建消息时设置了它,但我还在更新的帖子中添加了该属性。
            【解决方案12】:

            我已经解决了你的问题。

            how to implements an async email service in spring

            注意,这适用于 spring 3 ,所以我不确定 spring 2。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-03-02
              • 1970-01-01
              • 1970-01-01
              • 2011-03-17
              • 2016-07-27
              • 2012-11-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多