Я использую систему 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");
, который заставит API javax.mail выполнить аутентификацию при входе. А затем используйте фактический экземпляр 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){
Не форсируя аутентификацию, почтовый сервер увидел меня как несанкционированный ретранслятор и просто отключил меня. Разница между «работающими» адресами и адресами, которые не работали, заключалась в том, что «работающие» адреса были локальными для почтового сервера. Поэтому он просто принял их. Но для любых нелокальных «ретранслируемых» адресов оно отклонило бы сообщение, потому что моя информация для аутентификации не была представлена API javax.mail, когда я думал, что это будет.
Спасибо за подсказки, побуждающие меня взглянуть и на сторону почтового сервера.