bbottema / simple-java-mail

Simple API, Complex Emails (Jakarta Mail smtp wrapper)
http://www.simplejavamail.org
Apache License 2.0
1.22k stars 266 forks source link

Cannot send an email. #496

Closed cooffeeRequired closed 7 months ago

cooffeeRequired commented 7 months ago

fun main() {
    try {
        val email: Email = EmailBuilder.startingBlank()
            .from("....")
            .to("....")
            .withSubject("Hello")
            .withPlainText("AA")
            .buildEmail()

        val mailer: Mailer = MailerBuilder
            .withSMTPServer("smtp.gmail.com", 587, "....", "...")
            .withDebugLogging(true)
            .withTransportStrategy(TransportStrategy.SMTP_TLS)
            .withSessionTimeout(15000)
            .buildMailer()

        //mailer.testConnection()
        mailer.sendMail(email, true)
        println("sended")
    } catch (ex: Exception) {
        ex.printStackTrace()
    }

}

//mailer.testConnection()-> Success

DEBUG: setDebug: Jakarta Mail version 2.1.2
DEBUG: getProvider() returning jakarta.mail.Provider[TRANSPORT,smtp,org.eclipse.angus.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: need username and password for authentication
DEBUG SMTP: protocolConnect returning false, host=smtp.gmail.com, user=nextikczcz@gmail.com, password=<null>
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 smtp.gmail.com ESMTP wb1-20020a170907d50100b00a3ec215f130sm2915268ejc.103 - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
EHLO host.docker.internal
250-smtp.gmail.com at your service, [31.222.3.86]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
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 ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
EHLO host.docker.internal
250-smtp.gmail.com at your service, [31.222.3.86]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.gmail.com, user=nextikczcz@gmail.com, password=<non-null>
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 
DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
QUIT
221 2.0.0 closing connection wb1-20020a170907d50100b00a3ec215f130sm2915268ejc.103 - gsmtp
sended

Process finished with exit code 0

mailer.sendMail(email)

DEBUG: setDebug: Jakarta Mail version 2.1.2
DEBUG: getProvider() returning jakarta.mail.Provider[TRANSPORT,smtp,org.eclipse.angus.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: need username and password for authentication
DEBUG SMTP: protocolConnect returning false, host=smtp.gmail.com, user=nextikczcz@gmail.com, password=<null>
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 smtp.gmail.com ESMTP mn6-20020a1709077b0600b00a3e12ded9b7sm5084081ejc.169 - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
EHLO host.docker.internal
250-smtp.gmail.com at your service, [31.222.3.86]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
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 ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
EHLO host.docker.internal
250-smtp.gmail.com at your service, [31.222.3.86]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.gmail.com, user=nextikczcz@gmail.com, password=<non-null>
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 
DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<nextikczcz@gmail.com>
250 2.1.0 OK mn6-20020a1709077b0600b00a3e12ded9b7sm5084081ejc.169 - gsmtp
RCPT TO:<nhl-jurasek@seznam.cz>
250 2.1.5 OK mn6-20020a1709077b0600b00a3e12ded9b7sm5084081ejc.169 - gsmtp
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   nhl-jurasek@seznam.cz
DATA
354  Go ahead mn6-20020a1709077b0600b00a3e12ded9b7sm5084081ejc.169 - gsmtp
Date: Wed, 21 Feb 2024 23:50:05 +0100 (CET)
From: nextikczcz@gmail.com
To: nhl-jurasek@seznam.cz
Message-ID: <30578394.0.1708555805265@host.docker.internal>
Subject: Hello
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

QUIT
DEBUG SMTP: exception reading response, THROW: 
java.net.SocketTimeoutException: Read timed out
    at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
    at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
    at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
    at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
    at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1455)
    at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1059)
    at org.eclipse.angus.mail.util.TraceInputStream.read(TraceInputStream.java:107)
    at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:244)
    at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:263)
    at org.eclipse.angus.mail.util.LineInputStream.readLine(LineInputStream.java:104)
    at org.eclipse.angus.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2489)
    at org.eclipse.angus.mail.smtp.SMTPTransport.close(SMTPTransport.java:1401)
    at org.simplejavamail.mailer.internal.util.TransportRunner.runOnSessionTransport(TransportRunner.java:82)
    at org.simplejavamail.mailer.internal.util.TransportRunner.sendMessage(TransportRunner.java:56)
    at org.simplejavamail.mailer.internal.SendMailClosure.executeClosure(SendMailClosure.java:69)
    at org.simplejavamail.mailer.internal.AbstractProxyServerSyncingClosure.run(AbstractProxyServerSyncingClosure.java:56)
    at org.simplejavamail.mailer.internal.MailerImpl.sendMail(MailerImpl.java:364)
    at org.simplejavamail.mailer.internal.MailerImpl.sendMail(MailerImpl.java:349)
    at cz.coffeerequired.skriptmail.RKt.main(R.kt:26)
    at cz.coffeerequired.skriptmail.RKt.main(R.kt)
org.simplejavamail.mailer.internal.MailerException: Failed to send email [ID: '<30578394.0.1708555805265@host.docker.internal>'], reason: Unknown error
    at org.simplejavamail.mailer.internal.SendMailClosure.handleException(SendMailClosure.java:85)
    at org.simplejavamail.mailer.internal.SendMailClosure.executeClosure(SendMailClosure.java:76)
    at org.simplejavamail.mailer.internal.AbstractProxyServerSyncingClosure.run(AbstractProxyServerSyncingClosure.java:56)
    at org.simplejavamail.mailer.internal.MailerImpl.sendMail(MailerImpl.java:364)
    at org.simplejavamail.mailer.internal.MailerImpl.sendMail(MailerImpl.java:349)
    at cz.coffeerequired.skriptmail.RKt.main(R.kt:26)
    at cz.coffeerequired.skriptmail.RKt.main(R.kt)
Caused by: java.lang.ClassCastException: class com.sun.mail.handlers.text_plain cannot be cast to class jakarta.activation.DataContentHandler (com.sun.mail.handlers.text_plain and jakarta.activation.DataContentHandler are in unnamed module of loader 'app')
    at jakarta.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:620)
    at jakarta.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:573)
    at jakarta.activation.DataHandler.getDataContentHandler(DataHandler.java:591)
    at jakarta.activation.DataHandler.writeTo(DataHandler.java:290)
    at jakarta.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1683)
    at jakarta.mail.internet.MimeMessage.writeTo(MimeMessage.java:1911)
    at org.eclipse.angus.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1305)
    at org.simplejavamail.mailer.internal.util.TransportRunner.lambda$sendMessage$0(TransportRunner.java:61)
    at org.simplejavamail.mailer.internal.util.TransportRunner.runOnSessionTransport(TransportRunner.java:81)
    at org.simplejavamail.mailer.internal.util.TransportRunner.sendMessage(TransportRunner.java:56)
    at org.simplejavamail.mailer.internal.SendMailClosure.executeClosure(SendMailClosure.java:69)
    ... 5 more
    Suppressed: jakarta.mail.MessagingException: Exception reading response;
  nested exception is:
    java.net.SocketTimeoutException: Read timed out
        at org.eclipse.angus.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2509)
        at org.eclipse.angus.mail.smtp.SMTPTransport.close(SMTPTransport.java:1401)
        at org.simplejavamail.mailer.internal.util.TransportRunner.runOnSessionTransport(TransportRunner.java:82)
        ... 7 more
    Caused by: java.net.SocketTimeoutException: Read timed out
        at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
        at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
        at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
        at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
        at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
        at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
        at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
        at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
        at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1455)
        at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1059)
        at org.eclipse.angus.mail.util.TraceInputStream.read(TraceInputStream.java:107)
        at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:244)
        at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:263)
        at org.eclipse.angus.mail.util.LineInputStream.readLine(LineInputStream.java:104)
        at org.eclipse.angus.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2489)
        ... 9 more
cooffeeRequired commented 7 months ago

Okey i did check thats happens only on Kotlin image on the Classic maven its works fine image Totaly same source code

bbottema commented 7 months ago

I'm not sure what I should do about this. I can't reproduce this issue and from your SMTP log it seems it goes wrong after the DATA command, which looks like a timeout on the server end. Have you tried it a bunch of times in a row, maybe in a loop with a delay? Feels like a shoddy connection, perhaps a problematic proxy or server. Is it consistently failing?

That ClassCastException I will deal with separately. That's not related to your issue, but needs to be fixed too (but it won't block you from using the library in any way).

bbottema commented 7 months ago

I can see you reduced the session timeout from 60 seconds to 15 seconds. Does your exception occur after 15 seconds?

Also, you could try to increase other timings, although the default already is infinite:

yourMailerBuilder
  .withProperty("mail.smtp.timeout", "90000")
  .withProperty("mail.smtp.writetimeout", "90000")

Also, try different servers and see if it is consistently an issue with Kotlin or something else.

You could try Gmail for example. If you clone the Github repo (or just download the zip from Github), there's a test class "FullEmailDemoApp" that you run (just fill in your gmail address and password in the DemoAppBase super class). That should work in both Java and Kotlin.