【问题标题】:Exception in sending emails from java application : Relaying denied从 java 应用程序发送电子邮件时出现异常:中继被拒绝
【发布时间】:2014-03-19 23:57:30
【问题描述】:

我们正在使用 Spring Mail 从 java 应用程序发送电子邮件 org.springframework.mail.javamail.JavaMailSenderImpl

Spring 电子邮件配置是

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl" autowire-candidate="default">
        <property name="host" value="${test.email.host}" />
        <property name="port" value="${test.email.port}" />
        <property name="username" value="${test.email.username}" />
        <property name="password" value="${test.email.password}" />
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>

            </props>
        </property>
    </bean>

Java 代码快照是

    @Autowired(required = true)
    @Qualifier("errorMessageMailSender")
    JavaMailSenderImpl mailSender;

    ..............
    ..............

          try {
                MimeMessage mailMessage = buildEmailMimeMessage(properties,mimeMultipart);
                logger.info(String.format("Built MimeMessage object is <%s>",mailMessage));
                if (mailMessage != null) {
                    mailSender.send(mailMessage);
                    logger.info("Mail sent Successfully");
                }else{
                    logger.info("Mail send failed as Mail message object construction failed.");
                }
                result=true;
            } catch (Exception e) {
                logger.error("An exception occurred while sending mail :: " + e.getMessage());
            }

属性文件

test.email.host=mail.mydomain.net
test.email.port=2525
test.email.username=demo@mydomain.net
test.email.password=mypassword

但我们处于例外状态,并且没有发送电子邮件

An exception occurred while sending mail :: Failed messages: javax.mail.SendFailedException: Invalid Addresses;
  nested exception is:
    com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 <demo@mydomain.net>... Relaying denied

【问题讨论】:

  • 查看gammadyne.com/relaying_denied.htm,google的第一个结果
  • 这是一个 SMTP 问题,不是 Java 问题...
  • 如果我将用户名和密码属性保留为空白,smtp auth 属性是否设置为 true,会导致此问题吗?

标签: java spring smtp jakarta-mail emailrelay


【解决方案1】:

您尝试发送邮件的 smtp 服务器拒绝中继。如果您自己的本地服务器没有问题,您可以更改配置以中继来自 mydomain.net 的邮件。但如果是外部服务器(例如gmail),则必须使用真实的注册域。

要针对邮件服务器测试您的代码,我建议您设置一个 dockerized Apache James 服务器,在其上创建一些测试用户并发送和接收电子邮件。

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      工作代码,

      import java.util.Properties;
      
      import javax.mail.Message;
      import javax.mail.MessagingException;
      import javax.mail.Session;
      import javax.mail.Transport;
      import javax.mail.internet.AddressException;
      import javax.mail.internet.InternetAddress;
      import javax.mail.internet.MimeMessage;
      
      public class JavaEmail {
      
          Properties emailProperties;
          Session mailSession;
          MimeMessage emailMessage;
      
          public static void main(String args[]) throws AddressException,
                  MessagingException {
      
              JavaEmail javaEmail = new JavaEmail();
      
              javaEmail.setMailServerProperties();
              javaEmail.createEmailMessage();
              javaEmail.sendEmail();
          }
      
          public void setMailServerProperties() {
      
              String emailPort = "587";//gmail's port
      
              emailProperties = System.getProperties();
              emailProperties.put("mail.smtp.port", emailPort);
              emailProperties.put("mail.smtp.auth", "true");
              emailProperties.put("mail.smtp.starttls.enable", "true");
      
          }
      
          public void createEmailMessage() throws AddressException,
                  MessagingException {
              String[] toEmails = { "enter to mail ids" };
              String emailSubject = "Java Email";
              String emailBody = "This is an email sent by JavaMail api.";
      
              mailSession = Session.getDefaultInstance(emailProperties, null);
              emailMessage = new MimeMessage(mailSession);
      
              for (int i = 0; i < toEmails.length; i++) {
                  emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmails[i]));
              }
      
              emailMessage.setSubject(emailSubject);
              emailMessage.setContent(emailBody, "text/html");//for a html email
              //emailMessage.setText(emailBody);// for a text email
      
          }
      
          public void sendEmail() throws AddressException, MessagingException {
      
              String emailHost = "smtp.gmail.com";
              String fromUser = "enter from Id";//ignore gmail domain
              String fromUserEmailPassword = "enter password";
      
              Transport transport = mailSession.getTransport("smtp");
      
              transport.connect(emailHost, fromUser, fromUserEmailPassword);
              transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
              transport.close();
      
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        据我所知,您的电子邮件服务必须在您的生产范围内。您不能从该领域之外访问 prod smtp 服务器。至少我遇到的问题是这样的。

        【讨论】:

          猜你喜欢
          • 2018-01-22
          • 2014-06-29
          • 1970-01-01
          • 2017-04-17
          • 1970-01-01
          • 1970-01-01
          • 2018-10-17
          • 2011-12-16
          相关资源
          最近更新 更多