Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用java邮件客户端发送邮件_Java_Email_Jakarta Mail - Fatal编程技术网

无法使用java邮件客户端发送邮件

无法使用java邮件客户端发送邮件,java,email,jakarta-mail,Java,Email,Jakarta Mail,我已经看过了之前关于这个问题的链接,但是它们并没有解决我的问题 这是我的代码: public class SendMail { private String from; private String to; private String host; private String subject; private String message; private String pass; private static final Logge

我已经看过了之前关于这个问题的链接,但是它们并没有解决我的问题

这是我的代码:

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
此外,上述代码中的注释部分取自此链接:

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

调试:JavaMail版本1.4.4 调试:已成功加载资源:/META-INF/javamail.default.providers 调试:加载的提供程序的表 调试:按类名列出的提供程序:{com.sun.mail.smtpsslttransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.smtpsslttransport,sun Microsystems,Inc],com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtps,com.SMTPTransport,sun Microsystems,Inc],com.sun.mail.imapssltore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,sun Microsystems,Inc],com.sun.mail.pop3.pop3ssstore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.pop3ssstore,sun Microsystems,Inc],com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.mail.imap.IMAPStore,sun Microsystems,Inc],com.sun[商店,pop3,com.sun.mail.pop3.POP3Store,sun Microsystems,Inc]] 调试:协议列出的提供程序:{imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.imapssltore,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.smtpsslttransport,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.pop3ssl,sun Microsystems,Inc],smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.SMTPTransport,sun Microsystems,Inc]] 调试:已成功加载资源:/META-INF/javamail.default.address.map 调试:getProvider()返回javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,sun Microsystems,Inc] 调试:mail.imap.fetchsize:16384 调试:mail.imap.statuscachetimeout:1000 调试:mail.imap.appendbuffersize:-1 调试:mail.imap.minidle时间:10 调试:尝试连接到主机“imap.gmail.com”,端口993,isSSL true *OK Gimap准备好接受182.75.40.98 j10mb367075283iee的请求 A0能力 *功能IMAP4rev1取消选择空闲命名空间配额ID XLIST子项X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH A0好的,她就写这些了!j10mb367075283iee 调试IMAP:AUTH:XOAUTH2 调试IMAP:AUTH:PLAIN 调试IMAP:AUTH:PLAIN-CLIENTTOKEN 调试IMAP:AUTH:OAUTHBEARER 调试IMAP:AUTH:XOAUTH 调试:protocolConnect登录,主机=imap.gmail.com,用户=mailid04@gmail.com,密码= A1普通 + AGF0dWxzcGFtMDRAZ21haWwuY29tAGF0dWxzcGFt *功能IMAP4rev1取消选择空闲命名空间配额ID XLIST子项X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS A1好的mailid@gmail.com认证(成功) A2能力 *功能IMAP4rev1取消选择空闲命名空间配额ID XLIST子项X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS A2 OK成功 调试:getProvider()返回javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,sun Microsystems,Inc] 调试SMTP:useEhlo true,useAuth false 调试SMTP:尝试连接到主机“localhost”,端口25,isSSL false 2015年12月30日下午5:11:24实用程序.mailclient.SendMail 严重:无法发送邮件
注:我已经打开了gmail的检查,允许不太安全的应用程序访问它。

这可能不是一个完整的答案,但有太多的错误,我无法在一条评论中完全解释清楚

  • 没有“mail.smtp.EnableSSL.enable”属性。可能是您有意的
  • 您使用的是非常旧的JavaMail版本
  • 立即更改您的Gmail密码,它将在上面的日志输出中公开(但已编码)
  • 在使用传输发送消息之前,无需连接到存储
  • Gmail的例子见下表
  • 您将“mail.smtp.port”设置两次,设置为不同的值。如果将“mail.smtp.ssl.enable”设置为“true”,则根本不需要设置它

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

    在多次尝试设置不同的属性后,我获得了可以发送邮件的代码。以下是代码:

    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

    这是有效的。

    尝试添加
    属性.put(“java.net.preferIPv4Stack”,“true”);
    完全相同的情况…似乎您的消息部分缺少一些内容,请检查此处正在使用java发送邮件的代码,您尝试连接到主机“localhost”是否有原因,端口25?您是否确实在本地主机上运行邮件守护程序?Gmail身份验证似乎正在工作,如所示“mailid@gmail.com已验证(成功)”所以我应该删除那一行吗?谢谢你的回答,但我还是遇到了类似的错误。经过一些搜索和尝试,我得到了一个有效的代码,我把它作为答案发布。我想让你从那里验证一件事…如果可以的话,该代码的安全级别是多少。(比如,密码是以明文形式在网络上传播的吗?),等等)这与JavaMail常见问题解答中的代码基本相同,您尝试过吗?因为您启用了STARTTLS,所以在发送密码之前,连接将切换到SSL/TLS,因此不会以明文形式发送密码。您可以设置“require”属性inst
    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");
        }   
    }