2012-04-04 10 views
4

Ok, ich weiß nicht, was ich sonst tun soll. Dieser Code funktionierte vor einer Woche perfekt, als ich ihn schrieb und testete. Dann habe ich es in mein Programm eingebettet und realisiert, dass ich immer Ausnahmen bekomme. Alles scheint normal zu sein. Die Absenderadresse ist echt. Die Empfängeradressen, mit denen ich sie getestet habe, sind echt. Was ist falsch? Ich bin so frustriert:JavaMail - Absenderadresse abgelehnt: Zugriff verweigert

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

Die Ausnahme ist somit:

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 

Jede Hilfe am meisten geschätzt werden würde. Vielen Dank!

Antwort

4

findet schließlich eine Behelfslösung aus (obwohl ich kann immer noch nicht verstehen, warum in erster Linie ein Problem gibt, wie die Codes sehen gewohnt zu arbeiten. Anyways ...)

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; 

Sie‘ ll feststellen, dass der Hauptunterschied zwischen den Codes in der Frage, und diese sind:

Transport.send(msg); 

und

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

Es stellte sich heraus, dass ein Objekt Transport erstellt und mit den richtigen Anmeldeinformationen (Portnummer, Benutzername, Kennwort und Mailserver) verbunden werden musste.

Auch habe ich einen Prozess der Beseitigung und fand heraus, dass, solange Sie dies:

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

Sie dies nicht benötigen:

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

Die oben als auch sein könnte :

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

Wie auch immer, das ist die Antwort. Sie können diese Antwort auch für Google Mail ändern. Stellen Sie sicher, dass Sie den Postausgangsserver in Google Mail sowie die Absenderadresse, den Benutzernamen und das Passwort ändern, und es wird Ihnen gut gehen :)