2

我正在尝试使用以下方法从我的程序发送电子邮件:

    void sendEmails(Tutor t, Date date, Time time, String tuteeName, String tuteeEmail){
    System.out.println("sending emails");
    Properties props = new Properties();
    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", "465");

            SimpleDateFormat timeFmt =  new SimpleDateFormat("hh:mm a");
            SimpleDateFormat dateFmt =  new SimpleDateFormat("EEE, MMMM dd");         
            String datePrint = dateFmt.format(date);
            String timePrint = timeFmt.format(time);                
            Session session = Session.getInstance(props,
      new javax.mail.Authenticator() {
                   @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
      });

            try {

        Message tutorMessage = new MimeMessage(session);

        tutorMessage.setFrom(new InternetAddress("laneycodingclub@gmail.com"));

        tutorMessage.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse(t.getEmail()));

        tutorMessage.setSubject("Tutoring Appointment Scheduled");
        tutorMessage.setText("Hey " + t.getName() + 
                            "\n \t You have a new appointment scheduled on "  + datePrint + " at " + timePrint + 
                            "with " + tuteeName + ". \n If you cannot make this appointment, please contact club leadership immediately. "
                            + "\n Thanks for helping out!");

        Transport.send(tutorMessage);

        System.out.println("Done sending");

    } catch (MessagingException e) {
                    System.out.println("messagingerror");
                    e.printStackTrace();
    }
}

但是当程序到达这个方法时,GUI 锁定并且程序冻结。这是我第一次尝试在 Java 程序中使用电子邮件,所以我不确定问题在哪里。

4

3 回答 3

1

想通了:465 是通过 SSL 使用 gmail 发送电子邮件时使用的正确端口。但是,使用 TLS 时,正确的端口是 587。

于 2013-03-16T03:58:20.273 回答
1

您最好避免同步发送电子邮件。

通常它会减慢您的应用程序的工作,更糟糕的是 - 它可能会冻结它,例如如果邮件服务器无法访问或没有响应。

使用一些异步机制。

我确信在这种情况下你的邮件服务器有问题。

使用一些独立的 Java 程序来确保您可以使用这些服务器参数发送电子邮件。

于 2013-03-16T04:22:14.200 回答
0

如果您从 GUI 中的事件处理程序调用此方法,则只要该函数尚未完成,您就有效地阻塞了 Swing 工作线程。在 Swing 中(或在 SWT 中)的每个 GUI 处理都在一个线程中完成,因此当您阻塞线程时,GUI 无法更新,即冻结。

您永远不应该在 GUI 线程中运行长时间运行的作业。相反,您应该创建一个新线程并从中调用您的函数。

于 2013-03-16T03:58:29.807 回答