我正在运行Java Web应用程序并尝试从中发送电子邮件通知。当我们在我们的一台服务器上托管这个应用程序时,它工作得很好。我们将它指向端口25上的smtp.gmail.com以及我们能够发送的消息。
但是现在我们在我们客户的一台服务器上托管这个用于安全目的。它们恰好阻止所有smtp域,只允许自己(SMTPRELAY.COMPANYNAME.COM)。我在代码中更改了主机,但现在身份验证失败了。
在使用该公司的中继服务器发送电子邮件时,是否仍可以对我的Gmail帐户进行身份验证?什么是最好的解决方案?
以下是代码的相关部分。
content = "message content";
List<String> recipients = LIST_OF_RECIPIENT_EMAIL_ADDRESSES;
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "SMTPRELAY.COMPANYNAME.COM");
props.put("mail.smtp.port", "25");
props.put("mail.smtp.ssl.trust", "SMTPRELAY.COMPANYNAME.COM");
props.put("mail.debug", "true");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
//This is where the email account name and password are set
return new PasswordAuthentication("SUPPORTEMAILACCOUNT@gmail.com", "PASSWORD");
}
});
try{
MimeMessage message = new MimeMessage(session);
message.setReplyTo(new Address[]{new InternetAddress("no-reply@gmail.com")});
for(String recipient: recipients){
message.addRecipient(Message.RecipientType.BCC,new InternetAddress(recipient));
}
message.setSubject(subject);
message.setContent(content,"text/html");
Transport.send(message);
return true;
}catch (MessagingException mex) {
mex.printStackTrace();
return false;
}
以下是我不断收到的错误:
javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful
答案 0 :(得分:4)
事实证明公司中继smtp服务器可以在没有身份验证的情况下使用任何拥有其域名的欺骗性电子邮件地址(例如ANYUSERNAME@COMPANYNAME.COM)。因此,对smtp.gmail.com进行身份验证的需求没有实际意义。
仍然好奇是否可以在通过另一个发送实际消息时对阻止的smtp进行身份验证。但我的问题已经解决了。
如果您很好奇如何在没有身份验证的情况下发送电子邮件,那么有许多地方可以查找如何执行此操作,但基本上只需更改原始问题中的代码:
props.put("mail.smtp.auth", "true");
.
.
.
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(email+"@"+domain, password);
}
});
将以上部分更改为以下内容:
props.put("mail.smtp.auth", "false");
.
.
.
Session session = Session.getInstance(props);