web-dev-qa-db-fra.com

Comment configurer Spring JavaMailSenderImpl pour Gmail

J'essaie de trouver les propriétés correctes à utiliser pour se connecter au serveur SMTP Gmail à l'aide de la classe JavaMailSenderImpl.

Permettez-moi d'abord de dire que j'ai essayé l'approche trouvée ici . Cela a bien fonctionné. Mais lorsque j'ai essayé la configuration ci-dessous, avec les mêmes informations d'authentification, j'ai reçu une exception javax.mail.AuthenticationFailedException.

Ma configuration actuelle ressemble à ceci.

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="[email protected]" />
    <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>

Pourquoi ai-je toujours cette exception javax.mail.AuthenticationFailedException si je sais que mes informations d'identification sont correctes.

Mise à jour

Voici mon code mis à jour basé sur les réponses ci-dessous. Je reçois toujours la même exception.

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="[email protected]" />
    <property name="password" value="XXX" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.from">[email protected]</prop>
        <prop key="mail.smtp.user">[email protected]</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>
38
Andrew

Cela a fonctionné pour moi:

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

Le vrai truc pour moi s'est avéré être que la valeur "protocole" doit être "smtp" (pas "smtps").

33
Ken Burcham

J'ai eu du mal pendant une heure à trouver les bons paramètres pour envoyer un e-mail à partir de Gmail à l'aide de javamailsender et je l'ai finalement fait. Je poste ceci car je ne trouve pas d'exemple complet à envoyer via gmail avec javamailsender donc j'espère que cela aidera quelqu'un qui veut faire la même chose:

ÉTAPE 1:

Ajoutez les paramètres suivants à 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
[email protected]
[email protected]
mail.password=my_password

Et puis dans votre classe mailConfiguration, @Valuez-les dans:

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

Veuillez noter que mon serveur Spring est compatible SSL, c'est pourquoi j'utilise le port 465. Pour SSL, utilisez le port 465. Si vous utilisez 487, vous devez utiliser TLS.

ÉTAPE 2:

En suivant ce lien et choisissez d'activer l'accès aux applications moins sécurisées.

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

ÉTAPE 3:

Désactivez AVAST si vous l'avez sur votre PC. AVAST Mail Shield entre en conflit avec l'envoi d'e-mails. Si vous ne le désactivez pas, vous obtiendrez l'erreur suivante:

Servlet.service () pour servlet [dispatcherServlet] dans le contexte avec le chemin [] a levé l'exception [Échec du traitement de la demande; l'exception imbriquée est org.springframework.mail.MailSendException: la connexion au serveur de messagerie a échoué; l'exception imbriquée est javax.mail.MessagingException: réponse de lecture d'exception; l'exception imbriquée est: javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: la création du chemin PKIX a échoué: Sun.security.provider.certpath.SunCertPathBuilderException: impossible de trouver un chemin de certification valide vers la cible demandée.

13
Simon

Pour que Gmail fonctionne avec TLS ou SSL:

Port pour TLS/STARTTLS: 587
Port pour SSL: 465

Les deux paramètres obligatoires sont javax.net.ssl.SSLSocketFactory, mail.smtp.socketFactory.fallback et fais mail.smtp.starttls.enable à faux.

<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>[email protected]</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="[email protected]" />
        <property name="to" value="[email protected]" />
        <property name="subject" value="Testing Subject Line for email senind.." />
        <property name="text">
            <value>
        <![CDATA[
            Dear %s,
            Mail Content : %s
        ]]>
            </value>
        </property>
    </bean>
</beans>

travaillé comme un charme !!!

5
Vinod Java JEE

La seule propriété requise pour GMail est

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

Parfois/pour la première fois, Google empêche la connexion à votre compte par une application tierce ou en utilisant votre code. lorsque vous vous connecterez à votre compte dans le navigateur, vous recevrez un message "Google empêche une tentative suspecte de vous connecter à votre compte" voir la capture d'écran ci-dessous. enter image description here

cliquez sur "Était-ce vous?" et autorisez la connexion.

4
Rakesh Soni

La configuration ci-dessous (format yaml) a fonctionné pour moi après


spring.mail:
  Host: smtp.gmail.com
  port: 465
  protocol: smtp
  username: [email protected]
  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

Voici le javaConfig qui a fonctionné pour moi:

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

Je pense que vous devez utiliser le port 587 pour que le TLS fonctionne.

2
leeor

Cela a fonctionné pour moi :

<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="[email protected]" />
    <property name="password" value="my_password" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtps.auth">true</prop>
    </props>
    </property>
</bean>

Consultez le support Google pour plus d'informations: http://support.google.com/mail/bin/answer.py?hl=en&answer=78799

1
Marc de Verdelhan

Cela ne semble pas très différent, mais essayez peut-être:

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="[email protected]" />
    <property name="password" value="XXX" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.user" value="[email protected]" />
        <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>
0
jsight

J'étais également confronté à cette exception d'authentification et cela est dû à la sécurité de Gmail. Ouvrez l'url suivante

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

et activer la fonction de sécurité moins.

0
Hemant Nagpal

Vous devez spécifier votre adresse "de", soit comme <prop key="mail.smtp.from">[email protected]</prop>, ou lors de la création d'un message.

0
axtavt

J'ai résolu votre question.

comment implémenter un service de messagerie asynchrone au printemps

Remarque, cela fonctionne sur le ressort 3, donc je ne suis pas sûr avec le ressort 2.

0
karl li