Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaMail - javax.mail.MessagingException

I am trying to write a simple mail sender class that would receive a bunch of arguments and using those will send an email out using our Exchange 2010 server. While authentication etc. seem to work fine, I am getting the following exception when the code is actually trying to send the email (I think). I have ensured that the authentication is working and I get a transport back from the session, but still it fails. Could anyone shed some like on what I am doing wrong or missing? Thanks.

Exception:

javax.mail.MessagingException: [EOF]
       at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1481)
       at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1512)
       at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1054)
       at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:634)
       at javax.mail.Transport.send0(Transport.java:189)
       at javax.mail.Transport.send(Transport.java:140)
       at com.ri.common.mail.util.MailSender.sendHTMLEmail(MailSender.java:75)
       at com.ri.common.mail.util.MailSender.main(MailSender.java:106)

Relevant code:

import java.util.Properties;

import javax.mail.Authenticator;
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 MailSender
{
    public static void sendHTMLEmail( String fromEmailId, String toEmailId, String host, String hostUserName,
            String hostPassword, String mailSubject, String mailBody )
    {
        // Get system properties.
        Properties props = System.getProperties();
        // Setup mail server
        props.put( "mail.transport.protocol", "smtp" );
        props.put( "mail.smtp.host", host );
        props.put( "mail.smtp.auth", "true" );

        final String hostUName = hostUserName;
        final String hPassword = hostPassword;

        Authenticator authenticator = new Authenticator()
        {
            protected PasswordAuthentication getPasswordAuthentication()
            {
                return new PasswordAuthentication( hostUName, hPassword );
            }
        };

        // Get the default Session object.
        Session session = Session.getDefaultInstance( props, authenticator );

        try
        {
            // Create a default MimeMessage object.
            MimeMessage message = new MimeMessage( session );

            // Set From: header field of the header.
            message.setFrom( new InternetAddress( fromEmailId ) );

            // Set To: header field of the header.
            message.addRecipient( Message.RecipientType.TO, new InternetAddress( toEmailId ) );

            // Set Subject: header field
            message.setSubject( mailSubject );

            // Send the actual HTML message, as big as you like
            message.setContent( mailBody, "text/html" );

            // Send message
            Transport.send( message, message.getAllRecipients() );
            System.out.println( "Sent message successfully...." );
        }
        catch( Exception mex )
        {
            mex.printStackTrace();
        }

    }

    public static void main( String[] args )
    {

        String to = "[email protected]";
        String from = "[email protected]";
        String host = "correctHostForExch2010";
        String user = "correctUser";
        String password = "CorrectPassword";
        String subject = "Test Email";
        String body = "Hi there. This is a test email!";

        MailSender.sendHTMLEmail( from, to, host, user, password, subject, body );
    }
}

EDIT: I turned on debugging and it says

MAIL FROM:<[email protected]> 530 5.7.1 Client was not authenticated 
DEBUG SMTP: got response code 530, with response: 530 5.7.1 Client was not authenticated. 

Why would that be when the session authentication succeded?

like image 493
legendofawesomeness Avatar asked Sep 06 '12 19:09

legendofawesomeness


2 Answers

Thanks Alex and Bill. I got it working by enabling the following property.

props.put("mail.smtp.starttls.enable", "true");
like image 68
legendofawesomeness Avatar answered Sep 29 '22 11:09

legendofawesomeness


Two possibilities:

  1. It's not actually trying to authenticate because of your use of Session.getDefaultInstance.
  2. It's not authenticating because it's not finding any authentication mechanisms that both the client and server support, possibly because the server wants you to use SSL before sending any authentication information. Try setting "mail.smtp.starttls.enable" to "true".

If we could see more of your debug output, we could tell you which one of these is the case.

like image 24
Bill Shannon Avatar answered Sep 29 '22 10:09

Bill Shannon