JPC
JPC

Reputation: 8296

Problem sending mail with javamail

I'm trying to send an email to myself using the javamail api. I've followed the code correctly that I found online but I can't seem to get it to work. The error I'm getting is:

Exception in thread "main" javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client

Does that mean my computer doesn't support authentication?

public class Emails 
{
    public static void main(String[] args) throws MessagingException
    {
        Emails e = new Emails();
        e.sendMail();
    }

    public void sendMail() throws MessagingException
    {
        boolean debug = false;
        String subject = "Testing";
        String message = "Testing Message";
        String from = "[email protected]";
        String[] recipients = {"[email protected]"};

        // create some properties and get the default Session
        Session session = getSession();
        session.setDebug(debug);

        // create a message
        Message msg = new MimeMessage(session);

        // set the from and to address
        InternetAddress addressFrom = new InternetAddress(from);
        msg.setFrom(addressFrom);

        InternetAddress[] addressTo = new InternetAddress[recipients.length]; 
        for (int i = 0; i < recipients.length; i++)
        {
            addressTo[i] = new InternetAddress(recipients[i]);
        }
        msg.setRecipients(Message.RecipientType.TO, addressTo);

        // Optional : You can also set your custom headers in the Email if you Want
        msg.addHeader("MyHeaderName", "myHeaderValue");

        // Setting the Subject and Content Type
        msg.setSubject(subject);
        msg.setContent(message, "text/plain");
        Transport.send(msg);
    }

    private Session getSession() 
    {
        Authenticator authenticator = new Authenticator();

        Properties properties = new Properties();
        properties.setProperty("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName());
        properties.setProperty("mail.smtp.auth", "true");

        properties.setProperty("mail.smtp.host", "smtp.examplehost.com");
        properties.setProperty("mail.smtp.port", "25");

        return Session.getInstance(properties, authenticator);
    }

    private class Authenticator extends javax.mail.Authenticator 
    {
        private PasswordAuthentication authentication;

        public Authenticator() 
        {
            String username = "myusername";
            String password = "mypassword";
            authentication = new PasswordAuthentication(username, password);
        }

        protected PasswordAuthentication getPasswordAuthentication() 
        {
            return authentication;
        }
    }
}

When I send emails from this server, what I have to do is, login via ssh to the server (login.server.com etc.) then I can send emails from the mail server (smtp.server.com etc.). I need to mimic this in java

RESOLVED: Use the SMTPSSLTransport class

Upvotes: 1

Views: 4291

Answers (4)

Tony BenBrahim
Tony BenBrahim

Reputation: 7300

I had the same problem and for once did not find the answer on stackoverflow. @JPC's answer however provides a (very small) clue.

Starting with javamail 1.4.3 (? see refs), javamail will refuse to send plain text credentials over an unencrypted channel. So enabling TLS transport is one solution. Another solution is to try another authentication method, if supported by the server, such as NTLM or SASL. Another solution is to revert to JavaMail 1.4.1, which has no problem sending credentials in the clear. The advantage to this is that your code does not have to change. The code in the question would work without a problem. The disadvantage is obviously that you are sending credentials in the clear, but if your Exchange admin allows it...In my case, the mail server does not support TLS, so I had no other choice.

References:

Upvotes: 2

JPC
JPC

Reputation: 8296

SMTPSSLTransport solved the problem

Upvotes: -3

lukastymo
lukastymo

Reputation: 26809

This is probably you knock to wrong port. I suppose you're using IMAP protocol: For IMAP over SSL you have to connect to Port 993

Upvotes: 1

kensen john
kensen john

Reputation: 5519

Make sure you have an smtp server (smtp.examplehost.com) to actually send the email. Make sure your smtp server allows "[email protected]" to send out emails.

These are some of the security checks put in place by standard smtp servers.

Upvotes: 1

Related Questions