使用Java Mail API

时间:2016-10-17 13:31:53

标签: java email

我使用的是最新版本的Java Mail API(1.5.6),并且我尝试发送带有附件的电子邮件。如果附件是plain / txt,那么它可以工作,但如果它是PDF或XML,那么附件不会包含在 某些 电子邮件客户端的电子邮件中。我在Ubuntu上使用Thunderbird电子邮件客户端的Gmail帐户进行了调试。

如果我发送的电子邮件包含简单的单行纯文本邮件正文和非常简单的XML附件文件,我可以通过浏览器查看我的Gmail帐户时看到附件。但是当我将Thunderbird设置用于同一个Gmail帐户时,我只看到邮件正文;没有附件。

没有提及附件被阻止或类似的东西。现在,如果我从某个电子邮件帐户手动发送完全相同的电子邮件,包括完全相同的附件文件,我 可以 查看Thunderbird中的附件。此外,如果我使用命令行中的ssmtp应用程序发送电子邮件(相同的邮件正文,相同的附件文件),如下所示:

echo -e "To: recipient@gmail.com\nFrom: my.account@gmail.ie\nSubject: SSMTP Attachment Test\n\nSome message body here...\n"| (cat - && uuencode /tmp/attach.xml attach.xml) | ssmtp recipient@gmail.com

...我也 可以 查看附件。

因此,我得出的结论是Java Mail API正在错误地撰写邮件,这导致 某些 电子邮件客户端忽略附件。这是我发送附件的Java代码:

public static void main(String[] args) throws Exception {
    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", "25");
    String sender = "my.account@gmail.com";

    Session session = Session.getInstance(props,
       new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(sender, "my.pass.word");
        }
    });
    MimeMessage mimeMessage = new MimeMessage(session);

    mimeMessage.setFrom(new InternetAddress(sender));
    mimeMessage.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress("recipient@gmail.com"));
    mimeMessage.setSubject("Java Attachment Test");
    MimeMultipart mimeMultiPart = new MimeMultipart("alternative");

    BodyPart plainTextBody = new MimeBodyPart();
    plainTextBody.setContent("Some message body here...", ContentType.TEXT_PLAIN.getMimeType());
    mimeMultiPart.addBodyPart(plainTextBody);    

    MimeBodyPart attachmentBodyPart = new MimeBodyPart();
    attachmentBodyPart.attachFile( new File("/tmp/attach.xml") );
    mimeMultiPart.addBodyPart(attachmentBodyPart);

    mimeMessage.setContent(mimeMultiPart);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    mimeMessage.writeTo(outputStream);

    Transport.send(mimeMessage);
}

我检查了上述代码发送的原始电子邮件。 有关原始邮件末尾的电子邮件内容本身的相关部分是:

  

日期:星期一,2016年10月17日05:47:13 -0700(PDT)
  来自:my.account@gmail.com
  致:recipient@gmail.com
  消息ID:< 1919892312.2.1476708432597@my-laptop>
  主题:Java附件测试
  MIME版本:1.0
  内容类型:multipart / alternative;
  边界=" ---- = _ Part_0_824318946.1476708432531"

     

------ = _ Part_0_824318946.1476708432531
  内容类型:text / plain;字符集= US-ASCII
  内容传输编码:7位

     

这里有一些消息正文......
  ------ = _ Part_0_824318946.1476708432531
  Content-Type:text / xml;字符集= US-ASCII;名称= attach.xml
  内容传输编码:7位
  内容 - 处理:附件; filename = attach.xml

     

<?xml version = \" 1.0 \" encoding = \" UTF-8 \"?>< SomeTag>这是一个XML   附件测试的附件!!< / SomeTag>

     

------ = _ Part_0_824318946.1476708432531--

我知道这个问题与Thunderbird没有隔离,至少有一个我知道的其他免费公共电子邮件客户端有这个问题。

仅作比较,这里是使用SSMTP发送的Thunderbird原始消息的相关部分(包括附件):

  

日期:2016年10月17日星期一12:41:00 +0000
  致:recipient@gmail.com
  来自:my.account@gmail.com
  主题:SSMTP附件测试
  消息ID:< 01020157d2a8ce09-de09d6dc-9845-405b-be1c-de31fe3ab5e1-000000@eu-west-1.amazonses.com>
  X-SES-Outgoing:2016.10.17-54.240.4.10
  反馈ID:1.eu-west-1.N9gzKAXN1Z0obJtDShqnt2QFE + TWuvGkNu10M6VFpIM =:AmazonSES

     

这里有一些消息正文......

     

开始664 attach.xml
  M /#] X; 6P @ = F5R< VEO; CU≤(C $ N,%PB(&安培; 5N8V] d:6YG / 5PB551&安培; + 3A和LT;(C \ ^ /% - Ø   米; 65486< ^ 5安培; AI<!R I< R A;!乙834P @ 871T86-H; 65N ="!F; W(@ =安培; AE(&安培;%T =&安培;% C   8:安培; UE; G0 @ =安培; 5S ="`A(3PO4V] M951A9SX *
  `
  端

0 个答案:

没有答案