当前位置:  开发笔记 > 编程语言 > 正文

当地址正常时,使用javax.mail获取无效地址

如何解决《当地址正常时,使用javax.mail获取无效地址》经验,为你挑选了1个好方法。

我正在使用javax.mail系统,并遇到"无效地址"异常的问题.以下是代码的基础知识:

    // Get system properties
    Properties props = System.getProperties();

    // Setup mail server
    props.put("mail.smtp.host", m_sending_host);

    // Get session
    Session session = Session.getDefaultInstance(props, new Authenticator(){
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(m_sending_user, m_sending_pass);
        }
    });


    // Define message
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(m_sending_from));
    message.addRecipient(Message.RecipientType.TO, 
        new InternetAddress(vcea.get(i).emailaddr));
    message.setSubject( replaceEnvVars(subject) );
    message.setText(replaceEnvVars(body));

    // Send message
    try {
        Transport.send(message);
    } catch (Exception e){
        Log.Error("Error sending e-mail to addr (%s): %s",
                vcea.get(i).emailaddr, e.getLocalizedMessage() );

    }

问题是上面的代码确实有效.但是对于我知道有效的某些电子邮件地址(因为我可以通过标准电子邮件客户端发送给他们),上述代码在尝试发送时会抛出"无效地址"异常.

任何线索或提示将不胜感激.

- 更新:身份验证问题.

好的,这是我发现的事情.接收电子邮件时,上面的代码正确设置了身份验证,并且实际调用了Authenticator.getPasswordAuthentication()回调.

发送电子邮件时不是这样.你必须做更多.添加这个:

    // Setup mail server
    props.put("mail.smtp.host", m_sending_host);
    props.put("mail.smtp.auth", "true");

这将强制javax.mail API执行登录身份验证.然后使用实际的Transport实例而不是静态的.send()方法:

    Transport t = session.getTransport(m_sending_protocol);
    t.connect(m_sending_user, m_sending_pass);

...

        // Send message
        try {
            t.sendMessage(message, message.getAllRecipients());
        } catch (Exception e){

在没有强制进行身份验证的情况下,邮件服务器将我视为未经授权的中继,并将我关闭."工作"的地址与没有工作的地址之间的区别在于"工作"的地址都是邮件服务器本地的.因此,它只是接受了它们.但是对于任何非本地"中继"地址,它会拒绝该消息,因为我认为javax.mail API没有提供我的身份验证信息.

感谢提示我查看邮件服务器方面的线索.



1> Steven M. Ch..:

- 更新:身份验证问题.

好的,这是我发现的事情.接收电子邮件时,上面的代码正确设置了身份验证,并且实际调用了Authenticator.getPasswordAuthentication()回调.

发送电子邮件时不是这样.你必须做更多.添加这个:

// Setup mail server
props.put("mail.smtp.host", m_sending_host);
props.put("mail.smtp.auth", "true");

这将强制javax.mail API执行登录身份验证.然后使用实际的Transport实例而不是静态的.send()方法:

Transport t = session.getTransport(m_sending_protocol);
t.connect(m_sending_user, m_sending_pass);

...

    // Send message
    try {
        t.sendMessage(message, message.getAllRecipients());
    } catch (Exception e){

在没有强制进行身份验证的情况下,邮件服务器将我视为未经授权的中继,并将我关闭."工作"的地址与没有工作的地址之间的区别在于"工作"的地址都是邮件服务器本地的.因此,它只是接受了它们.但是对于任何非本地"中继"地址,它会拒绝该消息,因为我认为javax.mail API没有提供我的身份验证信息.

感谢提示我查看邮件服务器方面的线索.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有