【问题标题】:Error in sending email through SMTP通过 SMTP 发送电子邮件时出错
【发布时间】:2015-02-21 06:24:12
【问题描述】:

我正在尝试使用 gmail 作为 SMTP 通过 Java 代码发送电子邮件。但得到如下异常。你能告诉我为什么找不到gmail主机吗?我在办公网络中工作,不确定是否有防火墙阻止它发送。如果有,出路是什么?

Exception in thread "main" com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.gmail.com, 586; timeout -1;
  nested exception is:
    java.net.UnknownHostException: smtp.gmail.com
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2053)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:697)
    at javax.mail.Service.connect(Service.java:364)
    at javax.mail.Service.connect(Service.java:245)
    at mail.JavaEmail.sendEmail(JavaEmail.java:72)
    at mail.JavaEmail.main(JavaEmail.java:22)
Caused by: java.net.UnknownHostException: smtp.gmail.com

Java 源代码:

package mail;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
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 JavaEmail
{
    Session mailSession;

    public static void main(String args[]) throws AddressException,    MessagingException
    {
        JavaEmail javaEmail = new JavaEmail();
        javaEmail.setMailServerProperties();
        javaEmail.draftEmailMessage();
        javaEmail.sendEmail();
    }

    private void setMailServerProperties()
    {
        Properties emailProperties = System.getProperties();
        emailProperties.put("mail.smtp.port", "586");
        emailProperties.put("mail.smtp.auth", "true");
        emailProperties.put("mail.smtp.starttls.enable", "true");
        mailSession = Session.getDefaultInstance(emailProperties, null);
    }

    private MimeMessage draftEmailMessage() throws AddressException, MessagingException
    {
        String[] toEmails = { "to-mail@gmail.com" };
        String emailSubject = "Test email subject";
        String emailBody = "This is an email sent by JAVA Code";
        MimeMessage emailMessage = new MimeMessage(mailSession);
        /**
         * Set the mail recipients
         * */
        for (int i = 0; i < toEmails.length; i++)
        {
            emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmails[i]));
        }
        emailMessage.setSubject(emailSubject);
        /**
         * If sending HTML mail
         * */
        emailMessage.setContent(emailBody, "text/html");
        /**
         * If sending only text mail
         * */
        //emailMessage.setText(emailBody);// for a text email
        return emailMessage;
    }

    private void sendEmail() throws AddressException, MessagingException
    {
        /**
         * Sender's credentials
         * */
    String fromUser = "from-user@gmail.com";
        String fromUserEmailPassword = "*****";

        String emailHost = "smtp.gmail.com";
        Transport transport = mailSession.getTransport("smtp");
        transport.connect(emailHost, fromUser, fromUserEmailPassword);
        /**
         * Draft the message
         * */
        MimeMessage emailMessage = draftEmailMessage();
        /**
         * Send the mail
         * */
        transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
        transport.close();
        System.out.println("Email sent successfully.");
    }
}

【问题讨论】:

标签: java email


【解决方案1】:

您连接到错误的端口。 Google 的 TLS SMTP 服务器是 587。您可以在此处查看更多信息:http://email.about.com/od/accessinggmail/f/Gmail_SMTP_Settings.htm

【讨论】:

  • 即使使用 TLS 端口为 587 也会收到相同的错误消息
【解决方案2】:

这可能对你有帮助

Properties props = new Properties();   
        props.setProperty("mail.transport.protocol", "smtp");   
        props.setProperty("mail.host", mailhost);   
        props.put("mail.smtp.auth", "true");   
        props.put("mail.smtp.port", "465");   
        props.put("mail.smtp.socketFactory.port", "465");   
        props.put("mail.smtp.socketFactory.class",   
                "javax.net.ssl.SSLSocketFactory");   
        props.put("mail.smtp.socketFactory.fallback", "false");   
        props.setProperty("mail.smtp.quitwait", "false");   

        session = Session.getDefaultInstance(props, this);

【讨论】:

    【解决方案3】:

    以下代码可以帮助您解决问题,它的工作......

    import java.util.*;
    import javax.mail.*;
    import javax.mail.internet.*;
    
    public class Email {
    
    private static String USER_NAME = "username";  // GMail user name (just the part before "@gmail.com")
    private static String PASSWORD = "password"; // GMail password
    
    private static String RECIPIENT = "xxxxx@gmail.com";
    
    public static void main(String[] args) {
    String from = USER_NAME;
    String pass = PASSWORD;
    String[] to = { RECIPIENT }; // list of recipient email addresses
    String subject = "Java send mail example";
    String body = "hi ....,!";
    
    sendFromGMail(from, pass, to, subject, body);
    }
    
    private static void sendFromGMail(String from, String pass, String[] to, String subject, String body) {
    Properties props = System.getProperties();
    String host = "smtp.gmail.com";
    
    props.put("mail.smtp.starttls.enable", "true");
    
    props.put("mail.smtp.ssl.trust", host);
    props.put("mail.smtp.user", from);
    props.put("mail.smtp.password", pass);
    props.put("mail.smtp.port", "587");
    props.put("mail.smtp.auth", "true");
    
    
    Session session = Session.getDefaultInstance(props);
    MimeMessage message = new MimeMessage(session);
    
    try {
    
    
        message.setFrom(new InternetAddress(from));
        InternetAddress[] toAddress = new InternetAddress[to.length];
    
        // To get the array of addresses
        for( int i = 0; i < to.length; i++ ) {
            toAddress[i] = new InternetAddress(to[i]);
        }
    
        for( int i = 0; i < toAddress.length; i++) {
            message.addRecipient(Message.RecipientType.TO, toAddress[i]);
        }
    
    
    
        message.setSubject(subject);
        message.setText(body);
    
    
        Transport transport = session.getTransport("smtp");
    
    
        transport.connect(host, from, pass);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    
    }
    catch (AddressException ae) {
        ae.printStackTrace();
    }
    catch (MessagingException me) {
        me.printStackTrace();
      }
     }
    } 
    

    【讨论】:

    • com.sun.mail.util.MailConnectException:无法连接到主机,端口:smtp.gmail.com,587;超时-1;嵌套异常是:java.net.UnknownHostException: smtp.gmail.com
    • 是我的办公室防火墙导致了这个问题吗?
    • 问题似乎是因为防火墙限制。我尝试将我的办公室前景作为 STMP 服务器,现在我可以连接但无法发送。线程“主”com.sun.mail.smtp.SMTPSendFailedException 中的异常:550 5.7.1 客户端无权在 com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2202) 处作为此发件人发送com.sun.mail.smtp.SMTPTransport.finishData(SMTPTransport.java:1980) 在 com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1197)
    【解决方案4】:

    我有同样的问题。将主机 smtp.gmail.com 更改为 ip 74.125.133.109,现在它运行良好。

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 2013-03-12
      • 2013-09-30
      • 1970-01-01
      • 2014-02-21
      • 2016-07-18
      • 2019-05-06
      • 2013-08-22
      相关资源
      最近更新 更多