通过 Java 邮件 API 发送电子邮件时出错?

Error when sending email via Java Mail API?

尝试通过 Java 邮件 API 发送电子邮件时出现以下错误?这个错误是什么意思?

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)

这是我的代码,我设置了所有参数(从、到、主题和附件)

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);
    }

我只是觉得我的参数有问题吗?

下面是我的配置

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 = username@gmail.com
mail.password = mypassword
mail.sender = sender@gmail.com
mail.receiver = receiver@gmail.com
mail.subject = mysubject

我正在使用 google 邮件服务器!我认为那里没有问题!

下面是会话初始化

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);
                    }
            });

我不确定你为什么使用 "mail" 对象来设置连接属性,而不是试试这个,它应该工作,我已经测试过自己:

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();}
}

您的代码和配置包含其中许多 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

我相信这绝对与服务器配置有关。 当我将端口配置从 465 更改为 587 时,它解决了我的问题! 无论如何,谢谢你的帮助!