2012-04-04 125 views
4

好吧,我不知道还有什么要做。这段代码在一周前编写和测试时效果很好。然后我将其嵌入到我的程序中,并意识到我一直在收到例外。一切似乎都正常。发件人地址是合法的。我用来测试它的收件人地址是合法的。哪里不对?我很沮丧: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 

任何帮助将非常感激。谢谢!

回答

4

终于想出了一个变通(虽然我仍然无法理解为什么有摆在首位的问题,看到曾经工作过的代码。反正...)

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,以及从电子邮件地址,用户名和密码,你就会很好:)