Search code examples
javajakarta-mail

Cannot send email without authentication required


I wrote a simple Java program that uses Java Mail API to send an email.

 public static void main(String[] args) {

        System.out.println("SimpleEmail Start");

        String smtpHostServer = "smtp.gmail.com";
        String emailID = "[email protected]";

        Properties props = System.getProperties();

        props.put("mail.smtp.host", smtpHostServer);
        props.put("mail.smtp.starttls.enable", "true");





        Session session = Session.getInstance(props, null);

        EmailUtil.sendEmail(session, emailID,"SimpleEmail Testing Subject", "SimpleEmail Testing Body");
    }

}

EmailUtil class:

public class EmailUtil {


    /**
     * Utility method to send simple HTML email
     * @param session
     * @param toEmail
     * @param subject
     * @param body
     */
    public static void sendEmail(Session session, String toEmail, String subject, String body){
        try
        {
            MimeMessage msg = new MimeMessage(session);
            //set message headers
            msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
            msg.addHeader("format", "flowed");
            msg.addHeader("Content-Transfer-Encoding", "8bit");

            msg.setFrom(new InternetAddress("[email protected]", "NoReply-JD"));

            msg.setReplyTo(InternetAddress.parse("[email protected]", false));

            msg.setSubject(subject, "UTF-8");

            msg.setText(body, "UTF-8");

            msg.setSentDate(new Date());

            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
            System.out.println("Message is ready");
            Transport.send(msg);

            System.out.println("EMail Sent Successfully!!");
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }





}

With this implementation, it is said I do not need any password at all so i gave this a tried and it tells me:

com.sun.mail.smtp.SMTPSendFailedException: 530-5.5.1 Authentication Required

I got this code from an online resources and from what I read,it should be able to send without authentication.

So my question is, do I always need to set a username and password to send mail using JAVA mail?

If no, what am I doing wrong?


Solution

  • Once upon a time you could use any mail server to send emails to any email address you wanted.

    And then came SPAM. Spammers also could use any mail server to send emails to any email address - and as a mail server operator you do not want spammers to use your server for sending emails (because operating the server costs you money, because your mail server can get blacklisted for spamming).

    So today most mail servers require that you

    • either provide authentication (for sending emails to any email address you want)
    • or are only allowed to send emails to email addresses hosted by the mail server operator

    Google even has two distinct mail servers:

    • one that requires authentication, that can be used for sending emails to any email address you want (that is the server at smtp.gmail.com)
    • one that doesn't require authentication, that can only be used for sending emails to Gmail or G Suite users (that is the server aspmx.l.google.com)

    It could be that your source dates back to a time when no authentication was required or that the mail server in your source was only used for sending mails to addresses that are hosted at the mail server.

    Either way - if you want to use the server smtp.gmail.com for sending mails to any address you must authenticate (or convince google that they should allow you - and only you - to sending emails without authentication, but then: how will google know that it is exactly you who is trying to send mails?)