【问题标题】:JavaMail - Sender Address rejected: Access DeniedJavaMail - 发件人地址被拒绝:访问被拒绝
【发布时间】:2012-04-04 06:15:25
【问题描述】:

好吧,我不知道还能做什么。一周前,当我编写和测试这段代码时,它运行得非常好。然后我将它嵌入到我的程序中,并意识到我不断收到异常。一切似乎都很正常。发件人地址是合法的。我用来测试它的收件人地址是合法的。怎么了?我很沮丧:

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

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: java jakarta-mail yahoo-mail


    【解决方案1】:

    终于想出了一个解决方法(虽然我仍然不明白为什么首先会出现问题,因为代码过去可以工作。无论如何......)

    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,以及发件人电子邮件地址、用户名和密码,就可以了 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      相关资源
      最近更新 更多