为什么 SimpleMail 不能读取 eml 文件但 java 邮件可以

问题描述 投票:0回答:2

answer给出了读取eml文件的例子。我还找到了另一个使用纯 Java 邮件的 example

下面是我尝试两者的代码。

package mymailRead;

import jakarta.mail.Session;
import jakarta.mail.internet.MimeMessage;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
import org.simplejavamail.api.email.Email;
import org.simplejavamail.converter.EmailConverter;


public class Main {

  public static void main(String[] args) {
    String emlFile = "C:/xyz/a.eml";
    System.out.println("Simple per simplejavamail.org ");
    readWithSimpleMail(emlFile);
//    
    System.out.println("\n Java mail read ");
    readWithRegularMail(emlFile);
  }

  private static void readWithSimpleMail(String emlFile) {
    Email email = EmailConverter.emlToEmail(emlFile);
    System.out.println("From " + email.getFromRecipient());
    System.out.println("Subject " + email.getSubject());
    email.getPlainText();
    System.out.println(" email is " + email);
  }

  private static void readWithRegularMail(String emlFile) {
    try {
      Properties props = System.getProperties();
      props.put("mail.host", "smtp.dummydomain.com");
      props.put("mail.transport.protocol", "smtp");

      Session mailSession = Session.getDefaultInstance(props, null);
      InputStream source = new FileInputStream(emlFile);
      MimeMessage message = new MimeMessage(mailSession, source);

      System.out.println("From : " + message.getFrom()[0]);
      System.out.println("Subject : " + message.getSubject());
      System.out.println("--------------");
      System.out.println("Body : " + message.getContent());
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

下面是build.gradle

apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'application'

mainClassName = 'mymailRead.Main'

repositories {
    mavenCentral()
}

dependencies {
  testImplementation     'junit:junit:4.13'
 
  implementation 'org.simplejavamail:simple-java-mail:8.0.0'
  implementation 'jakarta.mail:jakarta.mail-api:2.1.1'
  implementation 'org.eclipse.angus:jakarta.mail:2.0.1'
  implementation 'jakarta.activation:jakarta.activation-api:2.1.1'
  implementation 'org.slf4j:slf4j-api:2.0.6'
  implementation 'org.slf4j:slf4j-simple:2.0.6'
}

下面是a.eml

X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
Received: from tomts25-srv.bellnexxia.net
        (tomts25.bellnexxia.net [209.226.175.188])
    by tactika.com (8.9.3/8.9.3) with ESMTP id NAA07621
    for <[email protected]>; Sun, 1 Feb 2004 13:25:33 -0500 (EST)
Date: Sun, 01 Feb 2004 13:31:40 -0500
From: real gagnon <[email protected]>
Reply-To: [email protected]
User-Agent: Mozilla/5.0
   (Windows; U; Windows NT 5.1; en-US; rv:1.4)
   Gecko/20030624 Netscape/7.1 (ax)
X-Accept-Language: en-us, en
MIME-Version: 1.0
To: [email protected]
Subject: Example for HowTo
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
X-UIDL: oP#!!c]^!!1;-!!T@1"!


This is an example for HowTo

方法 readWithSimpleMail 返回一个没有填充任何值的电子邮件对象。程序输出如下所示。

Simple per simplejavamail.org 
From null
Subject 
 email is Email{
    id=null
    sentDate=null
    fromRecipient=null,
    replyToRecipient=null,
    bounceToRecipient=null,
    text='null',
    textHTML='null',
    textCalendar='null (method: null)',
    contentTransferEncoding='quoted-printable',
    subject='',
    recipients=[],
    headers={C=[/xyz/a.eml]}
}

 Java mail read 
From : real gagnon <[email protected]>
Subject : Example for HowTo
--------------
Body : 
This is an example for HowTo
jakarta-mail eml apache-commons-email
2个回答
0
投票

这是因为您使用了

.emlToMimeMessage(String)
方法,该方法接受一个字符串并假定它应该是 EML 文件的路径。但是,如果您遵循 JavaDoc 线索,您可以读取 String 应该是 EML 数据本身。

如果你想从文件加载,调用带文件的重载版本。所以要解决你的问题:

File emlFile = new File("C:/xyz/a.eml");
Email email = EmailConverter.emlToEmail(emlFile);

我觉得以后String-based的方法应该可以判断它是指一个文件还是包含数据本身,但是现在你可以使用File-based的方法


-2
投票

SimpleMail 和 JavaMail 是两个不同的电子邮件库,具有不同的功能和能力。

SimpleMail 是一个轻量级的邮件库,支持发送和接收邮件,但是没有内置读取eml 文件的支持。另一方面,JavaMail 是一个更全面的电子邮件库,支持广泛的电子邮件相关操作,包括读取 eml 文件。

JavaMail 能够读取eml 文件是因为它有一个MimeMessage 类可以解析和读取eml 文件的内容。这个类在 SimpleMail 中不可用,这就是它无法读取 eml 文件的原因。

总而言之,读取 eml 文件的能力取决于所使用的特定电子邮件库及其提供的功能。

© www.soinside.com 2019 - 2024. All rights reserved.