我正在使用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已经呈现了我的身份验证信息,但实际上没有。谢谢你提供提示,促使我查看邮件服务器方面的问题。