Chiến Nghê
Chiến Nghê

Reputation: 776

Error when sending email via Java Mail API?

I got following error when trying to send email via Java Mail API? What does this error mean?

javax.mail.MessagingException: Exception reading response;
  nested exception is:
        java.net.SocketTimeoutException: Read timed out
javax.mail.MessagingException: Exception reading response;
  nested exception is:
        java.net.SocketTimeoutException: Read timed out
        at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2210)
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1950)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:642)
        at javax.mail.Service.connect(Service.java:317)
        at javax.mail.Service.connect(Service.java:176)
        at javax.mail.Service.connect(Service.java:125)
        at javax.mail.Transport.send0(Transport.java:194)
        at javax.mail.Transport.send(Transport.java:124)

Here is my code, i set all parameters (from, to , subjects and attachments)

public static void send(MailUtil mailUtil) throws MessagingException {
            MimeMessage message = new MimeMessage(session);
            if (props.getProperty(IConstants.DL_MAIL_CONFIGURATION.MAIL_SENDER) != null) {              
                message.setFrom(new InternetAddress(props.getProperty(IConstants.DL_MAIL_CONFIGURATION.MAIL_SENDER)));
            } else {
                message.setFrom(new InternetAddress(mailUtil.getFrom()));
            }
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(mailUtil.getTo()));
            if (mailUtil.getBcc() != null && mailUtil.getBcc().trim().length() > 0) {
                message.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(mailUtil.getBcc()));
            } else {
                message.setRecipients(Message.RecipientType.BCC,InternetAddress.parse(""));
            }

            message.setSubject(mailUtil.getSubject(), "UTF-8");

            // Check for files list and attach them.
            if (mailUtil.attachmentFiles != null && mailUtil.attachmentFiles.size() > 0) {
                Multipart multipart = new MimeMultipart();

                // Set content.
                BodyPart messageBodyPart =new MimeBodyPart();
                messageBodyPart.setContent(mailUtil.getContent(), "text/plain; charset=utf-8");
                multipart.addBodyPart(messageBodyPart);

                // Attach files.
                for (File file : mailUtil.attachmentFiles) {
                    messageBodyPart = new MimeBodyPart();
                    DataSource source = new FileDataSource(file);
                    messageBodyPart.setDataHandler(new DataHandler(source));
                    messageBodyPart.setFileName(file.getName());
                    multipart.addBodyPart(messageBodyPart);
                }

                message.setContent(multipart);
            } else {
                //message.setContent("<h1>Hello world</h1>", "text/html");
                message.setContent(mailUtil.getContent(), "text/html; charset=UTF-8");
            }           
            Transport.send(message);
    }

I just think is there any problem with my paramters?

Belows is my configuration

mail.smtp.port=465
mail.smtp.starttls.enable=true
mail.smtp.auth=true
mail.smtp.socketFactory.port=465
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
mail.smtp.timeout=25000

mail.smtp.host=smtp.gmail.com
mail.username = [email protected]
mail.password = mypassword
mail.sender = [email protected]
mail.receiver = [email protected]
mail.subject = mysubject

I am using google mail server! I dont' think there is problem there!

Belows is session initiation

final String userName = props.getProperty(IConstants.DL_MAIL_CONFIGURATION.MAIL_USERNAME);
final String passWord = props.getProperty(IConstants.DL_MAIL_CONFIGURATION.MAIL_PASSWORD);

session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(userName,
                                passWord);
                    }
            });

Upvotes: 5

Views: 42781

Answers (3)

Chiến Ngh&#234;
Chiến Ngh&#234;

Reputation: 776

I believe it absolutely relates to server configuration. When I change the port configuration from 465 to 587, it solves my problem! Anyway, thank you guy for your help!

Upvotes: 13

Typo
Typo

Reputation: 1900

I'm not sure why you use a "mail" object to setup the connection properties, instead try this, it should work, I've tested myself:

private Properties props;
props = System.getProperties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587"); 

session = Session.getInstance(props,
    new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
      });
try {
        message.setFrom(new InternetAddress("YOUR EMAIL ADDRESS HERE"));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress("RECEIVER EMAIL ADDRESS HERE"));
        message.setSubject("SUBJECT");

        message.setText("THE EMAIL TEXT");
        Transport.send(message);
    } catch (MessagingException e) {e.printStackTrace();}
}

Upvotes: 0

Bill Shannon
Bill Shannon

Reputation: 29961

Your code and configuration contain many of these common mistakes. In particular, the use of Session.getDefaultInstance may mean you're not using the configuration you think you're using. If fixing that doesn't solve your problem, post the JavaMail session debug output.

Upvotes: 0

Related Questions