Java Mail:使用TLS通过gmail发送电子邮件

时间:2012-06-08 08:35:53

标签: java email gmail javamail

我正在尝试使用我的java应用程序发送简单的电子邮件,但是当我执行发送邮件时,我只能在控制台上获得“220 2.0.0准备启动TLS”,之后什么都不会发生。 这是方法代码:

try
    {
        /** Recipient address **/
        String messageRecipient = "@live.com";

        String pass = "";
        /** sender address **/
        String messageSender = "@gmail.com";

        /** get my properties **/
        Properties properties = System.getProperties();
        properties.put("mail.smtp.auth", "true");
        properties.put("mail.smtp.starttls.enable", "true");
        properties.put("mail.smtp.host", "smtp.gmail.com");
        properties.put("mail.smtp.user", messageSender);
        properties.put("mail.smtp.password",  pass);
        properties.put("mail.debug", "true");
        properties.put("mail.smtp.debug", "true");
        properties.put("mail.smtp.port", "587");

        /** get default session object **/
        Session session = Session.getDefaultInstance(properties,// null);
                new javax.mail.Authenticator()
        {
            protected PasswordAuthentication getPasswordAuthentication()
            {
                return new PasswordAuthentication("@gmail.com", "");
            }
        });

        try
        {
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(messageSender));

            //set to: header field of the header
            message.addRecipient(Message.RecipientType.TO, 
                            new InternetAddress(messageRecipient));
            //set subject: header field
            message.setSubject("Welcome to java mail!");

            //send message
            Transport transport = session.getTransport("smtp");
            transport.connect("smtp.gmail.com", 587, messageSender, pass);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();

            System.out.println(Errors.MESSAGE_SENT_SUCCESSFULLY);
            return null;
        }
        catch(MessagingException mex)
        {
            return Errors.MESSAGE_NOT_SENT;
        }
    }
    catch(Exception e)
    {
        return Errors.FILE_NOT_FOUND;
    }
}

在控制台中调试输出:

     DEBUG: JavaMail version 1.4.5
    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.SMTPSS        LTransport,Sun Microsystems, Inc],                         com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTranspo        rt,Sun Microsystems, Inc],         com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Su        n Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Su        n Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun                 Microsystems, Inc],         com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun         Microsystems, Inc]}
    DEBUG: Providers Listed By Protocol:         {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc],         imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc],         smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun                 Microsystems, Inc],         pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun         Microsystems, Inc],         pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun         Microsystems, Inc],         smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun                 Microsystems, Inc]}
    DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
    DEBUG: getProvider() returning         javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
    DEBUG SMTP: useEhlo true, useAuth true
    DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
    220 mx.google.com ESMTP e20sm6680361wiv.7
    DEBUG SMTP: connected to host "smtp.gmail.com", port: 587

    EHLO gadon-Komputer
    250-mx.google.com at your service, [83.22.91.238]
    250-SIZE 35882577
    250-8BITMIME
    250-STARTTLS
    250 ENHANCEDSTATUSCODES
    DEBUG SMTP: Found extension "SIZE", arg "35882577"
    DEBUG SMTP: Found extension "8BITMIME", arg ""
    DEBUG SMTP: Found extension "STARTTLS", arg ""
    DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
    STARTTLS
    220 2.0.0 Ready to start TLS
    DEBUG: getProvider() returning         javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
    DEBUG SMTP: useEhlo true, useAuth true
    DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
    220 mx.google.com ESMTP et10sm6688757wib.2
    DEBUG SMTP: connected to host "smtp.gmail.com", port: 587

    EHLO gadon-Komputer
    250-mx.google.com at your service, [83.22.91.238]
    250-SIZE 35882577
    250-8BITMIME
    250-STARTTLS
    250 ENHANCEDSTATUSCODES
    DEBUG SMTP: Found extension "SIZE", arg "35882577"
    DEBUG SMTP: Found extension "8BITMIME", arg ""
    DEBUG SMTP: Found extension "STARTTLS", arg ""
    DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
    STARTTLS
    220 2.0.0 Ready to start TLS

有人可以告诉我这有什么问题吗?我阅读了有关javamail的houndreds主题,但我找不到我的问题的答案。如果我要更改密码,输出中没有任何变化。

5 个答案:

答案 0 :(得分:2)

您可以使用Gmail example in the JavaMail FAQ简化代码。 (不要设置端口号,使用“smtps”协议,并删除Authenticator。)另外,change getDefaultInstance to getInstance

答案 1 :(得分:0)

如果您不这样做,我建议您使用Spring简单地发送电子邮件流程。

要发送简单的电子邮件,您必须写下:

 `import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.mail.MailException;
  import org.springframework.mail.MailSender;
  import org.springframework.mail.SimpleMailMessage;`
.........
@Autowired
private MailSender mailSender;

SimpleMailMessage mailMessage = new SimpleMailMessage();
            mailMessage.setTo("example@gmail.com");
            mailMessage.setFrom("myemail@gmail.com");
            mailMessage.setSubject(this.subject);
            mailMessage.setText(text.toString());
            try {
                this.mailSender.send(mailMessage);
                logger.info("Email inviata con successo");
            }
            catch (MailException ex) {
                // just log it and go on
                logger.warn("An exception occured when trying to send email", ex);
            }

在你的applicationContext.xml

 <!-- MailSender used by EmailAdvice -->
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="${mail.host}"/>
        <property name="port" value="${mail.port}" />
        <property name="username" value="${mail.username}" />
        <property name="password" value="${mail.password}" />

        <property name="javaMailProperties">
           <props>
                  <prop key="mail.smtp.auth">true</prop>
                  <prop key="mail.smtp.starttls.enable">true</prop>
               </props>
        </property>
    </bean>

有关详细信息,请参阅此简单教程http://www.mkyong.com/spring/spring-sending-e-mail-via-gmail-smtp-server-with-mailsender/

答案 2 :(得分:0)

尝试删除properties.put("mail.smtp.starttls.enable", "true"),将端口更改为465并添加以下两个属性:

props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class",
            "javax.net.ssl.SSLSocketFactory");

答案 3 :(得分:0)

下面的代码是一个使用java的电子邮件的简单实现,我在参考了java mail API的文档之后写了这个,它完美地运行了..

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

public class Email
{
public Email()
    {
try {
    String host = "smtp.gmail.com";
    String username = "youmailid@gmail.com";
    String password = "XXXXXX";
    String body = "This is the message body.";
    String subject = "This is the message subject."; 
    //Set the properties
    Properties props = new Properties();
    props.put("mail.smtps.auth", "true");
    // Set the session here
    Session session = Session.getDefaultInstance(props);
    MimeMessage msg = new MimeMessage(session);
    // set the message content here
      msg.setSubject(subject);
      msg.setText(body);
      msg.setFrom(new InternetAddress(username));
      msg.addRecipient(Message.RecipientType.TO, 
              new InternetAddress(username));
    Transport t = session.getTransport("smtps");

    t.connect(host, username, password);
    t.sendMessage(msg, msg.getAllRecipients());
        t.close();
    }
   catch (Exception e) {
   e.printStackTrace();
   }
 finally {

    }
     }
    public static void main(String[] args)
    throws Exception {
            new Email();
    }

}

答案 4 :(得分:0)

我有点晚了,但我遇到了类似的问题,想发表我的反馈意见。 有时,端口被防病毒软件阻止。例如,Avast就是这样做的。