2017-04-20 159 views
3

我需要使用Gmail作爲SMTP服務器從我的應用程序發送電子郵件。 這是我的郵件連接器類和我在一個單獨的屬性文件中設置的值MailConnectException:無法連接到主機,端口:smtp.gmail.com,465; timeout -1

public class EmailConnector { 


    public static Session sessionCreate() { 
     final String fromEmail = ConfigurationManager.getInstance().getProperty(EmailConfig.SENDER_EMAIL.toString()); 

     final String password = ConfigurationManager.getInstance().getProperty(EmailConfig.SENDER_PASSWORD.toString()); 

     Properties props = new Properties(); 
     props.put("mail.smtp.host", ConfigurationManager.getInstance().getProperty(EmailConfig.SMTP_HOST.toString())); 

     props.put("mail.smtp.socketFactory.port", 
       ConfigurationManager.getInstance().getProperty(EmailConfig.SSL_PORT.toString())); 

     props.put("mail.smtp.socketFactory.class", 
       ConfigurationManager.getInstance().getProperty(EmailConfig.SSL_FACTORY_CLASS.toString())); 

     props.put("mail.smtp.auth", 
       ConfigurationManager.getInstance().getProperty(EmailConfig.SMTP_AUTHENTICATION.toString())); 

     props.put("mail.smtp.port", ConfigurationManager.getInstance().getProperty(EmailConfig.SMTP_PORT.toString())); 

     Authenticator auth = new Authenticator() { 
      @Override 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(fromEmail, password); 
      } 
     }; 
     return Session.getDefaultInstance(props, auth); 
    } 
} 

屬性:

#Email send configuration 
SENDER_EMAIL = [email protected] 
SENDER_PASSWORD = abcalert321 
SMTP_HOST = smtp.gmail.com 
SSL_PORT = 465 
SMTP_AUTHENTICATION = true 
SMTP_PORT = 465 
SSL_FACTORY_CLASS = javax.net.ssl.SSLSocketFactory 

然後,我實現了一個郵件發送者類,稱爲「GroupEmail.class」

public class GroupEmail { 

    public void sendEmail() throws IOException { 
     String recipient = "[email protected]"; 

     Session session = EmailConnector.sessionCreate(); 
     /* subject of email */ 
     String emailSubject = "ABC_Alert"; 
     try { 
      MimeMessage msg = new MimeMessage(session); 
      msg.addHeader("Content-type", "text/HTML; charset=UTF-8"); 
      msg.addHeader("format", "flowed"); 
      msg.addHeader("Content-Transfer-Encoding", "8bit"); 

      msg.setFrom(new InternetAddress("[email protected]", "ABC Alerts")); 

      msg.setReplyTo(InternetAddress.parse("[email protected]")); 

      msg.setSubject(emailSubject, "UTF-8"); 

      msg.setSentDate(new Date()); 
      /* buyer email address */ 
      msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient)); 

      /* Create the message body part */ 
      msg.setText("A new Test-Alert from AB_Alerts"); 

      /* Send message */ 
      Transport.send(msg, "[email protected]", "abcalert321"); 

     } catch (MessagingException | UnsupportedEncodingException e) { 
      SystemLogger.logErrorMessege(this, e); 
     } 
    } 

} 

畢竟我在需要觸發郵件發送的地方調用「GroupEmail.class」。

GroupEmail groupEmail = new GroupEmail(); 
     groupEmail.sendEmail(); 

我在本地主機上使用Tomcat v8服務器,當應用程序工作時,我得到了下面的異常。

98656 [http-nio-8080-exec-9] ERROR it.codegen.rnd.cgalert.notification.template.email.GroupEmail - Couldn't connect to host, port: smtp.gmail.com, 465; timeout -1 
com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.gmail.com, 465; timeout -1; 
    nested exception is: 
    java.net.SocketException: Permission denied: connect 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2100) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:699) 
    at javax.mail.Service.connect(Service.java:388) 
    at javax.mail.Service.connect(Service.java:246) 
    at javax.mail.Service.connect(Service.java:195) 
    at javax.mail.Transport.send0(Transport.java:254) 
    at javax.mail.Transport.send(Transport.java:124) 
..more 

回答

0

我知道這是一個非常晚的答案,但希望當我面臨着同樣的問題,並試圖幾乎Java核心郵件API,Apache郵件API和Spring也爲MimeMessage分享我的經驗。

我用Java JDK 1.7.0_80嘗試了50次以上,並且因上述異常而反覆失敗,於是我轉移到了JDK 1.8.0_151。

現在,在說明源代碼之前,我想分享我的配置。

轉到Gmail>Settings>Other Google Account settingsAccounts and Import>Sign-in & security下。

允許不夠安全的應用:OFF(指我的應用程序是不是不太安全)

的兩步驗證:關

應用密碼(點擊它,谷歌將產生一個16字符長的密碼爲你,後來做,用這個16字符長的密碼(沒有任何空間))更改你的gmail密碼)。現在

Google Generated App Password

,我的源代碼是:

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

     JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); 
     mailSender.setHost("smtp.gmail.com"); 
     mailSender.setPort(465); 

     mailSender.setUsername(String.valueOf(resourceList.get(0))); 
     mailSender.setPassword(String.valueOf(resourceList.get(1))); 

     //from email id and password 
     System.out.println("Username is : " + String.valueOf(resourceList.get(0)).split("@")[0]); 
     System.out.println("Password is : " + String.valueOf(resourceList.get(1))); 

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

     MimeMessage mimeMessage = mailSender.createMimeMessage(); 
     try { 
      MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); 
      helper.setTo(toMailId); 
      helper.setSubject("Welcome to Subject Part"); 
      helper.setText(htmlMessage, true); 

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

    } 

} 

,並在下面說Spring mail調試測井公司:

Username is : exampleusername 
Password is : abcdefghijklmnop 
DEBUG: JavaMail version 1.6.0 
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers 
DEBUG: Tables of loaded providers 
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]} 
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]} 
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map 
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle] 
DEBUG SMTP: useEhlo true, useAuth true 
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true 
220 smtp.gmail.com ESMTP 12sm62330270pfr.147 - gsmtp 
DEBUG SMTP: connected to host "smtp.gmail.com", port: 465 

EHLO Administrator 
250-smtp.gmail.com at your service, [157.48.195.205] 
250-SIZE 35882577 
250-8BITMIME 
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH 
250-ENHANCEDSTATUSCODES 
250-PIPELINING 
250-CHUNKING 
250 SMTPUTF8 
DEBUG SMTP: Found extension "SIZE", arg "35882577" 
DEBUG SMTP: Found extension "8BITMIME", arg "" 
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH" 
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 
DEBUG SMTP: Found extension "PIPELINING", arg "" 
DEBUG SMTP: Found extension "CHUNKING", arg "" 
DEBUG SMTP: Found extension "SMTPUTF8", arg "" 
DEBUG SMTP: STARTTLS requested but already using SSL 
DEBUG SMTP: protocolConnect login, host=smtp.gmail.com, [email protected], password=<non-null> 
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 
DEBUG SMTP: Using mechanism LOGIN 
DEBUG SMTP: AUTH LOGIN command trace suppressed 
DEBUG SMTP: AUTH LOGIN succeeded 
DEBUG SMTP: use8bit false 
MAIL FROM:<[email protected]> 
250 2.1.0 OK 12sm62330270pfr.147 - gsmtp 
RCPT TO:<[email protected]> 
250 2.1.5 OK 12sm62330270pfr.147 - gsmtp 
DEBUG SMTP: Verified Addresses 
DEBUG SMTP: [email protected] 
DATA 
354 Go ahead 12sm62330270pfr.147 - gsmtp 
Date: Mon, 19 Feb 2018 18:55:29 +0530 (IST) 
To: [email protected] 
Message-ID: <[email protected]> 
Subject: Welcome to Subject Part 
MIME-Version: 1.0 
Content-Type: multipart/mixed; 
    boundary="----=_Part_0_1884507527.1519046720984" 

------=_Part_0_1884507527.1519046720984 
Content-Type: multipart/related; 
    boundary="----=_Part_1_1634862487.1519046721031" 

------=_Part_1_1634862487.1519046721031 
Content-Type: text/html; charset=us-ascii 
Content-Transfer-Encoding: 7bit 

<!DOCTYPE html> 
<html> 
Your html page source code is here 
</html> 

------=_Part_1_1634862487.1519046721031-- 

------=_Part_0_1884507527.1519046720984-- 
. 
250 2.0.0 OK 1519046738 12sm62330270pfr.147 - gsmtp 
DEBUG SMTP: message successfully delivered to mail server 
QUIT 
221 2.0.0 closing connection 12sm62330270pfr.147 - gsmtp 

也請檢查您的網絡連接,防病毒設置和防火牆對於不間斷的訪問,希望這將有助於許多人浪費時間。

相關問題