2016-07-27 105 views
6

这是应用程序的代码。我一直在尝试使用eclipse IDE来运行它。我还添加了所有必需的java邮件jar文件,即 dsn.jar,imap.jar,mailapi.jar,pop3.jar,smtp.jar,mail.jar。 但它给出了以下错误Could not connect to SMTP host: smtp.gmail.com, port: 587无法连接到SMTP主机:smtp.gmail.com,端口:587;嵌套异常是:java.net.ConnectException:连接超时:连接

没有防火墙阻止访问,因为在ping smtp.gmail.com时收到回复。 我甚至尝试了这种方式:

javax.mail.MessagingException的:无法连接到SMTP主机: smtp.gmail.com,端口:587; 嵌套的异常是: java.net.ConnectException:连接超时:连接 at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1972) 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) 在javax.mail.Transport.send0(Transport.java:194) 在javax.mail.Transport.send(Transport.java:124) 在PlainTextEmailSender.sendPlainTextEmail(PlainTextEmailSender.java:50) 在PlainTextEmailSender.main(PlainTextEmailSender.java:73) 导致:java.net.ConnectException:连接超时:连接 在java.net.DualStackPlainSocketImpl.connect0(本地方法) 在java.net.DualStackPlainSocketImpl.socketConnect(未知源) 在java.net.AbstractPlainSocketImpl.doConnect (未知来源) 在java.net.AbstractPlainSocketImpl.connectToAddress(未知来源) 在java.net.AbstractPlainSocketImpl.connect(未知来源) 在java.net.PlainSocketImpl.connect(未知来源) 在java.net.SocksSocketImpl (Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java: 319) 在com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:233) 在com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1938)

package net.codejava.mail; 

    import java.util.Date; 
    import java.util.Properties; 

    import javax.mail.Authenticator; 
    import javax.mail.Message; 
    import javax.mail.MessagingException; 
    import javax.mail.PasswordAuthentication; 
    import javax.mail.Session; 
    import javax.mail.Transport; 
    import javax.mail.internet.AddressException; 
    import javax.mail.internet.InternetAddress; 
    import javax.mail.internet.MimeMessage; 

    public class PlainTextEmailSender { 

     public void sendPlainTextEmail(String host, String port, 
       final String userName, final String password, String toAddress, 
       String subject, String message) throws AddressException, 
       MessagingException { 

      // sets SMTP server properties 
      Properties properties = new Properties(); 
      properties.put("mail.smtp.host", host); 
      properties.put("mail.smtp.port", port); 
      properties.put("mail.smtp.auth", "true"); 
      properties.put("mail.smtp.starttls.enable", "true"); 

      // creates a new session with an authenticator 
      Authenticator auth = new Authenticator() { 
       public PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication(userName, password); 
       } 
      }; 

      Session session = Session.getInstance(properties, auth); 

      // creates a new e-mail message 
      Message msg = new MimeMessage(session); 

      msg.setFrom(new InternetAddress(userName)); 
      InternetAddress[] toAddresses = { new InternetAddress(toAddress) }; 
      msg.setRecipients(Message.RecipientType.TO, toAddresses); 
      msg.setSubject(subject); 
      msg.setSentDate(new Date()); 
      // set plain text message 
      msg.setText(message); 

      // sends the e-mail 
      Transport.send(msg); 

     } 

     /** 
     * Test the send e-mail method 
     * 
     */ 
     public static void main(String[] args) { 
      // SMTP server information 
      String host = "smtp.gmail.com"; 
      String port = "587"; 
      String mailFrom = "user_name"; 
      String password = "password"; 

      // outgoing message information 
      String mailTo = "email_address"; 
      String subject = "Hello my friend"; 
      String message = "Hi guy, Hope you are doing well. Duke."; 

      PlainTextEmailSender mailer = new PlainTextEmailSender(); 

      try { 
       mailer.sendPlainTextEmail(host, port, mailFrom, password, mailTo, 
         subject, message); 
       System.out.println("Email sent."); 
      } catch (Exception ex) { 
       System.out.println("Failed to sent email."); 
       ex.printStackTrace(); 
      } 
     } 
    } 
+0

不,我没有尝试连接使用telnet客户端,但我用cmd来检查ping响应是否发送到smtp.gmail.com的ping请求。它在那里工作得很好。 –

+0

正如你所说,我已经为异常提供了完整的堆栈跟踪。如果你能帮助我,这将是一件好事。 –

+0

其实我想在我的项目中使用它,我想发送一个随机生成的用户ID和密码到特定用户的电子邮件ID。但是,这个邮件的东西不工作:/ –

回答

0

作为我说过,你的代码没有问题。如果有什么事情,只是做了一些测试,尝试删除验证部分,看看是否能工作:

public void sendPlainTextEmail(String host, String port, 
      final String userName, final String password, String toAddress, 
      String subject, String message) throws AddressException, 
      MessagingException { 

     // sets SMTP server properties 
     Properties properties = new Properties(); 
     properties.put("mail.smtp.host", host); 
     properties.put("mail.smtp.port", port); 
     properties.put("mail.smtp.auth", "true"); 
     properties.put("mail.smtp.starttls.enable", "true"); 
// *** BEGIN CHANGE 
     properties.put("mail.smtp.user", userName); 

     // creates a new session, no Authenticator (will connect() later) 
     Session session = Session.getDefaultInstance(properties); 
// *** END CHANGE 

     // creates a new e-mail message 
     Message msg = new MimeMessage(session); 

     msg.setFrom(new InternetAddress(userName)); 
     InternetAddress[] toAddresses = { new InternetAddress(toAddress) }; 
     msg.setRecipients(Message.RecipientType.TO, toAddresses); 
     msg.setSubject(subject); 
     msg.setSentDate(new Date()); 
     // set plain text message 
     msg.setText(message); 

// *** BEGIN CHANGE 
     // sends the e-mail 
     Transport t = session.getTransport("smtp"); 
     t.connect(userName, password); 
     t.sendMessage(msg, msg.getAllRecipients()); 
     t.close(); 
// *** END CHANGE 

    } 

这就是我每天都使用从我的应用程序发送几十封电子邮件的代码,它是100 %保证工作 - 当然,只要smtp.gmail.com:587是可到达的。

+0

其中* JDK *版本,你使用?源代码在java 8中工作正常,但一再使用jdk 7失败。 – ArifMustafa

+0

我使用的是Java 8,但是即使在Java 6上,该代码也应该可以工作。它几乎与每个JavaMail教程都相同。你得到@ArifMustafa有什么错误? – walen

+0

我不知道为什么不在Java 7上工作,这对我来说现在是一个很大的混乱。错误与承受的相同。 – ArifMustafa

0

电子邮件通过成功的Gmail使用JDK 7与设置下面Gmail

转到Gmail设置>帐户和导入>其他谷歌帐户设置>登录在&安全

  1. 两步骤验证:关
  2. 允许不够安全的应用:ON
  3. 应用密码:1个密码(16个字符长),以后与此替换当前密码。

使用以下Maven的依赖关系:

spring-core:4.2.2 
spring-beans:4.2.2 
spring-context:4.2.2 
spring-context-support:4.2.2 
spring-expression:4.2.2 
commons-logging:1.2 

<dependency> 
    <groupId>javax.mail</groupId> 
    <artifactId>mail</artifactId> 
    <version>1.4.7</version> 
</dependency> 

和我的源代码是:

import org.springframework.mail.javamail.JavaMailSenderImpl; 
import org.springframework.mail.javamail.MimeMessageHelper; 

import javax.mail.MessagingException; 
import javax.mail.internet.MimeMessage; 
import javax.swing.JOptionPane; 
import java.util.List; 
import java.util.Properties; 

public class Email { 

    public final void prepareAndSendEmail(String htmlMessage, String toMailId) { 

     final OneMethod oneMethod = new OneMethod(); 
     final List<char[]> resourceList = oneMethod.getValidatorResource(); 

     //Spring Framework JavaMailSenderImplementation  
     JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); 
     mailSender.setHost("smtp.gmail.com"); 
     mailSender.setPort(465); 

     //setting username and password 
     mailSender.setUsername(String.valueOf(resourceList.get(0))); 
     mailSender.setPassword(String.valueOf(resourceList.get(1))); 

     //setting Spring JavaMailSenderImpl Properties 
     Properties mailProp = mailSender.getJavaMailProperties(); 
     mailProp.put("mail.transport.protocol", "smtp"); 
     mailProp.put("mail.smtp.auth", "true"); 
     mailProp.put("mail.smtp.starttls.enable", "true"); 
     mailProp.put("mail.smtp.starttls.required", "true"); 
     mailProp.put("mail.debug", "true"); 
     mailProp.put("mail.smtp.ssl.enable", "true"); 
     mailProp.put("mail.smtp.user", String.valueOf(resourceList.get(0))); 

     //preparing Multimedia Message and sending 
     MimeMessage mimeMessage = mailSender.createMimeMessage(); 
     try { 
      MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); 
      helper.setTo(toMailId); 
      helper.setSubject("I achieved the Email with Java 7 and Spring"); 
      helper.setText(htmlMessage, true);//setting the html page and passing argument true for 'text/html' 

      //Checking the internet connection and therefore sending the email 
      if(OneMethod.isNetConnAvailable()) 
       mailSender.send(mimeMessage); 
      else 
       JOptionPane.showMessageDialog(null, "No Internet Connection Found..."); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

希望这会帮助别人。

相关问题