B4J Question Smtp inline Java debug runs normally with an error in release mode

Status
Not open for further replies.

zhangbao

Member
Java:
Private Sub Button1_Click
    (Me).As(JavaObject).RunMethod("sendmail",Null)
End Sub

#IF JAVA

import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
import java.io.File;
import java.io.IOException;

//public class EmailSenderFixed {
    public void sendmail() {

       // 邮箱配置 (需替换为实际值)
        final String username = "[email protected]";
        final String password = "**************"; // 非登录密码
        String smtpHost = "smtp.qq.com"; // 根据邮箱类型设置(如QQ邮箱:smtp.qq.com)
        int smtpPort = 465; // 163邮箱使用465端口
        
        // 多收件人配置
        List<String> toRecipients = Arrays.asList(
                "[email protected]",
                "[email protected]"
        );

        List<String> ccRecipients = Arrays.asList("[email protected]");
        List<String> bccRecipients = Arrays.asList("[email protected]");

        // 附件文件列表
        List<String> attachments = Arrays.asList("C:\\Users\\80789\\Desktop\\20250730分拣差错.xlsx");

        // 发送带附件的邮件
        sendEmailWithAttachments(smtpHost, smtpPort, username, password,
                toRecipients, ccRecipients, bccRecipients,
                "测试邮件主题", "这是邮件正文内容 <b>HTML支持</b>", attachments);
    }

    private static void sendEmailWithAttachments(String smtpHost, int smtpPort,
                                                String username, String password,
                                                List<String> toRecipients,
                                                List<String> ccRecipients,
                                                List<String> bccRecipients,
                                                String subject, String body,
                                                List<String> attachments) {
        Properties props = new Properties();
        props.put("mail.smtp.host", smtpHost);
        props.put("mail.smtp.port", smtpPort);
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.ssl.trust", smtpHost); // 修复SSL证书信任问题

        // 创建邮件会话
        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            // 创建邮件对象
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setSubject(subject);

            // 设置收件人
            for (String recipient : toRecipients) {
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
            }

            // 设置抄送
            for (String cc : ccRecipients) {
                message.addRecipient(Message.RecipientType.CC, new InternetAddress(cc));
            }

            // 设置密送
            for (String bcc : bccRecipients) {
                message.addRecipient(Message.RecipientType.BCC, new InternetAddress(bcc));
            }

            // 创建多部件容器 - 修复关键点:使用替代内容结构
            BodyPart textBodyPart = new MimeBodyPart();
            textBodyPart.setContent(body, "text/html; charset=utf-8");

            // 创建多部件容器
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(textBodyPart);

            // 添加多个附件
            for (String filename : attachments) {
                System.out.println("添加附件: " + filename);
                File file = new File(filename);
                if (!file.exists()) {
                    System.err.println("警告:附件文件不存在 - " + filename);
                    continue;
                }

                BodyPart attachmentPart = new MimeBodyPart();
                DataSource source = new FileDataSource(file);
                attachmentPart.setDataHandler(new DataHandler(source));

                // 处理中文文件名问题
                String encodedFileName = MimeUtility.encodeText(file.getName(), "UTF-8", "B");
                attachmentPart.setFileName(encodedFileName);
                attachmentPart.setDisposition(Part.ATTACHMENT);

                multipart.addBodyPart(attachmentPart);
            }

            // 设置邮件内容
            message.setContent(multipart);
            message.saveChanges(); // 关键修复:保存更改确保MIME头正确生成

            // 发送邮件
            Transport.send(message);
            System.out.println("邮件已成功发送给 " + toRecipients.size() + " 位收件人!");

        } catch (MessagingException | IOException e) {
            System.err.println("邮件发送失败:");
            e.printStackTrace();
            System.err.println("使用的SMTP服务器: " + smtpHost + ":" + smtpPort);
            System.err.println("使用的用户名: " + username);
            System.err.println("错误详情: " + e.getMessage());

            // 输出更详细的诊断信息
            if (e instanceof MessagingException) {
                MessagingException me = (MessagingException) e;
                Exception next = me.getNextException();
                if (next != null) {
                    System.err.println("Next Exception:");
                    next.printStackTrace();
                }
            }
        }
    }
//}

#End If



1753873007621.png
1753873015001.png
 

zhangbao

Member
Call B4XPages.GetManager.LogEvents = True to enable logging B4XPages events.
7鏈?30, 2025 7:58:23 涓嬪崍 javax.mail.Session loadResource
璀﹀憡: expected resource not found: /META-INF/javamail.default.address.map
添加附件: C:\Users\80789\Desktop\20250730分拣差错.xlsx
閭欢鍙戦€佸け璐?
javax.mail.MessagingException: IOException while sending message;
nested exception is:
javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
boundary="----=_Part_0_253490317.1753876703309"
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1365)
at javax.mail.Transport.send0(Transport.java:255)
at javax.mail.Transport.send(Transport.java:124)
at b4j.example.b4xmainpage.sendEmailWithAttachments(b4xmainpage.java:179)
at b4j.example.b4xmainpage.sendmail(b4xmainpage.java:98)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at anywheresoftware.b4j.object.JavaObject.RunMethod(JavaObject.java:132)
at b4j.example.b4xmainpage._button1_click(b4xmainpage.java:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:111)
at anywheresoftware.b4a.BA$1.run(BA.java:236)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:1589)
Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
boundary="----=_Part_0_253490317.1753876703309"
at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:909)
at javax.activation.DataHandler.writeTo(DataHandler.java:330)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1694)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1913)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1315)
... 19 more
浣跨敤鐨凷MTP鏈嶅姟鍣? smtp.qq.com:465
浣跨敤鐨勭敤鎴峰悕: [email protected]
閿欒璇︽儏: IOException while sending message
Next Exception:
javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
boundary="----=_Part_0_253490317.1753876703309"
at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:909)
at javax.activation.DataHandler.writeTo(DataHandler.java:330)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1694)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1913)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1315)
at javax.mail.Transport.send0(Transport.java:255)
at javax.mail.Transport.send(Transport.java:124)
at b4j.example.b4xmainpage.sendEmailWithAttachments(b4xmainpage.java:179)
at b4j.example.b4xmainpage.sendmail(b4xmainpage.java:98)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at anywheresoftware.b4j.object.JavaObject.RunMethod(JavaObject.java:132)
at b4j.example.b4xmainpage._button1_click(b4xmainpage.java:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:111)
at anywheresoftware.b4a.BA$1.run(BA.java:236)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:1589)
 
Upvote 0

aeric

Expert
Licensed User
Longtime User
Why don't use jNet library?

B4X:
Dim smtp As SMTP
smtp.Initialize(SMTP_SERVER, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD, "SMTP")
smtp.UseSSL = True
smtp.Sender = SMTP_USERNAME
smtp.To.Add(RecipientEmail1)
smtp.To.Add(RecipientEmail2)
smtp.CC.Add(RecipientEmail3)
smtp.BCC.Add(RecipientEmail4)
smtp.AuthMethod = smtp.AUTH_LOGIN
smtp.HtmlBody = True
smtp.Subject = EmailSubject
smtp.Body = EmailBody
smtp.AddAttachment("C:\Users\80789\Desktop", "20250730分拣差错.xlsx")
Log("Sending email...")
Wait For (smtp.Send) SMTP_MessageSent (Success As Boolean)
If Success Then
    Log("Email sent successfully")
Else
    Log(LastException)
End If
 
Upvote 0

zhangbao

Member
You can send emails now, but you will receive an error message

Waiting for debugger to connect...
Program started.
Sending email...
org.apache.commons.net.MalformedServerReplyException: Could not parse response code.
Server Reply:
221 Bye.
at org.apache.commons.net.smtp.SMTP.__getReply(SMTP.java:216)
at org.apache.commons.net.smtp.SMTP.__sendCommand(SMTP.java:171)
at org.apache.commons.net.smtp.SMTP.sendCommand(SMTP.java:311)
at org.apache.commons.net.smtp.SMTP.sendCommand(SMTP.java:338)
at org.apache.commons.net.smtp.SMTP.sendCommand(SMTP.java:387)
at org.apache.commons.net.smtp.SMTP.quit(SMTP.java:755)
at anywheresoftware.b4a.net.SMTPWrapper$1.run(SMTPWrapper.java:339)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1589)
(MalformedServerReplyException) org.apache.commons.net.MalformedServerReplyException: Could not parse response code.
Server Reply:
221 Bye.
 
Upvote 0

zhangbao

Member
Debug and release run normally, but when packaged as exe and run, an error occurs



F:\B4X\email\Objects\temp\build>cd bin

F:\B4X\email\Objects\temp\build\bin>java.exe @release_java_modules.txt -m b4j/b4j.example.main
Sending email...
javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
at java.base/sun.security.ssl.SSLSocketImpl.handleEOF(Unknown Source)
at java.base/sun.security.ssl.SSLSocketImpl.decode(Unknown Source)
at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at java.base/sun.security.ssl.SSLSocketImpl.ensureNegotiated(Unknown Source)
at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(Unknown Source)
at java.base/sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at java.base/sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at java.base/sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.base/java.io.InputStreamReader.read(Unknown Source)
at java.base/java.io.BufferedReader.fill(Unknown Source)
at java.base/java.io.BufferedReader.read(Unknown Source)
at b4j/org.apache.commons.net.io.CRLFLineReader.readLine(Unknown Source)
at b4j/org.apache.commons.net.smtp.SMTP.__getReply(Unknown Source)
at b4j/org.apache.commons.net.smtp.SMTP._connectAction_(Unknown Source)
at b4j/org.apache.commons.net.SocketClient.connect(Unknown Source)
at b4j/org.apache.commons.net.SocketClient.connect(Unknown Source)
at b4j/anywheresoftware.b4a.net.SMTPWrapper$1.run(Unknown Source)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at java.base/sun.security.ssl.SSLSocketInputRecord.decode(Unknown Source)
at java.base/sun.security.ssl.SSLTransport.decode(Unknown Source)
... 22 more
(EOFException) java.io.EO
 
Upvote 0
Status
Not open for further replies.
Top