Javax.mail.messagingexception 530 5.7.0 must issue a starttls command first

The author voluntarily contributed this tutorial as a part of Pepipost Write to Contribute program.

Introduction

You probably using JavaMail API to compose, write and read emails. The core classes of JavaMail API can be found in the javax.mail and javax.mail.activation packages. While JavaMail API provides a protocol-independent, platform-independent environment for sending and receiving emails but like any other tools, there are few scenarios where the error comes and the developers get stuck.

In this tutorial, we are going to discuss the most commonly occurring JavaMail SMTP errors and a step by step detailed guide on how to solve them.

Before listing possible errors, let's go through one of the most useful JavaMail API property you can use to debug SMTP issues. 

Set
Properties props = new Properties();
props.put("mail.debug", "true");

Or if you are using javax.mail.Authenticator()

Session.setDebug(true);

Note: At the end of this tutorial, you will find a working code for sending SMTP emails using java mail API and it's corresponding output in debug mode.

You can use the JavaMail API for triggering multiple important events. These events can be a welcome/notification email, forgot password, etc. If you are using JavaMail API for sending SMTP emails, you might end up facing the following errors on your IDE or console.

Error 1: Could not connect to SMTP host: com.sun.mail.util.MailConnectException: Couldn't connect to host🔗

Exception in thread "main" java.lang.RuntimeException: com.sun.mail.util.MailConnectException: Couldn't connect to host, port:

There can be multiple reasons for this but the most common reason for this error is the port, that you are using to send SMTP mails. Few ISPs/hosting providers block SMTP outgoing port 25. If that the case, try changing the port to 587 or 2525.

Try;

 telnet <SMTPHOST> portnumber

If this works, then this means that your port is open.

Error 2: A1 BAD Invalid SASL argument🔗

This error mainly occurs when you try to configure SSL Connection with SMTP host in wrong way.

javax.mail.MessagingException: A1 BAD Invalid SASL argument. t21mb170186760ivm;

nested exception is:

com.sun.mail.iap.BadCommandException: A1 BAD Invalid SASL argument. t21mb170186760ivm

Previously Java Mail API (up to JavaMail 1.3) didn’t have built-in support for SSL connection, so it was necessary to set socketFactory properties:

Properties props = new Properties();
props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");

From the later version of Java Mail API (greater than 1.3).

The easiest way to enable SSL support in current versions of JavaMail is to set the property "mail.smtp.ssl.enable" to "true".

props.put("mail.smtp.ssl.enable", "true");

Once this is enabled, you are ready to use SSL for authentication.

Error 3: Using Authenticator just to supply username and password 🔗

The above error may occur due to wrong imports or handling of javax.mail.authenticator.

There is nothing wrong in using authenticator, but its unnecessarily complex and hard to debug. Instead to avoid error and for saving time use connect method that takes username password when connecting to a Store. And use the static Transport.send method that takes a username and password while sending a message.

Transport.send(msg, user, password);

Error 4: You may get Empty multipart Error While Sending Attachment 🔗

Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: IOException while sending message;
      			nested exception is:
			java.io.IOException: javax.mail.MessagingException: Empty multipart: multipart/mixed; 
			boundary="----=_Part_0_1480010240.1564228079924"

This error may occur when you are not properly embedding attachment in a standard defined way.

A simple solution to this is to make sure to add MIMEBODYPART class object into the Multipart Class object using addBodyPart(multipart) method

Here is a code snippet:

Multipart multipart = new MimeMultipart();
MimeBodyPart attachmentPart = new MimeBodyPart();
 try {
 attachmentPart.attachFile("H:\7-5-2017statement.pdf");
 multipart.addBodyPart(attachmentPart);
 } catch (IOException e) {
 e.printStackTrace();
 }
 message.setContent(multipart);

If you send an attachment as above it may happen that your mail is not delivered, due to security constraints maintained at public ESP’s Gmail or Yahoo.

Better First Create File object and then pass to MimeBodyPart.

Find below code snippet:

Multipart multipart = new MimeMultipart();
 MimeBodyPart attachmentPart = new MimeBodyPart();
 try {
 File f =new File("H:\7-5-2017statement.pdf");
 attachmentPart.attachFile(f);
 multipart.addBodyPart(attachmentPart);
 } catch (IOException e) {
 e.printStackTrace();
 }
 message.setContent(multipart);

Error 5: It may happen that you're not using the configuration you think you're using. 🔗

You must create a Session object using Session.getInstance instead of Session.getDefaultInstance. Because Session.getDefaultInstance creates a new session with properties that are passed to it for the first time and subsequent calls return the original session that is created the first time and ignores the properties that are passed in subsequent calls.

If there is another code in JVM or app server that creates a session object, you may end up using that object and your properties will be ignored.

To verify whether you are using the correct properties, verify the output properties on the console using;

System.out.println(session.getProperty(username));

To avoid this problem better use;

Session.getInstance

Here is code snippet for sending SMTP mails using java mail API and corresponding output in debug mode.

Maven Dependencies:

  • Add this in pom.xml
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
 import java.util.Properties;
 import javax.mail.Message;
 import javax.mail.MessagingException;
 import javax.mail.PasswordAuthentication;
 import javax.mail.Session;
 import javax.mail.Transport;
 import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 public class App
 {
 public static void main( String[] args )
 {
 // Put recipient’s address
 String to = "[email protected]";
 // Put sender’s address
 String from = "[email protected]";
 final String username = "username";//username generated by Pepipost
 final String password = "password";//password generated by Pepipost
 // Paste host address from the SMTP relay tab in Integrations from your Pepipost App
 String host = "smtp.pepipost.com";
 Properties props = new Properties();
 props.put("mail.smtp.auth", "true");
 //props.put("mail.smtp.starttls.enable", "true");
 props.put("mail.smtp.host", host);
 props.put("mail.smtp.port", "587");
 // Get the Session object.
 Session session = Session.getInstance(props,
 new javax.mail.Authenticator() {
 protected PasswordAuthentication getPasswordAuthentication() {
 return new PasswordAuthentication(username, password);
 }
 });
 session.setDebug(true);
 try {
 // Create a default MimeMessage object.
 Message message = new MimeMessage(session);
 // Set From: header field
 message.setFrom(new InternetAddress(from));
 // Set To: header field
 message.setRecipients(Message.RecipientType.TO,
 InternetAddress.parse(to));
 // Set Subject: header field
 message.setSubject("My first message with JavaMail");
 // Put the content of your message
 message.setText("Hi there, this is my first message sent with JavaMail");
 // Send message
 System.out.println("Sending msg");
 Transport.send(message);
 System.out.println("Sent message successfully....");
 } catch (MessagingException e) {
 throw new RuntimeException(e);
 }
 }
 }
 

Sample Output of using in debug mode:

DEBUG: setDebug: JavaMail version 1.4.4
 Sending msg
 DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
 DEBUG SMTP: useEhlo true, useAuth true
 DEBUG SMTP: useEhlo true, useAuth true
 DEBUG SMTP: trying to connect to host "smtp.pepipost.com", port 587, isSSL false
 220 ESMTP SMTPNY-LB1 Ready
 DEBUG SMTP: connected to host "smtp.pepipost.com", port: 587
 EHLO 192.168.0.10
 250-smtpny-lb1.pepipost.com
 250-PIPELINING
 250-SIZE 50000000
 250-VRFY
 250-ETRN
 250-STARTTLS
 250-AUTH PLAIN LOGIN
 250-AUTH=PLAIN LOGIN
 250-ENHANCEDSTATUSCODES
 250-8BITMIME
 250 DSN
 DEBUG SMTP: Found extension "PIPELINING", arg ""
 DEBUG SMTP: Found extension "SIZE", arg "50000000"
 DEBUG SMTP: Found extension "VRFY", arg ""
 DEBUG SMTP: Found extension "ETRN", arg ""
 DEBUG SMTP: Found extension "STARTTLS", arg ""
 DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN"
 DEBUG SMTP: Found extension "AUTH=PLAIN", arg "LOGIN"
 DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
 DEBUG SMTP: Found extension "8BITMIME", arg ""
 DEBUG SMTP: Found extension "DSN", arg ""
 DEBUG SMTP: Attempt to authenticate
 DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
 AUTH LOGIN
 334 VXNlcm5hbWU6
 cmlzaGFiaG1pc2hyYTEzMQ==
 334 UGFzc3dvcmQ6
 U3VtbWVyQDIwMTk=
 235 2.7.0 Authentication successful
 DEBUG SMTP: use8bit false
 MAIL FROM:<[email protected]>
 250 2.1.0 Ok
 RCPT TO:<[email protected]>
 250 2.1.5 Ok
 DEBUG SMTP: Verified Addresses
 DEBUG SMTP: [email protected]
 DATA
 354 End data with <CR><LF>.<CR><LF>
 From: [email protected]
 To: [email protected]
 Message-ID: <[email protected]>
 Subject: Tttachment My first message with JavaMail
 MIME-Version: 1.0
 Content-Type: text/plain; charset=us-ascii
 Content-Transfer-Encoding: 7bit
 Hi there, this is my first message sent with JavaMail
 .
 250 2.0.0 Ok: queued as 042C9D87
 QUIT
 221 2.0.0 Bye
 Sent message successfully....
 

How do you solve must issue Starttls command first?

Must issue a STARTTLS command first. nv2sm4478384pbb.6. ... .
You need to add the following line: props.put("mail.smtp.starttls.enable", "true"); ... .
Dupe of stackoverflow.com/questions/10509699/… ... .
possible duplicate of Must issue a STARTTLS command first. ... .
see my answer here: stackoverflow.com/questions/26774057/… maybe it'll help..

What is mail SMTP Starttls enable?

StartTLS is a protocol command used to inform the email server that the email client wants to upgrade from an insecure connection to a secure one using TLS or SSL. StartTLS is used with SMTP and IMAP, while POP3 uses the slightly different command for encryption, STLS.

What is a Starttls command?

STARTTLS is an email protocol command that tells an email server that an email client, including an email client running in a web browser, wants to turn an existing insecure connection into a secure one.

How do I enable Starttls in PHP?

12 years ago.
Download the Certificate X.509 (PEM format) from a web browser, I used Firefox. I put the name webcert.crt..
Create the folder c:\openldap\sysconf..
Copy the file webcert.crt to c:\openldap\sysconf..
With notepad you must create the file c:\openldap\sysconf\ldap.conf file. ... .
The code:.