无法使用javax.mail发送到Gmail SMTP

时间:2012-10-12 12:51:58

标签: java

我想使用Gmail的SMTP服务器发送邮件。你能告诉我为什么在运行波纹管代码时它不会连接到服务器。

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;

public class SendTrick {

  public static void main(String[] args) {
    Properties props = new Properties();
    props.put("mail.smtp.host", "465");
    props.put("mail.from", "example@gmail.com");
    props.put("mail.smtp.host", "smtp.gmail.com");
    Session session = Session.getInstance(props, null);

    try {
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom();
        msg.setRecipients(Message.RecipientType.TO,
                          "ex@gmail.com");
        msg.setSubject("JavaMail hello world example");
        msg.setText("Hello, world!\n");
        Transport.send(msg);
    } catch (MessagingException mex) {
        System.out.println("send failed, exception: " + mex);
    }
  }
} 

日志中的例外是

  

发送失败,异常:javax.mail.MessagingException:无法发送    连接到SMTP主机:smtp.gmail.com,port:25;嵌套异常是:       java.net.ConnectException:连接被拒绝:连接

2 个答案:

答案 0 :(得分:3)

您没有设置mail.smtp.port,因为属性mail.smtp.host上存在重复拼写错误,因此正在使用默认端口25,详见“例外”。

GMail的SMTP未在端口25上运行,这就是拒绝连接的原因。从Set up POP in mail clients开始,它看起来应该是465或587,因此您有一个有效值,但属性键不正确。

修改

您需要为端口使用正确的属性键

props.put("mail.smtp.port", "465"); // <-- use the word "port", not "host"

修复此问题后,您还可能会发现身份验证问题,如评论中所述,除非您故意遗漏了问题中的javax.mail.Authenticator代码。

编辑2:

正如我所提到的,您可能需要指定其他属性才能成功通过SMTP服务器进行身份验证并获得授权,例如:

props.put("mail.smtp.starttls.enable", "true");

但是,由于您使用端口465进行SSL连接,因此您还需要指定其他SSL属性,例如mail.smtp.socketFactory.class

答案 1 :(得分:0)

执行以下步骤:

  1. 在电子邮件中禁用“两因素验证”
  2. 导航至:“ https://myaccount.google.com/lesssecureapps?pli=1”并打开“访问安全性较低的应用程序”
  3. 下载JavaMail API“ https://www.oracle.com/technetwork/java/javamail/index-138643.html”并将其添加到您的库中

代码

import java.util.Properties;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class email_try {
 public static void main(String ap[]) {
  String myEmail = "YOUR EMAIL";
  String password = "YOUR PASSWORD";
  String opponentEmail = "THEIR EMAIL";
  Properties pro = new Properties();
  pro.put("mail.smtp.host", "smtp.gmail.com");
  pro.put("mail.smtp.starttls.enable", "true");
  pro.put("mail.smtp.auth", "true");
  pro.put("mail.smtp.port", "587");
  Session ss = Session.getInstance(pro, new javax.mail.Authenticator() {
   @Override
   protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(myEmail, password);
   }
  });
  try {
   Message msg = new MimeMessage(ss);
   msg.setFrom(new InternetAddress(myEmail));
   msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(opponentEmail));
   msg.setSubject("Your Wish");
   msg.setText("java email app");
   Transport trans = ss.getTransport("smtp");
   Transport.send(msg);
   System.out.println("message sent");
  } catch (Exception e) {
   System.out.println(e.getMessage());
  }
 }
}

请尝试此代码并输入正确的电子邮件ID和密码