.emlファイルをjavax.mail.messagesにロードします
-
03-10-2019 - |
質問
処理するメソッドをユニットテストしようとしています javax.mail.Message
インスタンス。
私はコンバーターを書き、異なる形式で届く電子メールを変更し、その後、一貫した内部形式に変換されます(MyMessage
)。この変換は通常、電子メールのアドレスレスまたは返信アドレスに依存し、電子メール、主題、およびfrom-addressesの部分は、新しいものを作成するために必要です MyMessage
.
私は地元で保存されている生の電子メールのコレクションを持っています .eml
ファイル、そして私は .eml
ClassPathからファイルを変換します javax.mail.Message
インスタンス。これは可能ですか、もしそうなら、それはどのように行われますか?
解決 2
私の問題は、モキトを使ってock笑したことから生じました javax.mail.Folder
に必要です javax.mail.internet.MimeMessage
'のコンストラクター MimeMessage(Folder, InputStream, int)
. 。これは、コンストラクターを呼び出します javax.mail.Message
Message(Folder, int)
次にアクセスします folder.store.session
. 。これにより、 NullPointerException
コンストラクターによって投げられる MimeMessage
.
解決:
class ClasspathMimeMessage extends MimeMessage {
private ClasspathMimeMessage(Folder folder, InputStream is, int msgnum) throws MessagingException {
super(folder, is, 0);
}
public static MimeMessage create(String resourceName) {
Class<PopEmailMmsReceiverTest> loaderClass = PopEmailMmsReceiverTest.class;
InputStream is = loaderClass.getResourceAsStream(resourceName);
Folder inbox = new MyFolder();
try {
return new ClasspathMimeMessage(inbox, is, 0);
} catch (MessagingException ex) {
throw new RuntimeException("Unable to load email from classpath at " + loaderClass.getResource(resourceName).toString());
}
}
}
class MyFolder extends Folder {
MyFolder() {
super(createMockStore());
}
private static Store createMockStore() {
return mock(Store.class);
}
public void appendMessages(Message[] msgs) throws MessagingException {
}
public void close(boolean expunge) throws MessagingException {
}
public boolean create(int type) throws MessagingException {
return false;
}
public boolean delete(boolean recurse) throws MessagingException {
return false;
}
public boolean exists() throws MessagingException {
return false;
}
public Message[] expunge() throws MessagingException {
return null;
}
public Folder getFolder(String name) throws MessagingException {
return null;
}
public String getFullName() {
return null;
}
public Message getMessage(int msgnum) throws MessagingException {
return null;
}
public int getMessageCount() throws MessagingException {
return 0;
}
public String getName() {
return null;
}
public Folder getParent() throws MessagingException {
return null;
}
public Flags getPermanentFlags() {
return null;
}
public char getSeparator() throws MessagingException {
return 0;
}
public int getType() throws MessagingException {
return 0;
}
public boolean hasNewMessages() throws MessagingException {
return false;
}
public boolean isOpen() {
return false;
}
public Folder[] list(String pattern) throws MessagingException {
return null;
}
public void open(int mode) throws MessagingException {
}
public boolean renameTo(Folder f) throws MessagingException {
return false;
}
}
これは私には非常にugいものに見えますので、誰かがより良い提案をしているなら、私はそれを聞いて喜んでいます。
他のヒント
いくつかのテストの後、私は最終的にを使用してメッセージをロードしました MimeMessage(Session, InputStream)
パブリックコンストラクター(他の応答で引用されたフォルダーベースの保護されたものとは対照的に)。
import java.io.FileInputStream;
import java.io.InputStream;
import javax.mail.internet.MimeMessage;
public class LoadEML {
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream(args[0]);
MimeMessage mime = new MimeMessage(null, is);
System.out.println("Subject: " + mime.getSubject());
}
}