Exception in sending emails from java application : Relaying denied

16,188

Solution 1

The smtp server that you are trying to send the mail to is rejecting to relay. If it is your own local server that is not a problem, you may change configurations to relay mails from your mydomain.net . But if it is an external server (gmail for example), you have to use a real registered domain.

To test your code against a mail server, I recommend you to setup a dockerized Apache James Server, create some test users on it and send and receive emails.

Solution 2

This JavaMail FAQ entry should help:

Solution 3

Working code,

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

    }

}
Share:
16,188
Rahul Agrawal
Author by

Rahul Agrawal

I am having more than 8 years of software development experience into different technologies and frameworks as Masters in Java, J2EE (Struts 1.x, Struts 2, Spring (All Modules), Hibernate, iBATIS, Wicket, Tapestry). I also have working knowledge of C#.Net, ASP.NET, ADO.NET, PHP.

Updated on June 04, 2022

Comments

  • Rahul Agrawal
    Rahul Agrawal almost 2 years

    We are using Spring Mail to send emails from java application org.springframework.mail.javamail.JavaMailSenderImpl

    Spring Email Configuration is

    <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 code snapshot is

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

    Property files

    test.email.host=mail.mydomain.net
    test.email.port=2525
    [email protected]
    test.email.password=mypassword
    

    But we are below exception, and email is not being sent

    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 <[email protected]>... Relaying denied