Исключение при отправке электронных писем из Java-приложения: ретрансляция запрещена
Мы используем Spring Mail для отправки писем из java-приложения org.springframework.mail.javamail.JavaMailSenderImpl
Настройка Spring Email
<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
4 ответа
Сервер SMTP, на который вы пытаетесь отправить почту, отклоняется для ретрансляции. Если это ваш собственный локальный сервер, который не является проблемой, вы можете изменить настройки для ретрансляции почты с вашего mydomain.net. Но если это внешний сервер (например, gmail), вы должны использовать реальный зарегистрированный домен.
Чтобы протестировать ваш код на почтовом сервере, я рекомендую вам настроить докер-сервер Apache James Server, создать на нем несколько тестовых пользователей и отправлять и получать электронную почту.
Эта запись FAQ по JavaMail должна помочь:
Рабочий код,
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();
}
}
Насколько я знаю, ваш почтовый сервис должен быть внутри вашей производственной сферы. Вы не можете попасть на SMTP-сервер Prod извне этой сферы. по крайней мере, так было с проблемой, с которой я столкнулся.