我正在使用javax.mail系統,並遇到「無效地址」異常的問題。這裏的代碼的基礎知識:當地址正常時,使用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 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提供的身份驗證信息。
感謝您的線索,以提示我也看看郵件服務器的一面。
這將有助於瞭解報告爲無效的電子郵件地址的一些示例。或者至少是他們的格式。 – 2008-10-27 15:08:59