【问题标题】:I don't get the e-mail using this code. What is the problem?我没有收到使用此代码的电子邮件。问题是什么?
【发布时间】:2011-09-30 08:49:22
【问题描述】:

以下是我正在尝试发送电子邮件的程序。代码没有错误,我没有得到任何运行时异常。但该代码无法发送电子邮件。我已经对这段代码进行了很多修改,但不知道实际出了什么问题。 发件人和收件人都有 GMail 帐户。发件人已禁用两步验证过程。 (我认为这对接收者来说并不重要。是吗?)

代码:

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

class tester {
   public static void main(String args[]) {
      Properties props = new Properties();
      props.put("mail.smtp.host" , "smtp.gmail.com");
      props.put("mail.stmp.user" , "username"); // username or complete address ! Have tried both
      Session session  = Session.getDefaultInstance( props , null);
      String to = "me@gmail.com";
      String from = "from@gmail.com";
      String subject = "Testing...";
      Message msg = new MimeMessage(session);
         try {
           msg.setFrom(new InternetAddress(from));
           msg.setRecipient(Message.RecipientType.TO , new InternetAddress(to));
           msg.setSubject(subject);
           msg.setText("Working fine..!");
           System.out.println("fine!!??");
         }  catch(Exception exc) {
                System.out.println(exc);
            }
    }
}

【问题讨论】:

  • 用wireshark记录流量,只是为了了解问题是在发送方还是在接收方

标签: java gmail jakarta-mail


【解决方案1】:

首先,您忘记致电Transport.send() 发送您的MimeMessage

其次,GMail 需要配置为使用 TLS 或 SSL 连接。以下内容需要添加到您的Properties (props):

//To use TLS
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");

//To use SSL
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");

要连接到 GMail SMTP,请使用 Transport.connect() 方法。我看到你的代码中根本没有使用任何Transport,所以添加这个:

Transport transport = session.getTransport();

//Connect to GMail
transport.connect("smtp.gmail.com", 465, "USERNAME_HERE", "PASSWORD_HERE");
transport.send(msg);

或者,您可以通过包含javax.mail.Authenticator 作为参数来创建Session

例子:

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

希望对你有帮助。

资源:

【讨论】:

  • 在添加这些并添加语句props.put("mail.smtp.password", "password")之后;我得到以下异常 javax.mail.AuthenticationFailedException: failed to connect, no password specified? 为什么我会得到这个?
  • 在 transport.connect() 调用中指定用户名和密码:
  • @maximdim 产生相同的异常。我确实喜欢这个Transport transport = session.getTransport("smtp"); transport.connect("smtp.gmail.com", "username", "password"); Transport.send(msg);
  • @精英绅士 我得到了同样的例外。编辑您的帖子以在 getTransport() 的参数中包含 "smtp"
  • @Suhail Gupta,我不必这样做,因为(如果我正确配置我的属性,我可以这样做 session.getTransport()
【解决方案2】:

好吧,您的代码实际上并没有尝试发送消息。看看Transport.send

这里有一些例子:

【讨论】:

  • 是的。在Transport.send() 之后,我在运行时遇到此异常com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. c5sm1092784p bh.94
猜你喜欢
  • 2012-03-05
  • 2013-07-31
  • 2011-10-10
  • 2014-09-27
  • 1970-01-01
  • 2015-11-16
  • 2021-12-31
  • 2018-06-01
  • 2013-04-26
相关资源
最近更新 更多