我正在使用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没有提供我的身份验证信息.
感谢提示我查看邮件服务器方面的线索.
- 更新:身份验证问题.
好的,这是我发现的事情.接收电子邮件时,上面的代码正确设置了身份验证,并且实际调用了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没有提供我的身份验证信息.
感谢提示我查看邮件服务器方面的线索.