簡體   English   中英

Java 郵件異常錯誤;

[英]Java Mail Exception Error;

我的代碼:

import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendMailTLS {
public static void main(String[] args) {
    final String username = "myemailid@gmail.com";
    final String password = "myemailpassword";
    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", "587");
    Session session = Session.getInstance(props,
      new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
      });

    try {
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("myemailid@gmail.com"));
        message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse("myfriedemail@ymail.com"));
        message.setSubject("Testing Subject");
        message.setText("Dear Mail Crawler,"+
 "\n\n No spam to my email,please!"); 
        Transport.send(message);
        System.out.println("Done");
    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }
}
}

我的錯誤:

線程“main”中的異常 java.lang.RuntimeException: javax.mail.MessagingException:
未知 SMTP 主機:smtp.gmail.com;
嵌套異常是:
java.net.UnknownHostException: smtp.gmail.com
在 Mail.SendMailTLS.main(SendMailTLS.java:56)
引起:javax.mail.MessagingException:未知 SMTP 主機:smtp.gmail.com;
嵌套異常是:
java.net.UnknownHostException: smtp.gmail.com
在 com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1970)
在 com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:642)
在 javax.mail.Service.connect(Service.java:317)
在 javax.mail.Service.connect(Service.java:176)
在 javax.mail.Service.connect(Service.java:125)
在 javax.mail.Transport.send0(Transport.java:194)
在 javax.mail.Transport.send(Transport.java:124)
在 Mail.SendMailTLS.main(SendMailTLS.java:51)
引起:java.net.UnknownHostException:smtp.gmail.com
在 java.net.PlainSocketImpl.connect(PlainSocketImpl.java:177)
在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
在 java.net.Socket.connect(Socket.java:525)
在 java.net.Socket.connect(Socket.java:475)
在 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)
... 還有 7 個
Java 結果:1

我的本地代理為 172.17.0.4:8080 ,用戶名為: user1 ,密碼為: user2
解決方案??

試試這個服務器:

smtp.googlemail.com

如果您使用代理,我認為您不能使用 Java 郵件。

來自: oracle.com

問:如何配置 JavaMail 以通過我的代理服務器工作?

A:JavaMail目前不支持通過web代理服務器訪問郵件服務器。 使用代理服務器的主要原因之一是允許來自 corporate.network 的 HTTP 請求通過公司防火牆。 防火牆通常會阻止對 Inte.net 的大部分訪問,但會允許來自代理服務器的請求通過。 此外,corporate.network 內部的郵件服務器將為 email 執行類似的 function,通過 SMTP 接收消息並將它們轉發到 Inte.net 上的最終目的地,並接收傳入消息並將它們發送到適當的內部郵件服務器。


更新

問:如何配置 JavaMail 以通過我的代理服務器工作? [更新!]

A:從JavaMail 1.6.0開始,JavaMail支持通過web代理服務器訪問郵件服務器。 為代理服務器設置“mail.protocol.proxy.host”和“mail.protocol.proxy.port”屬性。 通過設置“mail.protocol.proxy.user”和“mail.protocol.proxy.password”屬性支持代理服務器 BASIC 身份驗證。

此外,如果您的代理服務器支持 SOCKS V4 或 V5 協議( http://www.socks.nec.com/aboutsocks.html,RFC1928 )並允許匿名連接,並且您使用的是 JDK 1.5 或更新版本和 JavaMail 1.4 .5 或更新版本,您可以按照 com.sun.mail.smtp package 的 javadoc 中所述設置“mail.smtp.socks.host”屬性,在每個會話、每個協議的基礎上配置 SOCKS 代理。 “imap”和“pop3”協議存在類似的屬性。 JDK 通過設置“java.net.socks.username”和“java.net.socks.password”系統屬性(並因此應用於所有 SOCKS 連接)來支持 SOCKS 服務器的身份驗證,如 JDK 網絡屬性文檔中所述.

如果您使用的是舊版本的 JDK 或 JavaMail,您可以告訴 Java 運行時將所有 TCP 套接字連接定向到 SOCKS 服務器。 有關 socksProxyHost 和 socksProxyPort 屬性的最新文檔,請參閱網絡屬性指南。 這些是系統級屬性,而不是 JavaMail session 屬性。 它們可以在調用應用程序時從命令行設置,例如:java -DsocksProxyHost=myproxy...。此工具可用於將 SMTP、IMAP 和 POP3 通信從 JavaMail 定向到 SOCKS 代理服務器。 請注意,設置這些屬性會將所有 TCP sockets 定向到 SOCKS 代理,這可能會對應用程序的其他方面產生負面影響。

當使用舊版本的 JavaMail 並且沒有這樣的 SOCKS 服務器時,如果您想使用 JavaMail 間接訪問防火牆外的郵件服務器,您可以使用一個程序,例如通過 HTTP 代理服務器連接到隧道 TCP 連接。 配置 JavaMail 以使用連接實例作為 SOCKS 服務器。

發生這種情況是因為 Gmail 安全...只需允許通過應用程序 go 訪問您的 gmail 帳戶到您的帳戶下: https://www.google.com/settings/security/lesssecureapps它將工作.. smtp.882639848088916 正確.不需要改變它。

也不要忘記檢查 inte.net 連接。

你能試試props.put("mail.smtp.host", "gmail.com"); 沒有 smtp.gmail.com

僅出於開發目的,您可以嘗試通過代理打開隧道到 smtp.gmail.com

proxytunnel -q -p proxy_host:proxy_port -d smtp.gmail.com:465 -a local_port

並在您的代碼中使用

props.put("mail.smtp.host", "localhost");
props.put("mail.smtp.port", "local_port");

當您將 javamail 升級到 1.6.2 時它工作正常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM