【问题标题】:Unable to send mail using java mail client无法使用 java 邮件客户端发送邮件
【发布时间】:2018-11-01 23:31:15
【问题描述】:

我已经查看了有关此问题的之前关于 SO 的链接,但它们并没有解决我的问题。

这是我的代码:

public class SendMail {

    private String from;
    private String to;
    private String host;
    private String subject;
    private String message;
    private String pass;

    private static final Logger LOGGER = Logger.getLogger(SendMail.class.getName());

    public SendMail(String from, String pass, String to, String host, String subject, String message) {
        super();
        this.from = from;
        this.to = to;
        this.host = host;
        this.subject = subject;
        this.message = message;
        this.pass = pass;
    }

    public void sendMail(){
        Properties properties = System.getProperties();
        final String USERNAME = from;
        final String PASSWORD = pass;

        properties.put("mail.smtp.user", USERNAME);
        properties.put("mail.smtp.host", "smtp.gmail.com");
        properties.put("mail.smtp.port", "25");
        properties.put("mail.debug", "true");
        properties.put("mail.smtp.auth", "true");
        properties.put("mail.smtp.starttls.enable", "true");
        properties.put("mail.smtp.EnableSSL.enable", "true");
        properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        properties.setProperty("mail.smtp.socketFactory.fallbac k", "false");
        properties.setProperty("mail.smtp.port", "465");
        properties.setProperty("mail.smtp.socketFactory.port", "465");

        Session session = Session.getInstance(properties, new javax.mail.Authenticator(){
            protected PasswordAuthentication getPasswordAuthenticated(){
                return new PasswordAuthentication(USERNAME, PASSWORD);
            }
        });


        //properties.setProperty("mail.imap.ssl.enable", "true");
        //properties.put("mail.debug", "true");
        //Session session = Session.getInstance(properties);

        try {
            //Store store = session.getStore("imap");
            //store.connect(host, USERNAME, PASSWORD);

            MimeMessage mime = new MimeMessage(session);
            mime.setFrom(new InternetAddress(USERNAME));
            mime.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
            mime.setSubject(subject);
            mime.setText(message);
            Transport.send(mime);
            LOGGER.log(Level.INFO, "Mail sent successfully");
        } catch (MessagingException e) {
            // TODO Auto-generated catch block
            LOGGER.log(Level.SEVERE, "Unable to send mail\n");
        }   
    }

}

这里是日志:

DEBUG: JavaMail version 1.4.4
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,Sun Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun 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
Dec 30, 2015 4:51:31 PM utility.mailclient.SendMail sendMail
SEVERE: Unable to send mail

另外,上面代码中的注释部分来自这个链接:

http://www.oracle.com/technetwork/java/javamail/faq/index.html#gmail

这应该是正确的。但我得到了同样的结果。以下是使用此代码的日志(并注释掉上面所有的 properties.putproperties.setProperty 行)

DEBUG: JavaMail version 1.4.4
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,Sun Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun 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[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc]
DEBUG: mail.imap.fetchsize: 16384
DEBUG: mail.imap.statuscachetimeout: 1000
DEBUG: mail.imap.appendbuffersize: -1
DEBUG: mail.imap.minidletime: 10
DEBUG: trying to connect to host "imap.gmail.com", port 993, isSSL true
* OK Gimap ready for requests from 182.75.40.98 j10mb367075283iee
A0 CAPABILITY
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH
A0 OK Thats all she wrote! j10mb367075283iee
DEBUG IMAP: AUTH: XOAUTH2
DEBUG IMAP: AUTH: PLAIN
DEBUG IMAP: AUTH: PLAIN-CLIENTTOKEN
DEBUG IMAP: AUTH: OAUTHBEARER
DEBUG IMAP: AUTH: XOAUTH
DEBUG: protocolConnect login, host=imap.gmail.com, user=mailid04@gmail.com, password=<non-null>
A1 AUTHENTICATE PLAIN
+ 
AGF0dWxzcGFtMDRAZ21haWwuY29tAGF0dWxzcGFt
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS
A1 OK mailid@gmail.com authenticated (Success)
A2 CAPABILITY
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS
A2 OK Success
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "localhost", port 25, isSSL false
Dec 30, 2015 5:11:24 PM utility.mailclient.SendMail sendMail
SEVERE: Unable to send mail

PS:我开启了对 gmail 的检查,允许不太安全的应用访问它。

【问题讨论】:

  • 尝试添加properties.put("java.net.preferIPv4Stack", "true");
  • 完全一样的情况...
  • 您的消息部分似乎缺少某些内容,请在此处检查正在使用 java 发送邮件的代码,Send Mail in JAVA
  • 您尝试连接到主机“localhost”的端口 25 是否有原因?你肯定有一个在 localhost 上运行的邮件守护进程吗? Gmail 身份验证似乎工作正常,如“mailid@gmail.com authenticated (Success)”所示
  • 所以我应该删除那行吗?

标签: java email jakarta-mail


【解决方案1】:

这可能不是一个完整的答案,但是有很多错误的地方,我无法将其全部放在评论中...

  1. Get rid of the socket factory properties, you don't need them.
  2. 没有“mail.smtp.EnableSSL.enable”属性。也许你打算"mail.smtp.ssl.enable"
  3. 您使用的是非常旧的 JavaMail 版本,upgrade if you can
  4. 立即更改您的 Gmail 密码,密码已在上面的日志输出中公开(但已编码)。
  5. 在使用 Transport 发送消息之前,无需连接到应用商店。
  6. Gmail 示例位于JavaMail FAQ
  7. 您将“mail.smtp.port”设置为不同的值两次。如果将“mail.smtp.ssl.enable”设置为“true”,则根本不需要设置。

如果您进行了所有这些更改,但仍然无法正常工作,请使用最新的代码和调试输出更新您的帖子。

【讨论】:

  • 感谢您的回答,但我仍然遇到类似的错误。经过一些搜索和试验,我得到了一个有效的代码,并将其作为答案发布。我希望您从那里验证一件事……如果可以的话,该代码的安全级别是多少。 (例如,密码是否以明文形式通过网络传输?等)
  • 这与 JavaMail FAQ 中的代码基本相同,您尝试过吗?因为您启用了 STARTTLS,所以在发送密码之前连接将切换到 SSL/TLS,因此不会以明文形式发送密码。如果您希望在服务器不支持 STARTTLS 时失败,您可以设置“require”属性而不是“enable”属性。另请注意,没有“密码”属性,因此设置它没有意义。而且您也不需要设置“用户”或“主机”属性,因为您在连接调用中显式传递它们。同样,请参阅常见问题解答中的代码。
  • 并阅读我的回答中 #1 引用的常见问题解答项目,以了解您为什么不想使用 Session.getDefaultInstance。
【解决方案2】:

经过多次设置不同属性的试验后,我的代码能够发送邮件。代码如下:

public void sendMail(){
    Properties properties = System.getProperties();
    final String USERNAME = from;
    final String PASSWORD = pass;

    properties.put("mail.smtp.starttls.enable", "true");
    properties.put("mail.smtp.host", host);
    properties.put("mail.smtp.user", from);
    properties.put("mail.smtp.password", pass);
    properties.put("mail.smtp.port", "587");
    properties.put("mail.smtp.auth", "true");
    //properties.put("mail.debug", "true");

    Session session = Session.getDefaultInstance(properties);
    try {

        MimeMessage mime = new MimeMessage(session);
        mime.setFrom(new InternetAddress(USERNAME));

        mime.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
        mime.setSubject(subject);
        mime.setText(message);
        Transport transport = session.getTransport("smtp");
        transport.connect(host, from, pass);
        transport.sendMessage(mime, mime.getAllRecipients());
        transport.close();
        LOGGER.log(Level.INFO, "Mail sent successfully");
    } catch (MessagingException e) {
        // TODO Auto-generated catch block
        LOGGER.log(Level.ERROR, "Unable to send mail\n");
    }   
}

这里的显着变化是:

  • 设置的不同属性。
  • 最后transport.send的方式改为transport.sendMessage

这行得通。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多