通过中继服务器用 Java 发送电子邮件

Sun*_*nga 2 java email smtp

我正在运行 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;
      }
Run Code Online (Sandbox Code Playgroud)

这是我不断收到的错误:

javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful
Run Code Online (Sandbox Code Playgroud)

Sun*_*nga 6

事实证明,公司中继 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);
            }
          });
Run Code Online (Sandbox Code Playgroud)

将上述部分更改为以下内容:

props.put("mail.smtp.auth", "false");
.
.
.
Session session = Session.getInstance(props);
Run Code Online (Sandbox Code Playgroud)