JavaMail - Adresse de l'expéditeur rejetée: Accès refusé


Ok, je ne sais pas quoi faire d'autre. Ce code a parfaitement fonctionné il y a une semaine lorsque je l'ai écrit et testé. Ensuite, je l'ai intégré dans mon programme et j'ai réalisé que je continuais à obtenir des exceptions. Tout semble normal. L'adresse de l'expéditeur est légitime. Les adresses de destinataire que j'ai utilisées pour le tester sont légitimes. Quel est le problème? Je suis tellement frustré:

private String outgoingMailServer = "smtp.mail.yahoo.com";

boolean debug = true;

            //set the host outgoing mail smtp server.
            Properties properties = new Properties();
            properties.put("mail.smtp.host", outgoingMailServer);
            properties.put("mail.smtp.auth", "true");

            Authenticator authenticator = new SMTPAuthentication();
            Session session = Session.getDefaultInstance(properties, authenticator);

            session.setDebug(debug);

            //create a message session
            Message msg = new MimeMessage(session);

            //set the addresses, to and from
            InternetAddress fromAddress;
            fromAddress = new InternetAddress(emailFromAddress);
            msg.setFrom(fromAddress);

            //since mail can be sent to more than one recipient, create loop
            //to add all addresses into InternetAddress, addressTo.
            //InternetAddress[] toAddress = new InternetAddress[recipients.length];
            InternetAddress[] toAddress = new InternetAddress[recipients.size()];
            for (int i = 0; i < recipients.size(); i++) {
                toAddress[i] = new InternetAddress(recipients.get(i));
            }
            msg.setRecipients(Message.RecipientType.TO, toAddress);

            //set the subject and content type
            msg.setSubject(emailSubject);
            msg.setContent(actualMessage, "text/html; charset=utf-8");

            //send the email
            Transport.send(msg);

L'exception est donc:

javax.mail.SendFailedException: Invalid Addresses;
  nested exception is:
    com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 <[email protected]>: Sender address rejected: Access denied

    at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1835)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1098)
    at javax.mail.Transport.send0(Transport.java:195)
    at javax.mail.Transport.send(Transport.java:124)
    at internalLogicEngine.LogicEngine.sendReminder(LogicEngine.java:4282)
    at testPackage.Test.main(Test.java:169)
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 <[email protected]>: Sender address rejected: Access denied

    at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1733)
    ... 5 more

Toute aide serait la plus appréciée. Merci!

Author: Akinwale Agbaje, 2012-04-04

1 answers

A finalement trouvé un contournement (bien que je ne comprenne toujours pas pourquoi il y a un problème en premier lieu, vu que les codes fonctionnaient. De toute façon...)

private String outgoingMailServer = "smtp.mail.yahoo.com";    
boolean debug = false;

//set the host outgoing mail smtp server.
Properties properties = new Properties();
properties.put("mail.smtp.host", outgoingMailServer);
properties.put("mail.smtps.auth", "true");

Authenticator authenticator = new SMTPAuthentication();
Session session = Session.getDefaultInstance(properties, authenticator);
session.setDebug(debug);

//create a message session
Message msg = new MimeMessage(session);

//set the addresses, to and from
InternetAddress fromAddress;
fromAddress = new InternetAddress(emailFromAddress);
msg.setFrom(fromAddress);

//since mail can be sent to more than one recipient, create loop
//to add all addresses into InternetAddress, addressTo.
//InternetAddress[] toAddress = new InternetAddress[recipients.length];
InternetAddress[] toAddress = new InternetAddress[recipients.size()];
for (int i = 0; i < recipients.size(); i++) {
    toAddress[i] = new InternetAddress(recipients.get(i));
}
msg.setRecipients(Message.RecipientType.TO, toAddress);

//set the subject and content type
msg.setSubject(emailSubject);
msg.setContent(actualMessage, "text/html; charset=utf-8");

//send the email
Transport transport = session.getTransport("smtps");
transport.connect(outgoingMailServer, 465, emailUserName, emailPassword);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();

//email sent
//note, this does not necessarily mean the email was delivered. The
//sysetm has no control over that
emailSent = true;

Vous constaterez que la principale différence entre les codes de la question et ceux-ci sont:

Transport.send(msg);

Et

Transport transport = session.getTransport("smtps");
transport.connect(outgoingMailServer, 465, emailUserName, emailPassword);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();

Il s'avère qu'un objet Transport devait être créé et connecté en utilisant les informations d'identification appropriées (numéro de port, nom d'utilisateur, mot de passe et serveur de messagerie).

Aussi, j'ai fait un processus d'élimination et découvert que tant que vous avez ceci:

Transport transport = session.getTransport("smtps");
transport.connect(outgoingMailServer, 465, emailUserName, emailPassword);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();

Vous n'avez pas besoin de ceci:

Authenticator authenticator = new SMTPAuthentication();
Session session = Session.getDefaultInstance(properties, authenticator);

Ce qui précède pourrait aussi bien être:

Session session = Session.getDefaultInstance(properties, null);

De toute façon, c'est la réponse. Vous pouvez également modifier cette réponse pour gmail. Assurez-vous simplement de changer le serveur de messagerie sortant en gmail, ainsi que l'adresse e-mail, le nom d'utilisateur et le mot de passe de from, et tout ira bien:)

 4
Author: Akinwale Agbaje, 2015-06-18 13:16:46