java - 使用 java 邮件 API 从网站发送自动 javamail

标签 java smtp jakarta-mail

下面是我的代码,用于从我的网站发送注册自动邮件:

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 ConfirmationMail {

    public static void main(String[] args) {

        int id=0;
        String passWord=null;
        sendMail(id, passWord);
    }

        public static void sendMail(int id, String passWord) {
        // TODO Auto-generated method stub

        final String username = "xxx@gmail.com";
        final String password = "xxx";
        final String host= "smtp.gmail.com";
        final int port=587;
        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("xxx@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("xxxx@gmail.com"));
            message.setSubject("Testing Subject");
            message.setText("Dear Mail Crawler,"
                + "\n\n No spam to my email, please!");

            Transport.send(message);

            System.out.println("Message sent successfully");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

当我在我的 eclipse 上运行它时,它抛出异常,堆栈跟踪如下:

     java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 587;  
  nested exception is:  
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?  
    at com.affiliate.DTO.ConfirmationMail.sendMail(ConfirmationMail.java:64)  
    at com.affiliate.servlet.AffiliateApproveServlet.doGet(AffiliateApproveServlet.java:39)  
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)  
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)  
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)  
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)  
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)  
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)  
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)  
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)  
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)  
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)  
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)  
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)  
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)  
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)  
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)  
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)  
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)  
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)  
    at java.lang.Thread.run(Thread.java:724)  
Caused by: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 587;  
  nested exception is:  
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?  
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1986)  
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:656)  
    at javax.mail.Service.connect(Service.java:345)  
    at com.affiliate.DTO.ConfirmationMail.sendMail(ConfirmationMail.java:55)  
    ... 22 more  
Caused by: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?  
    at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:671)  
    at sun.security.ssl.InputRecord.read(InputRecord.java:504)  
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)  
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)  
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)  
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)  
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:532)  
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:337)  
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:229)  
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1950)  
    ... 25 more  

我在 eclipse 构建路径中的 jar 文件是 javax.mail.jar、activation.jar、commons-email-1.0.jar 请帮我解决这个问题...提前致谢...

最佳答案

使用javamail 1.5.1

TLS 连接适用于此版本。 https://javamail.java.net/docs/SSLNOTES.txt

替换

props.put("mail.smtp.ssl.enable", "true");

因为 gmail 使用 TLS。

props.put("mail.smtp.starttls.enable", "true");

替换下面4行

Transport transport = session.getTransport("smtps");
transport.connect (host, port,username,password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();  

只有这一行。

Transport.send(message);

关于java - 使用 java 邮件 API 从网站发送自动 javamail,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23213975/

相关文章:

java - 从数组中删除重复条目的程序不会删除某些条目

ruby - 在 Ruby 中格式化 smtp 消息头字段

java - 通过java发送邮件遇到错误

php - 寻找用于 windows 的 SMTP 服务器

java - BCC 收件人数量限制

java - 发送邮件时是否需要 TLS 身份验证凭据

java - 使用 JavaMail API 时未收到任何响应

java - Hibernate ManyToOne 保存。拯救没有 child 的 parent 。但应该根据特定属性来搜索 Child

glassfish - 如何列出 glassfish 实例?

java - 在 JSP 页面中使用 request.setAttribute