如何为Gmail配置Spring JavaMailSenderImpl

时间:2010-01-06 21:00:04

标签: java spring gmail

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

12 个答案:

答案 0 :(得分:33)

这对我有用:

        <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”)。

答案 1 :(得分:12)

我挣扎了一个小时,找到了正确的设置,使用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 [dispatcherServlet]的Servlet.service()与path的上下文   []引发异常[请求处理失败;嵌套异常是   org.springframework.mail.MailSendException:邮件服务器连接   失败;嵌套异常是javax.mail.MessagingException:Exception   阅读反应;嵌套异常是:     javax.net.ssl.SSLHandshakeException:   sun.security.validator.ValidatorException:PKIX路径构建失败:   sun.security.provider.certpath.SunCertPathBuilderException:无法   找到所请求目标的有效证书路径。

答案 2 :(得分:5)

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

像魅力一样工作!!!

答案 3 :(得分:4)

GMail所需的唯一属性是

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:3)

之后,下面的配置(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

答案 6 :(得分:2)

这是适用于我的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正常工作。

答案 7 :(得分:1)

这对我来说非常有用:

<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

答案 8 :(得分:0)

这似乎没有显着不同,但也许可以尝试:

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

答案 9 :(得分:0)

您应该将“来自”地址指定为<prop key="mail.smtp.from">XXX@gmail.com</prop>或创建消息。

答案 10 :(得分:0)

我已经解决了你的问题。

how to implements an async email service in spring

注意,这适用于春季3,所以我不确定弹簧2。

答案 11 :(得分:0)

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

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

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