当前位置: 首页 > 知识库问答 >
问题:

附件文件名字符集-JavaMail更新后的问题

濮献
2023-03-14
Content-Type: application/octet-stream; name="Frammøtebekreftelse.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Frammøtebekreftelse.pdf"

使用JavaMail1.6.2,我们有这样的体验:

Content-Type: application/octet-stream; 
    name*=windows-1252''Framm%F8tebekreftelse.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; 
    filename*=windows-1252''Framm%F8tebekreftelse.pdf

我认为这是好的,但是接收方在name*-格式上有问题,这导致我们使用encodeParameters=false

使用JavaMail 1.6.2和encodeParameters=false,我们有这样的体验:

Content-Type: application/octet-stream; name="Frammøtebekreftelse.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Frammøtebekreftelse.pdf"

这个代码很简单。下面是一个MCVE,它应该演示这个问题:

import java.io.IOException;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class Mcve {
    public static void main(String[] args) throws AddressException, MessagingException, IOException {
        Properties props = System.getProperties();
        props.setProperty("mail.smtp.host", "localhost");
        props.setProperty("mail.mime.encodeparameters", "false");

        Session session = Session.getInstance(props, null);
        MimeMessage message = new MimeMessage(session);

        message.setFrom(new InternetAddress("email@example.com"));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("email@example.com", false));
        message.setSubject("Frammøtebekreftelse");

        MimeMultipart multipart = new MimeMultipart();

        MimeBodyPart body = new MimeBodyPart();
        body.setContent("Hello world", "text/plain");
        multipart.addBodyPart(body);

        MimeBodyPart attachment = new MimeBodyPart();
        attachment.attachFile("Frammøtebekreftelse.pdf");
        multipart.addBodyPart(attachment);

        message.setContent(multipart);

        Transport.send(message);
    }
}

共有1个答案

沈伟
2023-03-14

为了获得JavaMail1.6.2中头的旧外观,我需要添加以下两个系统属性:

props.setProperty("mail.mime.encodeparameters", "false");
props.setProperty("mail.mime.allowutf8", "false");

修补程序注释中对mail.mime.allowUTF8的解释:

mail.mime.allowutf8:

  If set to "true", UTF-8 strings are allowed in message headers,
  e.g., in addresses.  This should only be set if the mail server also
  supports UTF-8.

不幸的是,我对此并不完全有信心,不会搞砸其他一些功能。根据我的基本检查,区别至少在于LineOutputStream中的以下功能。

public void writeln(String s) throws IOException {
    byte[] bytes = ASCIIUtility.getBytes(s);
    out.write(bytes);
    out.write(newline);
}
public void writeln(String s) throws IOException {
    byte[] bytes;
    if (allowutf8)
        bytes = s.getBytes(StandardCharsets.UTF_8);
    else
        bytes = ASCIIUtility.getBytes(s);
    out.write(bytes);
    out.write(newline);
}
 类似资料:
  • 我使用下面的代码将pdf文件附加到邮件(JAVAMAIL)中。这个位置工作完美,并添加附件到我的邮件,但这邮件没有任何正文。 当我将下面的行添加到我的代码中时,它会删除附件并发送给我只包含文本的邮件。 请帮助我添加附件和测试体到我的邮件。

  • 如何从内容类型为“多部分/备选”的邮件中下载附件;

  • 我已经用UUID作为每个文件名的密钥将文件上传到s3 bucket,我要求将文件密钥作为存储的UUID,但当下载时,我需要将下载的文件名作为实际文件名,例如:foo.png aws S3-0E8221B9-9BF4-49D6-B0C0-D99E86F91F8E.png上存储的文件下载文件名应为:foo.bar 我尝试过设置Content-Disposition元数据,但在下载文件时仍然包含UUID

  • 我至少读了5篇关于这方面的文章,但我似乎不明白。我有一个xml文件,它已经在浏览器的内存中,我正试图从我的数据库中更新一个文档,我已经有了该文档的文档ID。做这件事最好的方法是什么?jquery.couch.js中是否有对此的支持,因为我似乎找不到任何支持。 为了我的理智起见,我附上了一些带有硬编码值的代码: 我得到一个DOM18错误...但我使用的是一个公共服务器。思想?

  • 我试图通过javamail和imap从我的电子邮件下载所有新的电子邮件附件。这一切都很好,但有些附件在PDF中被解码为BASE64,这是我的声明 如何获取此附件并将其下载到硬盘? 到目前为止已经尝试过了,第一个IF语句使用Base64解码捕获附件。 如果有一种简单易行的方法可以将附件下载到我的磁盘,也可以使用NodeJS。尝试过node-imap,但我在那里遇到了同样的错误。

  • 最近我在通过oracle-javamail从我的电子邮件下载CSV时遇到了一个问题。我发现第一个工作正常(来自大型机服务器),但是第二个csv附件似乎是“应用程序/vnd.ms-excel”,当它显然是一个. csv文件时,就像另一个下载完全正常的文件一样。 我在这两个问题上使用了相同的代码,但找不到有关此问题的任何信息。 如果我把那封电子邮件发给自己,我可以神奇地下载附件而没有任何问题。任何帮助