有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
这是因为您使用了
.emlToMimeMessage(String)
方法,该方法接受一个字符串并假定它应该是 EML 文件的路径。但是,如果您遵循 JavaDoc 线索,您可以读取 String 应该是 EML 数据本身。
如果你想从文件加载,调用带文件的重载版本。所以要解决你的问题:
File emlFile = new File("C:/xyz/a.eml");
Email email = EmailConverter.emlToEmail(emlFile);
我觉得以后String-based的方法应该可以判断它是指一个文件还是包含数据本身,但是现在你可以使用File-based的方法
SimpleMail 和 JavaMail 是两个不同的电子邮件库,具有不同的功能和能力。
SimpleMail 是一个轻量级的邮件库,支持发送和接收邮件,但是没有内置读取eml 文件的支持。另一方面,JavaMail 是一个更全面的电子邮件库,支持广泛的电子邮件相关操作,包括读取 eml 文件。
JavaMail 能够读取eml 文件是因为它有一个MimeMessage 类可以解析和读取eml 文件的内容。这个类在 SimpleMail 中不可用,这就是它无法读取 eml 文件的原因。
总而言之,读取 eml 文件的能力取决于所使用的特定电子邮件库及其提供的功能。