JavaMail - 发件人地址被拒绝:访问被拒绝
问题描述:
好吧,我不知道还有什么要做。这段代码在一周前编写和测试时效果很好。然后我将其嵌入到我的程序中,并意识到我一直在收到例外。一切似乎都正常。发件人地址是合法的。我用来测试它的收件人地址是合法的。哪里不对?我很沮丧:JavaMail - 发件人地址被拒绝:访问被拒绝
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);
例外情况是这样的:
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
任何帮助将非常感激。谢谢!
答
终于想出了一个变通(虽然我仍然无法理解为什么有摆在首位的问题,看到曾经工作过的代码。反正...)
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;
你”会发现,在这个问题的代码和这些的之间的主要区别是:
Transport.send(msg);
和
Transport transport = session.getTransport("smtps");
transport.connect(outgoingMailServer, 465, emailUserName, emailPassword);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
原来,必须使用正确的凭据(端口号,用户名,密码和邮件服务器)创建并连接一个Transport
对象。
而且,我做了一个淘汰过程,结果发现,只要你有这样的:
Transport transport = session.getTransport("smtps");
transport.connect(outgoingMailServer, 465, emailUserName, emailPassword);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
你不需要这样的:
Authenticator authenticator = new SMTPAuthentication();
Session session = Session.getDefaultInstance(properties, authenticator);
上述可能以及是:
Session session = Session.getDefaultInstance(properties, null);
无论如何,这就是答案。你也可以改变这个答案的Gmail。只要确保将发送邮件服务器更改为Gmail,以及从电子邮件地址,用户名和密码,你就会很好:)