Java 为什么在使用apache电子邮件库时附件文件名会被破坏?

Java 为什么在使用apache电子邮件库时附件文件名会被破坏?,java,email,smtp,jakarta-mail,apache-commons-email,Java,Email,Smtp,Jakarta Mail,Apache Commons Email,邮件是使用apache电子邮件库发送的。(commons-email-1.5.jar) 如果附件文件名中包含朝鲜语,则附件文件名将被破坏。文件名的正常发送方式是什么? 不要直接使用javax.mail-api库。仅应使用apache电子邮件库 试试这个 设置配置(附件、内联) 设置编码(utf-8,euc-kr) 使用javax.mail-api库(它工作正常,但不应使用。) 源代码 使用commons-email-1.5.jar(附件文件名已损坏) //使用commons-email-

邮件是使用apache电子邮件库发送的。(commons-email-1.5.jar) 如果附件文件名中包含朝鲜语,则附件文件名将被破坏。文件名的正常发送方式是什么? 不要直接使用javax.mail-api库。仅应使用apache电子邮件库


试试这个

  • 设置配置(附件、内联)
  • 设置编码(utf-8,euc-kr)
  • 使用javax.mail-api库(它工作正常,但不应使用。)

源代码 使用commons-email-1.5.jar(附件文件名已损坏)
//使用commons-email-1.5.jar)
字符串文件名=”한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글.txt”;
字符串filePath=“./file/”;
MultipartMail电子邮件=新的MultipartMail();
电子邮件.setCharset(“UTF-8”);
电邮:setSmtpPort(465);
email.setHostName(“xxx”);
email.addTo(“xxx”);
电子邮件地址:setFrom(“xxx”);
email.setSubject(“消息警报”);
email.setMsg(“这是邮件正文”);
电子邮件.setAuthenticator(新的默认验证器(“xxx”、“xxx”));
email.setSSLOnConnect(true);
email.setDebug(true);
/**案例1*/
EmailAttachment=新的EmailAttachment();
附件.setName(文件名);
附件.setPath(文件路径+文件名);
附件.setDisposition(EmailAttachment.attachment);
附件.setDescription(文件名);
电子邮件。附上(附件);
email.send();
使用javax.mail-api.jar(附件文件名未断开)
String to=“xxx”//相应地改变
最终字符串user=“xxx”//相应地改变
最终字符串密码=“xxx”;
//1)获取会话对象
Properties props=新属性();
props.put(“mail.smtp.host”,“xxxxxx”);
props.put(“mail.smtp.port”,“25”);
props.put(“mail.debug”,“true”);
props.put(“mail.smtp.auth”,“true”);
props.put(“mail.smtp.starttls.enable”、“true”);
props.put(“mail.smtp.EnableSSL.enable”,“true”);
props.put(“mail.mime.encodeparameters”、“false”);
setProperty(“mail.smtp.socketFactory.class”、“javax.net.ssl.SSLSocketFactory”);
setProperty(“mail.smtp.socketFactory.fallback”、“false”);
props.setProperty(“mail.smtp.port”、“465”);
setProperty(“mail.smtp.socketFactory.port”,“465”);
Session Session=Session.getDefaultInstance(props,new javax.mail.Authenticator(){
受保护的密码身份验证getPasswordAuthentication(){
返回新的PasswordAuthentication(用户、密码);
}
});
//2)撰写信息
试一试{
MimeMessage msg=新MimeMessage(会话);
msg.setFrom(新Internet地址(用户));
msg.addRecipient(Message.RecipientType.TO,新的InternetAddress(TO));
msg.setSubject(“消息警报”);
//3)创建MimeBodyPart对象并设置消息文本
BodyPart消息BodyPart1=新的MimeBodyPart();
messageBodyPart1.setText(“这是消息体”);
//4)创建新的MimeBodyPart对象并将DataHandler对象设置为此对象
MimeBodyPart消息BodyPart2=新的MimeBodyPart();
字符串filePath=“/文件/한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글.txt”;//相应地更改
字符串文件名=”한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글한글测试文件한글한글한글.txt”;
DataSource source=新文件数据源(文件路径);
messageBodyPart2.setDataHandler(新的DataHandler(源));
messageBodyPart2.setFileName(文件名);
//5)创建多部分对象并将MimeBodyPart对象添加到此对象
Multipart Multipart=新的MimeMultipart();
multipart.addBodyPart(messageBodyPart1);
multipart.addBodyPart(messageBodyPart2);
//6)将Multipart对象设置为message对象
msg.setContent(多部分);
//7)发送消息
发送(msg);
System.out.println(“消息已发送…”);
}捕获(消息例外){
例如printStackTrace();
}
实际结果 使用commons-email-1.5.jar-文件名已损坏。
attachment file name : =_UTF-8_Q_=ED=95=9C=EA=B8=80testfile=ED=95=9C=EA=B8=80_= =_UTF-8_Q_=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80testfil_= =_UTF-8_Q_e=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=E___ ___filename_3=__D=95=9.txt_=
使用javax.mail-api.jar-文件名正常
attachment file name : 한글testfile한글한글한글한글testfile한글한글한글한글testfile한글한글한글한글testfile한글한글한글한글testfile한글한글한글한글testfile한글한글한글.txt
电子邮件发送日志 在调试模式下使用commons-email-1.5.jar登录
Content-Type: text/plain; charset=UTF-8; 
    name*0="=?UTF-8?Q?=ED=95=9C=EA=B8=80testfile=ED=95=9C=EA=B8=80?=
 =?U"; 
    name*1="TF-8?Q?=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=8"; 
    name*2="0testfil?=
 =?UTF-8?Q?e=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=E"; 
    name*3="D=95=9C?= =?UTF-8?Q?=EA=B8=80=ED=95=9C=EA=B8=80tes?=
 =?UTF-8"; 
    name*4="?Q?tfile=ED=95=9C?=
 =?UTF-8?Q?=EA=B8=80=ED=95=9C=EA=B8=80=ED"; 
    name*5="=95=9C=EA=B8=80=ED=95=9C=EA=B8=80?=
 =?UTF-8?Q?testfile=ED=95"; 
    name*6="=9C=EA=B8=80=ED=95=9C=EA=B8=80?=
 =?UTF-8?Q?=ED=95=9C=EA=B8=8"; 
    name*7="0=ED=95=9C=EA=B8=80testfile=ED=95=9C?=
 =?UTF-8?Q?=EA=B8=80=E"; 
    name*8="D=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C?=
 =?UTF-8?Q?=EA="; 
    name*9="B8=80testf?=
 =?UTF-8?Q?ile=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8="; 
    name*10="80=ED=95=9C=EA=B8=80.txt?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment; 
    filename*0="=?UTF-8?Q?=ED=95=9C=EA=B8=80testfile=ED=95=9C=EA=B8=80?=
 =?U"; 
    filename*1="TF-8?Q?=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=8"; 
    filename*2="0testfil?=
 =?UTF-8?Q?e=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=E"; 
    filename*3="D=95=9C?= =?UTF-8?Q?=EA=B8=80=ED=95=9C=EA=B8=80tes?=
 =?UTF-8"; 
    filename*4="?Q?tfile=ED=95=9C?=
 =?UTF-8?Q?=EA=B8=80=ED=95=9C=EA=B8=80=ED"; 
    filename*5="=95=9C=EA=B8=80=ED=95=9C=EA=B8=80?=
 =?UTF-8?Q?testfile=ED=95"; 
    filename*6="=9C=EA=B8=80=ED=95=9C=EA=B8=80?=
 =?UTF-8?Q?=ED=95=9C=EA=B8=8"; 
    filename*7="0=ED=95=9C=EA=B8=80testfile=ED=95=9C?=
 =?UTF-8?Q?=EA=B8=80=E"; 
    filename*8="D=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C?=
 =?UTF-8?Q?=EA="; 
    filename*9="B8=80testf?=
 =?UTF-8?Q?ile=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8="; 
    filename*10="80=ED=95=9C=EA=B8=80.txt?="
Content-Description: =?UTF-8?Q?=ED=95=9C=EA=B8=80testfile=ED=95=9C=EA=B8=80?=
 =?UTF-8?Q?=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80testfil?=
 =?UTF-8?Q?e=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C?=
 =?UTF-8?Q?=EA=B8=80=ED=95=9C=EA=B8=80tes?= =?UTF-8?Q?tfile=ED=95=9C?=
 =?UTF-8?Q?=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80?=
 =?UTF-8?Q?testfile=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80?=
 =?UTF-8?Q?=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80testfile=ED=95=9C?=
 =?UTF-8?Q?=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C?=
 =?UTF-8?Q?=EA=B8=80testf?=
 =?UTF-8?Q?ile=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80=ED=95=9C=EA=B8=80.txt?=

在调试模式下使用javax.mail-api.jar记录日志。
Content-Type: text/plain; charset=UTF-8; 
    name*=UTF-8''%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80.txt
Content-Transfer-Encoding: base64
Content-Disposition: attachment; 
    filename*=UTF-8''%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80testfile%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80%ED%95%9C%EA%B8%80.txt

多亏了你,这个问题才得以解决

  • 修改MultiPartEmail.java(commons email.1.5.jar)
/[之前]
第467行bodyPart.setFileName(MimeUtility.encodeText(name));
//[之后]
//我会选择这样处理。
第467行bodyPart.setFileName(名称);

commons-email-1.5使用的是什么版本的JavaMail?也许它使用的旧版本不处理非ASCII文件名?JavaMail版本是1.6.1。(javax.mail-1.6.1.jar)。此外,在测试升级到1.6.2的版本时也得到了相同的结果。我尝试了另一种方法,当我更改MultiPartEmail.java的源代码时,它工作正常。更详细地说,[MultiPartEmail.java行467]
bodyPart.setFileName(MimeUtility.encodeText(name))-->bodyPart.setFileName(name)
。我修改了MultiPartEmail.java,得到了与javax.mail-api.jar相同的结果。我修改了MultiPartEmail.java,得到了与javax.mail-api.jar相同的结果。是否正确?是的,commons电子邮件不应为您编码文件名;它应该让JavaMail做到这一点。