JavaMail - Sender Address rejected: Access Denied

匿名 (未验证) 提交于 2019-12-03 02:50:02

问题:

Ok, I don't know what else to do. This code worked perfectly fine a week ago when I wrote and tested it. Then I embedded it into my program and realised I kept getting exceptions. Everything seems normal. The sender address is legit. The recipient addresses I used to test it are legit. What is wrong? I'm so frustrated:

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

The exception is thus:

javax.mail.SendFailedException: Invalid Addresses;   nested exception is:     com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 <blank@yahoo.com>: 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 <blank@yahoo.com>: Sender address rejected: Access denied      at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1733)     ... 5 more 

Any help would be most appreciated. Thanks!

回答1:

Finally figured out a work-around (though I still can't understand why there's a problem in the first place, seeing as the codes used to work. 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; 

You'll find that the main difference between the codes in the question and these ones are:

Transport.send(msg); 

and

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

Turns out, a Transport object had to be created and connected using the proper credentials (port number, username, password, and mail server).

Also, I did a process of elimination and found out that as long as you have this:

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

you don't need this:

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

The above could as well be:

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

Anyway, that's the answer. You can also alter this answer for gmail. Just be sure to change the outgoing mail server to gmail's, as well as the from email address, username and password, and you'll be just fine :)



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!