从java应用程序发送电子邮件时出现exception:拒绝中继

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

Spring Email Configuration是

       true    

Java代码快照是

  @Autowired(required = true) @Qualifier("errorMessageMailSender") JavaMailSenderImpl mailSender; .............. .............. try { MimeMessage mailMessage = buildEmailMimeMessage(properties,mimeMultipart); logger.info(String.format("Built MimeMessage object is ",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 ... Relaying denied 

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

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

此JavaMail FAQ条目应该有所帮助:

  • 当我尝试发送消息时,为什么我会收到javax.mail.SendFailedException:550无法转发我的地址?

工作代码,

 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(); } } 

据我所知,您的电子邮件服务必须在您的生产领域内。 你无法从该球体外部击中prod smtp服务器。 至少那是我遇到的问题的情况。

Interesting Posts