Giter Club home page Giter Club logo

msgviewer's Introduction

Hi there 👋

I'm an enthusiast software crafter

Playing around with Java since 2003

Welcome to my GitHub profile !

Feel free to take a look at my flagship projects:

In addition you may find:

  • DDD-AST an utility powering a project business-fitting indicator
  • My attempts at the Advent of Code to practice my problem decomposition skills

There are also some kata for my spare time or for interviews and various personal projects

Newsletter

I'm the author of "While it Compiles", a newsletter in French 🇫🇷:

substack

You may also like

My other social network profiles:

linked-in

medium

x

x

msgviewer's People

Contributors

bopinto avatar cheese1 avatar cybso avatar dependabot[bot] avatar jlleitschuh avatar khaes-kth avatar lolo101 avatar mik0001 avatar renovate-bot avatar renovate[bot] avatar thomaschr avatar trytryagain avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

msgviewer's Issues

Move to log4j 2

log4j 1.2.27 has security flaw and might not be maintained anymore.

Migrate to log4j 2 in order to fix security issue & keep up to date

msg2eml: files with similar but longer names result in being duplicated

When converting a msg with an inline image and an attachment with similar names, they result in being duplicated.

In this example, there are two images.

  1. 2017-10-01 11.23.09.jpg - a simple attachment
  2. 2017-10-03 11.11.25.jpg - used inline.

as they do have similar names and get shortened to the same filename, they then are the same base64.

you will find two times this part in it.

------=_Part_0_926434463.1661862883281
Content-Type: image/jpeg; name=2017-10-.jpg
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=2017-10-.jpg

/9j/4aqnRXhpZgAATU0AKgAAAAgADwEAAAMAAAABD4AAAAEBAAMAAAABC6AAAAECAAMAAAADAAAA
... more base64

don't know if that would happen if it would be two simple attachments, but could be the case too.

I attached a version of what it actually should look like. at least when it comes to the attachments

for me personally, it would be just good if the base64 wouldn't be the same as I actually just use that. but if the file names are not the same too, would be even better :)

Files

Mail with attachment.zip
how it should look like - inline-image.eml.zip

Side note

btw. would be nice to have, if the attachments can get the Content-ID too :) would at least make it a lot easier to work with those files when they are inline.

Emoji not rendered in body panel

Given a message with an emoji in an RTF content such as

{\*\htmltag148 <span style='font-family:"Segoe UI Emoji",sans-serif'>}\htmlrtf {\f4 \htmlrtf0 \u-10179 ?\u-8694 ?
{\*\htmltag156 </span>}\htmlrtf }\htmlrtf0

HTML:

<span style='font-family:"Segoe UI Emoji",sans-serif'>😊</span>

The emoji is not rendered in the panel, although it's proprely rendered in the console

To: and From: missing

Hi,
I am using a simple EML file to test the conversion to msg file, but it seems that To: and From: are missing after the conversion.

Content-Transfer-Encoding: quoted-printable
To: [email protected]
From: Foo [email protected]
Subject: test
Content-Type: text/plain; charset="utf-8"
Mime-Version: 1.0

=C2=A1Test!

Using outlook 2019 I am getting this

msg_conversion

Any hint ?

Thanks

Files with spaces in name...

Hello,
First of all, thank you for maintaining this project, it's the only way to read msg files in linux! :)

I'd just like to report a small bug: if the target msg file has spaces (" ") in its name, then msgviewer will ignore all characters before the space and only read what is after the last space and the file extension. For example:

"This is a file with spaces.msg" will become "spaces.msg".
As a result, msgviewer will die with a File Not Found error, since "spaces.msg" doesn't exist in the file system... :)

Cheers!

Handle named properties

Properties with ID above 0x8000 (inclusive) are named properties.

They are described in the Named Property Mapping Storage "__nameid_version1.0".

See [MS-OXMSG] 2.2.3

Error Message

I'm getting the following error message

Es ist ein Fehler aufgetreten: Encountered
"ri" at line 181, column 21 }.
Was expecting
one of:

"{" ...

Error: java.lang.ClassNotFoundException: javax.activation.DataSource

Hello, thanks for the tool!

Environment

  • Operating System: Linux Mint 19.1 64 bits
  • MsgViewer version: 1.6
  • Java version:
$ java --version
java 11.0.2 2019-01-15 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed mode)

also tested with

$java --version
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment (build 11.0.2+9-Ubuntu-3ubuntu118.04.3)
OpenJDK 64-Bit Server VM (build 11.0.2+9-Ubuntu-3ubuntu118.04.3, mixed mode, sharing)

Bug Description:

While reading this file (20190502_094613_1556783173.7038.msg.zip - zipped due to github format restrictions) I get the following error message:

Exception in thread "pool-1-thread-1" java.lang.NoClassDefFoundError: javax/activation/DataSource
	at net.sourceforge.MSGViewer.factory.MessageParserFactory.saveMBoxFile(MessageParserFactory.java:107)
	at net.sourceforge.MSGViewer.factory.MessageParserFactory.saveMessage(MessageParserFactory.java:90)
	at net.sourceforge.MSGViewer.ViewerPanel$10$1.do_stuff(ViewerPanel.java:799)
	at at.redeye.FrameWork.base.AutoMBox.invoke(AutoMBox.java:64)
	at at.redeye.FrameWork.base.AutoMBox.<init>(AutoMBox.java:50)
	at net.sourceforge.MSGViewer.ViewerPanel$10$1.<init>(ViewerPanel.java:793)
	at net.sourceforge.MSGViewer.ViewerPanel$10.run(ViewerPanel.java:793)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.ClassNotFoundException: javax.activation.DataSource
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 10 more
Exception in thread "pool-1-thread-2" java.lang.NoClassDefFoundError: javax/activation/DataSource
	at net.sourceforge.MSGViewer.factory.MessageParserFactory.saveMBoxFile(MessageParserFactory.java:107)
	at net.sourceforge.MSGViewer.factory.MessageParserFactory.saveMessage(MessageParserFactory.java:90)
	at net.sourceforge.MSGViewer.ViewerPanel$10$1.do_stuff(ViewerPanel.java:799)
	at at.redeye.FrameWork.base.AutoMBox.invoke(AutoMBox.java:64)
	at at.redeye.FrameWork.base.AutoMBox.<init>(AutoMBox.java:50)
	at net.sourceforge.MSGViewer.ViewerPanel$10$1.<init>(ViewerPanel.java:793)
	at net.sourceforge.MSGViewer.ViewerPanel$10.run(ViewerPanel.java:793)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.ClassNotFoundException: javax.activation.DataSource
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 10 more

The main window will open normally, but if I try to open one of the mail attachments (which are actually other attached messages), I get this error dialog:

Screenshot from 2019-05-02 10-53-35

Analysis

I did some research on the error message, and found it to be connected to a missing java module (java.xml.bind), which was deprecated on Java 9 and excluded from Java 11, as described here. Since the library cannot be found, the files for the attachments are never saved in the temp folder, resulting in the error message above.
Since the link also suggests a possible fix, I downloaded MsgViewer source code and changed the pom.xml file to include the suggested dependencies, recompiled the package and tested again. This fixed the error about the library, but introduced another one, while parsing the msg file:

java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
	at java.base/java.util.Objects.checkIndex(Objects.java:372)
	at java.base/java.util.ArrayList.get(ArrayList.java:458)
	at net.sourceforge.MSGViewer.factory.msg.MsgWriter.write(MsgWriter.java:80)
	at net.sourceforge.MSGViewer.factory.MessageParserFactory.saveMsgFile(MessageParserFactory.java:72)
	at net.sourceforge.MSGViewer.factory.MessageParserFactory.saveMessage(MessageParserFactory.java:61)
	at net.sourceforge.MSGViewer.ViewerPanel$9$1.do_stuff(ViewerPanel.java:611)
	at at.redeye.FrameWork.base.AutoMBox.invoke(AutoMBox.java:64)
	at at.redeye.FrameWork.base.AutoMBox.<init>(AutoMBox.java:50)
	at net.sourceforge.MSGViewer.ViewerPanel$9$1.<init>(ViewerPanel.java:605)
	at net.sourceforge.MSGViewer.ViewerPanel$9.run(ViewerPanel.java:605)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

(this error appears twice, since there are two attachments failing).
This time, the tmp files were created, but as empty files.

I cannot continue from this poins - I'm not a Java developer, and couldn't figure out where this error came from, sorry...

Workaround

MsgViewer works just fine on java 8. I was lucky enough that I still had my old Java 8 library, so I'm calling the jar directly using the old java executable, and then it can open the attached files flawlessly.
This said, there is a message on the console that caught my attention, just when it started reading the file:

2019-05-02 11:43:13,318 INFO  (Message.java:197): Could not decompress RTF data java.lang.IllegalArgumentException: compressed-RTF data size mismatch

Could this be related to the error in java 11?

Hope it helps! :)

MSGViewer fails to convert .msg email to either .mbox or *.eml on OS X High Sierra

Runtime: Java(TM) SE Runtime Environment 10+46
System: Mac OS X version 10.13.6 running on x86_64; UTF-8; en_US (nb)

+++

MSGViewer cmd line mail format conversion fails with the following error:

$ java -jar "/Users/user1/NetBeansProjects/MSGViewer/dist/MSGViewer.jar" -msg2mbox *.msg
2018-11-12 15:18:26,128 INFO (CLIFileConverter.java:103): conversion source file: FW_ City of Santa Cruz - Briefing Materials.msg
java.lang.NullPointerExceptionjava.lang.NullPointerException
at net.sourceforge.MSGViewer.CLIFileConverter.processFile(CLIFileConverter.java:114)
at net.sourceforge.MSGViewer.CLIFileConverter.work(CLIFileConverter.java:89)
at net.sourceforge.MSGViewer.ModuleLauncher.invoke(ModuleLauncher.java:80)
at net.sourceforge.MSGViewer.ModuleLauncher.main(ModuleLauncher.java:178)
2018-11-12 15:18:26,137 INFO (CLIFileConverter.java:103): conversion source file: FW_ Quote from Report from City of Santa Cruz - Briefing Materials (1).msg
java.lang.NullPointerExceptionjava.lang.NullPointerException
at net.sourceforge.MSGViewer.CLIFileConverter.processFile(CLIFileConverter.java:114)
at net.sourceforge.MSGViewer.CLIFileConverter.work(CLIFileConverter.java:89)
at net.sourceforge.MSGViewer.ModuleLauncher.invoke(ModuleLauncher.java:80)
at net.sourceforge.MSGViewer.ModuleLauncher.main(ModuleLauncher.java:178)

Opening a *.msg file in the GUI and then saving it back to a .msg works, saved as text. Saving the same file to .mbox or .eml fails with the following error messages, respectively:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/activation/DataSource
at net.sourceforge.MSGViewer.factory.MessageParserFactory.saveMBoxFile(MessageParserFactory.java:107)
at net.sourceforge.MSGViewer.factory.MessageParserFactory.saveMessage(MessageParserFactory.java:90)
at net.sourceforge.MSGViewer.ViewerPanel.exportFile(ViewerPanel.java:887)
at net.sourceforge.MSGViewer.SingleWin$12.do_stuff(SingleWin.java:301)
at at.redeye.FrameWork.base.AutoMBox.invoke(AutoMBox.java:64)
at at.redeye.FrameWork.base.AutoMBox.(AutoMBox.java:50)
at net.sourceforge.MSGViewer.SingleWin$12.(SingleWin.java:287)
at net.sourceforge.MSGViewer.SingleWin.jMFileSaveActionPerformed(SingleWin.java:287)
at net.sourceforge.MSGViewer.SingleWin.access$400(SingleWin.java:31)
at net.sourceforge.MSGViewer.SingleWin$4.actionPerformed(SingleWin.java:146)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.AbstractButton.doClick(AbstractButton.java:369)
at java.desktop/javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:980)
at java.desktop/com.apple.laf.AquaMenuItemUI.doClick(AquaMenuItemUI.java:157)
at java.desktop/javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1024)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6589)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6354)
at java.desktop/java.awt.Container.processEvent(Container.java:2260)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4966)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2318)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4798)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4906)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2304)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4798)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue.access$600(EventQueue.java:97)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: javax.activation.DataSource
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
... 49 more

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/activation/DataSource
at net.sourceforge.MSGViewer.factory.MessageParserFactory.saveEMLFile(MessageParserFactory.java:120)
at net.sourceforge.MSGViewer.factory.MessageParserFactory.saveMessage(MessageParserFactory.java:92)
at net.sourceforge.MSGViewer.ViewerPanel.exportFile(ViewerPanel.java:887)
at net.sourceforge.MSGViewer.SingleWin$12.do_stuff(SingleWin.java:301)
at at.redeye.FrameWork.base.AutoMBox.invoke(AutoMBox.java:64)
at at.redeye.FrameWork.base.AutoMBox.(AutoMBox.java:50)
at net.sourceforge.MSGViewer.SingleWin$12.(SingleWin.java:287)
at net.sourceforge.MSGViewer.SingleWin.jMFileSaveActionPerformed(SingleWin.java:287)
at net.sourceforge.MSGViewer.SingleWin.access$400(SingleWin.java:31)
at net.sourceforge.MSGViewer.SingleWin$4.actionPerformed(SingleWin.java:146)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.AbstractButton.doClick(AbstractButton.java:369)
at java.desktop/javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:980)
at java.desktop/com.apple.laf.AquaMenuItemUI.doClick(AquaMenuItemUI.java:157)
at java.desktop/javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1024)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6589)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6354)
at java.desktop/java.awt.Container.processEvent(Container.java:2260)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4966)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2318)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4798)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4906)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2304)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4798)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue.access$600(EventQueue.java:97)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: javax.activation.DataSource
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
... 49 more

In russian locale Windows I can`t get attachment file with cyrillic name.

File with cyrillic name saves to \users\appdata......\tmp\filename.doc (for examp) but can`t open it.
I have this output in cmd:

2019-04-02 14:29:12,872 INFO (ViewerPanel.java:665): app
lication/octet-stream
2019-04-02 14:29:12,872 INFO (ViewerPanel.java:665): application/pdf
2019-04-02 14:29:23,008 INFO (ViewerPanel.java:441): file://%D0%9A%D0%B0%D1%80%
D1%82%D0%BE%D1%87%D0%BA%D0%B0+%D0%A2%D0%94+%D0%90%D0%BA%D1%82.doc
2019-04-02 14:29:23,008 INFO (ViewerHelper.java:242): opening ¶р®™юҐър T- Lъ™.d
oc
2019-04-02 14:29:23,008 INFO (ViewerPanel.java:495): opening: C:\Users\sysadmin
\AppData\Local\Temp\2\xxxx7217742277775047212.tmp\¶р®™юҐър T- Lъ™.doc
2019-04-02 14:29:23,008 DEBUG (ViewerPanel.java:499): shell exec returned: 0

Exception: Encountered <C_ESC_STRING>, Expected <STRING>

I've got a mail which throws the following error:

2022-09-19T12:07:32,092 ERROR (AutoMBox.java:43): Exception: net.sourceforge.MSGViewer.rtfparser.ParseException: Encountered " <C_ESC_STRING> "\\\'b7 "" at line 608, column 160.
Was expecting:
    <STRING> ...

net.sourceforge.MSGViewer.rtfparser.ParseException: Encountered " <C_ESC_STRING> "\\\'b7 "" at line 608, column 160.
Was expecting:
    <STRING> ...

        at net.sourceforge.MSGViewer.rtfparser.RTFParser.generateParseException(RTFParser.java:394) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.rtfparser.RTFParser.jj_consume_token(RTFParser.java:332) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.rtfparser.RTFParser.unicode_char(RTFParser.java:210) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.rtfparser.RTFParser.group(RTFParser.java:172) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.rtfparser.RTFParser.group(RTFParser.java:184) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.rtfparser.RTFParser.group(RTFParser.java:184) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.rtfparser.RTFParser.group(RTFParser.java:184) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.rtfparser.RTFParser.parse(RTFParser.java:34) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.HtmlFromRtf.extractHtml(HtmlFromRtf.java:49) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.HtmlFromRtf.<init>(HtmlFromRtf.java:13) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerHelper.extractHTMLFromRTF(ViewerHelper.java:88) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.lambda$bodyText$1(ViewerPanel.java:343) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.resultOrElse(AutoMBox.java:41) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.bodyText(ViewerPanel.java:344) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.updateBody(ViewerPanel.java:324) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.doParse(ViewerPanel.java:430) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.lambda$new$0(AutoMBox.java:18) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.resultOrElse(AutoMBox.java:41) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.run(AutoMBox.java:59) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.parse(ViewerPanel.java:420) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.view(ViewerPanel.java:106) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.SingleWin.openFile(SingleWin.java:33) ~[msgviewer.jar:?]
        at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[?:?]
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[?:?]
        at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[?:?]
        at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[?:?]
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[?:?]
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[?:?]
        at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[?:?]
        at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[?:?]
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
        at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[?:?]
        at net.sourceforge.MSGViewer.ModuleLauncher.invokeGui(ModuleLauncher.java:108) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ModuleLauncher.invoke(ModuleLauncher.java:64) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ModuleLauncher.main(ModuleLauncher.java:27) ~[msgviewer.jar:?]

I can't provide the mail because it's private. Just wanted to open the issue so that we can track it. Maybe I'll find it myself.
Any ideas from the top of your head?

Build is broken

Hey
Unfortunately despite having Maven and Java 11+ installed the build does not work because of dependencies that are not available in maven central.
Could you make those public or remove them from the project?

[INFO] ----------------< net.sourceforge.msgviewer:msgviewer >-----------------
[INFO] Building MSGViewer 1.8.0-SNAPSHOT                                  [4/4]
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] The POM for at.redeye.Plugins:ShellExec:jar:1.0.0 is missing, no dependency information available
[WARNING] The POM for at.redeye.Plugins:CommonsLang:jar:1.0.0 is missing, no dependency information available
[WARNING] The POM for at.redeye.Plugins:JerichoHtml:jar:1.0.0 is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for parent 1.8.0-SNAPSHOT:
[INFO] 
[INFO] parent ............................................. SUCCESS [  2.986 s]
[INFO] FrameWorkMinimized ................................. SUCCESS [  1.066 s]
[INFO] msgparser .......................................... SUCCESS [  0.046 s]
[INFO] MSGViewer .......................................... FAILURE [  0.071 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.258 s
[INFO] Finished at: 2019-09-30T11:04:40+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project msgviewer: Could not resolve dependencies for project net.sourceforge.msgviewer:msgviewer:jar:1.8.0-SNAPSHOT: The following artifacts could not be resolved: at.redeye.Plugins:ShellExec:jar:1.0.0, at.redeye.Plugins:CommonsLang:jar:1.0.0, at.redeye.Plugins:JerichoHtml:jar:1.0.0: Failure to find at.redeye.Plugins:ShellExec:jar:1.0.0 in http://customnexus was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced -> [Help 1]

Cannot open a specific msg file

For only on msg file i'm getting an error and this file is readable but MS Outlook.

java -jar msgviewer.jar d.msg

14:30:26.187 [AWT-EventQueue-0] ERROR net.sourceforge.MSGViewer.MainWin - Exception: java.lang.RuntimeException: Unclosed block
Unclosed block
java.lang.RuntimeException: Unclosed block
        at javax.swing.text.html.CSSParser.parseTillClosed(CSSParser.java:463) ~[?:?]
        at javax.swing.text.html.CSSParser.parseAtRule(CSSParser.java:236) ~[?:?]
        at javax.swing.text.html.CSSParser.getNextStatement(CSSParser.java:174) ~[?:?]
        at javax.swing.text.html.CSSParser.parse(CSSParser.java:153) ~[?:?]
        at javax.swing.text.html.StyleSheet$CssParser.parse(StyleSheet.java:3258) ~[?:?]
        at javax.swing.text.html.StyleSheet.addRule(StyleSheet.java:314) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader.addCSSRules(HTMLDocument.java:4071) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader$HeadAction.end(HTMLDocument.java:3182) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader.handleEndTag(HTMLDocument.java:2897) ~[?:?]
        at javax.swing.text.html.parser.DocumentParser.handleEndTag(DocumentParser.java:253) ~[?:?]
        at javax.swing.text.html.parser.Parser.parse(Parser.java:2394) ~[?:?]
        at javax.swing.text.html.parser.DocumentParser.parse(DocumentParser.java:135) ~[?:?]
        at javax.swing.text.html.parser.ParserDelegator.parse(ParserDelegator.java:113) ~[?:?]
        at javax.swing.text.html.HTMLEditorKit.read(HTMLEditorKit.java:263) ~[?:?]
        at javax.swing.JEditorPane.setText(JEditorPane.java:1428) ~[?:?]
        at net.sourceforge.MSGViewer.ViewerPanel.updateBody(ViewerPanel.java:336) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.parse_int(ViewerPanel.java:606) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel$3.do_stuff(ViewerPanel.java:444) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.invoke(AutoMBox.java:64) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.<init>(AutoMBox.java:50) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel$3.<init>(ViewerPanel.java:440) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.parse(ViewerPanel.java:440) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.SingleWin.lambda$new$0(SingleWin.java:56) ~[msgviewer.jar:?]
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) [?:?]
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770) [?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:721) [?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:715) [?:?]
        at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) [?:?]
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:740) [?:?]
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [?:?]
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) [?:?]
2021-03-16T14:30:26,187 ERROR (AutoMBox.java:67): Exception: java.lang.RuntimeException: Unclosed block
Unclosed block
java.lang.RuntimeException: Unclosed block
        at javax.swing.text.html.CSSParser.parseTillClosed(CSSParser.java:463) ~[?:?]
        at javax.swing.text.html.CSSParser.parseAtRule(CSSParser.java:236) ~[?:?]
        at javax.swing.text.html.CSSParser.getNextStatement(CSSParser.java:174) ~[?:?]
        at javax.swing.text.html.CSSParser.parse(CSSParser.java:153) ~[?:?]
        at javax.swing.text.html.StyleSheet$CssParser.parse(StyleSheet.java:3258) ~[?:?]
        at javax.swing.text.html.StyleSheet.addRule(StyleSheet.java:314) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader.addCSSRules(HTMLDocument.java:4071) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader$HeadAction.end(HTMLDocument.java:3182) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader.handleEndTag(HTMLDocument.java:2897) ~[?:?]
        at javax.swing.text.html.parser.DocumentParser.handleEndTag(DocumentParser.java:253) ~[?:?]
        at javax.swing.text.html.parser.Parser.parse(Parser.java:2394) ~[?:?]
        at javax.swing.text.html.parser.DocumentParser.parse(DocumentParser.java:135) ~[?:?]
        at javax.swing.text.html.parser.ParserDelegator.parse(ParserDelegator.java:113) ~[?:?]
        at javax.swing.text.html.HTMLEditorKit.read(HTMLEditorKit.java:263) ~[?:?]
        at javax.swing.JEditorPane.setText(JEditorPane.java:1428) ~[?:?]
        at net.sourceforge.MSGViewer.ViewerPanel.updateBody(ViewerPanel.java:336) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.parse_int(ViewerPanel.java:606) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel$3.do_stuff(ViewerPanel.java:444) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.invoke(AutoMBox.java:64) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.<init>(AutoMBox.java:50) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel$3.<init>(ViewerPanel.java:440) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.parse(ViewerPanel.java:440) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.SingleWin.lambda$new$0(SingleWin.java:56) ~[msgviewer.jar:?]
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) [?:?]
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770) [?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:721) [?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:715) [?:?]
        at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) [?:?]
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:740) [?:?]
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [?:?]
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) [?:?]
2021-03-16T14:30:26,187 ERROR (AutoMBox.java:67): Exception: java.lang.RuntimeException: Unclosed block
Unclosed block
java.lang.RuntimeException: Unclosed block
        at javax.swing.text.html.CSSParser.parseTillClosed(CSSParser.java:463) ~[?:?]
        at javax.swing.text.html.CSSParser.parseAtRule(CSSParser.java:236) ~[?:?]
        at javax.swing.text.html.CSSParser.getNextStatement(CSSParser.java:174) ~[?:?]
        at javax.swing.text.html.CSSParser.parse(CSSParser.java:153) ~[?:?]
        at javax.swing.text.html.StyleSheet$CssParser.parse(StyleSheet.java:3258) ~[?:?]
        at javax.swing.text.html.StyleSheet.addRule(StyleSheet.java:314) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader.addCSSRules(HTMLDocument.java:4071) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader$HeadAction.end(HTMLDocument.java:3182) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader.handleEndTag(HTMLDocument.java:2897) ~[?:?]
        at javax.swing.text.html.parser.DocumentParser.handleEndTag(DocumentParser.java:253) ~[?:?]
        at javax.swing.text.html.parser.Parser.parse(Parser.java:2394) ~[?:?]
        at javax.swing.text.html.parser.DocumentParser.parse(DocumentParser.java:135) ~[?:?]
        at javax.swing.text.html.parser.ParserDelegator.parse(ParserDelegator.java:113) ~[?:?]
        at javax.swing.text.html.HTMLEditorKit.read(HTMLEditorKit.java:263) ~[?:?]
        at javax.swing.JEditorPane.setText(JEditorPane.java:1428) ~[?:?]
        at net.sourceforge.MSGViewer.ViewerPanel.updateBody(ViewerPanel.java:336) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.parse_int(ViewerPanel.java:606) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel$3.do_stuff(ViewerPanel.java:444) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.invoke(AutoMBox.java:64) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.<init>(AutoMBox.java:50) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel$3.<init>(ViewerPanel.java:440) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.parse(ViewerPanel.java:440) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.SingleWin.lambda$new$0(SingleWin.java:56) ~[msgviewer.jar:?]
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) [?:?]
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770) [?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:721) [?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:715) [?:?]
        at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) [?:?]
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:740) [?:?]
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [?:?]
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) [?:?]
2021-03-16T14:30:26,187 ERROR (AutoMBox.java:67): Exception: java.lang.RuntimeException: Unclosed block
Unclosed block
java.lang.RuntimeException: Unclosed block
        at javax.swing.text.html.CSSParser.parseTillClosed(CSSParser.java:463) ~[?:?]
        at javax.swing.text.html.CSSParser.parseAtRule(CSSParser.java:236) ~[?:?]
        at javax.swing.text.html.CSSParser.getNextStatement(CSSParser.java:174) ~[?:?]
        at javax.swing.text.html.CSSParser.parse(CSSParser.java:153) ~[?:?]
        at javax.swing.text.html.StyleSheet$CssParser.parse(StyleSheet.java:3258) ~[?:?]
        at javax.swing.text.html.StyleSheet.addRule(StyleSheet.java:314) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader.addCSSRules(HTMLDocument.java:4071) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader$HeadAction.end(HTMLDocument.java:3182) ~[?:?]
        at javax.swing.text.html.HTMLDocument$HTMLReader.handleEndTag(HTMLDocument.java:2897) ~[?:?]
        at javax.swing.text.html.parser.DocumentParser.handleEndTag(DocumentParser.java:253) ~[?:?]
        at javax.swing.text.html.parser.Parser.parse(Parser.java:2394) ~[?:?]
        at javax.swing.text.html.parser.DocumentParser.parse(DocumentParser.java:135) ~[?:?]
        at javax.swing.text.html.parser.ParserDelegator.parse(ParserDelegator.java:113) ~[?:?]
        at javax.swing.text.html.HTMLEditorKit.read(HTMLEditorKit.java:263) ~[?:?]
        at javax.swing.JEditorPane.setText(JEditorPane.java:1428) ~[?:?]
        at net.sourceforge.MSGViewer.ViewerPanel.updateBody(ViewerPanel.java:336) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.parse_int(ViewerPanel.java:606) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel$3.do_stuff(ViewerPanel.java:444) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.invoke(AutoMBox.java:64) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.<init>(AutoMBox.java:50) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel$3.<init>(ViewerPanel.java:440) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.parse(ViewerPanel.java:440) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.SingleWin.lambda$new$0(SingleWin.java:56) ~[msgviewer.jar:?]
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) [?:?]
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770) [?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:721) [?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:715) [?:?]
        at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) [?:?]
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:740) [?:?]
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [?:?]
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) [?:?]

Is there a license for the project?

Thanks for continuing this great and helpful project!

I was looking into packaging it as a Homebrew formula, to ease the installation.
But all projects included in the homebrew-core repository need to specify their license (see the Formula Cookbook for more information).

But I could not find any license information in the project, so I wanted to ask, if the project is published under a specific open source license?

Navigation menu enabled on wrong window on drag'n'drop

Given a window with a eml or mbox message open, the Navigation menu is disabled.
When a user drag'n'drop a msg file on the window, a new window opens with the message content, but the Navigation menu is enabled in the previous window with the eml or mbox message

self compiled version won't start - setOpenURL - NoSuchMethodError

Can anyone tell me why this happens?

>java -jar msgviewer.jar
WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
Exception in thread "main" java.lang.NoSuchMethodError: at/redeye/FrameWork/widgets/helpwindow/HyperlinkExecuter.setOpenUrl(Lat/redeye/FrameWork/widgets/helpwindow/OpenUrlInterface;)V 
(loaded from file:msgviewer.jar by jdk.internal.loader.ClassLoaders$AppClassLoader@65d1339b) 
called from class at.redeye.Plugins.ShellExec.Plugin (loaded from file:msgviewer.jar by jdk.internal.loader.ClassLoaders$AppClassLoader@65d1339b).

Starting the Release Version works just fine.
I compiled with openjdk 18 on a fresh Ubuntu 22.04

Cannot open PDF file attachment

With 1.7.0 I cannot open PDF files attachment. It's working fine with 1.6.0.

There's no error message or anything, it's just not opening.

Thank you

Compile MsgViewer on Windows 10

Hello
I'm trying to compile MsgViewer on Windows 10 and I'm getting this error message. When compiling on Ubuntu 20.04 I do not get this message. My goal is to create an installation for Windows with InnoSetup. Creating the required path "file:/tmp/xxx.tmp/" on Windows did not help. I am using Apache NetBeams 12.5 and Java amazon-corretto-11.0.13.8.1-windows-x64.

Can I ask for advice on where to look for the source of the difficulty?


Test set: net.sourceforge.MSGViewer.PrepareImagesTest

Tests run: 2, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 1.554 s <<< FAILURE! - in net.sourceforge.MSGViewer.PrepareImagesTest
net.sourceforge.MSGViewer.PrepareImagesTest.should_replace_images_sources_with_relative_path Time elapsed: 1.507 s <<< FAILURE!
org.opentest4j.AssertionFailedError: expected: <> but was: <>
at net.sourceforge.MSGViewer.PrepareImagesTest.should_replace_images_sources_with_relative_path(PrepareImagesTest.java:37)

net.sourceforge.MSGViewer.PrepareImagesTest.should_replace_images_sources_with_content_id Time elapsed: 0.005 s <<< FAILURE!
org.opentest4j.AssertionFailedError: expected: <> but was: <>
at net.sourceforge.MSGViewer.PrepareImagesTest.should_replace_images_sources_with_content_id(PrepareImagesTest.java:27)


BUILD FAILURE

--- maven-surefire-plugin:3.0.0-M5:test (default-test) @ msgviewer ---
file.encoding cannot be set as system property, use -Dfile.encoding=... instead

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M5:test (default-test) on project msgviewer: There are test failures.

Please refer to C:\Users\novakl1\OneDrive - Colas\Dokumenty\MsgViewer\MSGViewer\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
-> [Help 1]

To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.

For more information about the errors and possible solutions, please read the following articles:
[Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

After correcting the problems, you can resume the build with the command
mvn -rf :msgviewer

Thank you in advance for your help novaklu

msg2eml / msg2mbox - "quoted-printable" chars are all the same in html

Hey, me again.
we got hands on a rather weird msg (actually multiple) where umlaute, or any char that needs to be encoded slightly differently, is correct in the RTF and text portion, but the HTML gets them all encoded with the same char.
for example, in the text, there is

Mit freundlichen Gr=C3=BC=C3=9Fen

Herr Sch=C3=A4fer

which will result in

Mit freundlichen Grüßen

Herr Schäfer

but in the HTML, it then looks like

Mit freundlichen Gr=EF=BF=BD=EF=BF=BDen

Herr Sch=EF=BF=BDfer

as you can see, it has always =EF=BF=BD set instead of the actual encoded version. if you then display the HTML, it looks like
image

this happens when you use the GUI version and select text too.

let me know if you need the msg, as that msg, in particular, shouldn't be shared (that) publically 😅 maybe you already have an idea of what might be the issue here.

Global configuration

The application can be configured with user configuration file in $HOME/.MSGViewer

It would be nice to have a global configuration file under /etc/MSGViewer (on *nix platform) for cases where the application is not user-specific

Some MSG Files cause 'Cannot invoke "String.length()" because "s" is null'

Hey,
when I run this command (file at the bottom)

$ java -jar msgviewer.jar -msg2eml testing.msg

I get following error on mac and on ubuntu but without the Cannot invoke "String.length()" because "s" is null

java.lang.NullPointerException: Cannot invoke "String.length()" because "s" is null
	at javax.mail.internet.MimeUtility.checkAscii(MimeUtility.java:1413)
	at javax.mail.internet.MimeUtility.encodeWord(MimeUtility.java:712)
	at javax.mail.internet.MimeUtility.encodeText(MimeUtility.java:520)
	at net.sourceforge.MSGViewer.factory.mbox.MBoxWriterViaJavaMail.write(MBoxWriterViaJavaMail.java:80)
	at net.sourceforge.MSGViewer.factory.MessageSaver.write(MessageSaver.java:60)
	at net.sourceforge.MSGViewer.factory.MessageSaver.saveEMLFile(MessageSaver.java:54)
	at net.sourceforge.MSGViewer.factory.MessageSaver.saveMessage(MessageSaver.java:32)
	at net.sourceforge.MSGViewer.CLIFileConverter.processFile(CLIFileConverter.java:102)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at net.sourceforge.MSGViewer.CLIFileConverter.work(CLIFileConverter.java:76)
	at net.sourceforge.MSGViewer.ModuleLauncher.invoke(ModuleLauncher.java:62)
	at net.sourceforge.MSGViewer.ModuleLauncher.main(ModuleLauncher.java:27)

This is only happening with some MSGs files.
Tested it with the current release and with a build of the master branch.

System Info

# MacOS
$ java -version

openjdk version "18.0.2" 2022-07-19
OpenJDK Runtime Environment Homebrew (build 18.0.2+0)
OpenJDK 64-Bit Server VM Homebrew (build 18.0.2+0, mixed mode, sharing)

# Ubuntu
$ java -version

openjdk version "11.0.16" 2022-07-19
OpenJDK Runtime Environment (build 11.0.16+8-post-Ubuntu-0ubuntu120.04)
OpenJDK 64-Bit Server VM (build 11.0.16+8-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)

Files

Zipped Msg File:
testing.zip

Hope you can help :)

Set RTF/Text via parameter

The option "RTF/Text" should be adjustable via parameter, e.g. : -text
If this parameter is not set, "RTF" is default, if possible.

Images cannot be seen using openjdk

Hello!
I am using this software to open .msg files and I tested this with Java and it works fine! But when I use openjdk the images cannot be seen.
I was modifying the application parameters without success
Could you see this bug please?

Thanks in advance
Best regards.

msg2eml: html displays internal msg styling

Some MSGs when converting to EML do get styling information that seems like it would be the internal ones from how MSG itself encodes it.

This is how it is looking in the EML (from the test file)

{\rtf1\ansi\ansicpg1252\fromtext \fbidis \deff0{\fonttbl

{\f0\fswiss\fcharset0 Arial;}

{\f1\fmodern Courier New;}

{\f2\fnil\fcharset2 Symbol;}

{\f3\fmodern\fcharset0 Courier New;}}

{\colortbl\red0\green0\blue0;\red0\green0\blue255;}

\uc1\pard\plain\deftab360 \f0\fs20 \par

\par

\par

Mit sonnigen Gr\'fc\'dfen\par

\par

Oliver Ermisch\par

\par

while the text version of it is just

Mit sonnigen Gr=C3=BC=C3=9Fen

Oliver Ermisch

for a workaround, I currently just check if {\ is in the HTML version, and if so I just use the text version. which isn't ideal, but does work for the need that I have. So not an important issue, in my opinion, just something I noticed.

Test File

html-formatting.msg.zip

.MSG Conversion to JSON

Hi there -

Thanks for this awesome library! By chance, is there functionality here to convert a .msg file's contents to JSON?

Errors by installing Maven with $ ./mvnw package

Dear community,

I had successfully installed MsgViewer on this same laptop before under Ubuntu 20.04.
Now I have done a fresh install of Ubuntu 22.04.

Ran the following command lines successfully:

$ sudo apt install openjdk-11-jre-headless
$ sudo apt install maven
$ sudo apt install git
$ git clone https://github.com/lolo101/MsgViewer.git
$ cd MsgViewer

Java is correctly installed:
$ java -version
openjdk version "11.0.15" 2022-04-19 OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.22.04.1) OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.22.04.1, mixed mode, sharing)

Now when running the Maven install:
$ ./mvnw package
I get error notifications:

[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.44 s - in at.redeye.FrameWork.base.UniqueDialogHelperTest
[INFO] Running at.redeye.FrameWork.base.bindtypes.DBStringTest
[INFO] Tests run: 29, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.088 s - in at.redeye.FrameWork.base.bindtypes.DBStringTest
[INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR] UniqueDialogHelperTest$WhenDialogAlreadyInvoked.:40 NoClassDefFound Could not initialize class at.redeye.FrameWork.base.BaseDialogDialog
[ERROR] UniqueDialogHelperTest$WhenDialogAlreadyInvoked.:40 NoClassDefFound Could not initialize class at.redeye.FrameWork.base.BaseDialogDialog
[ERROR] UniqueDialogHelperTest.should_return_dialog_instance:18 » UnsatisfiedLink Can't load library: /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt_xawt.so
[INFO]
[ERROR] Tests run: 66, Failures: 0, Errors: 3, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for parent 1.8.6-SNAPSHOT:
[INFO]
[INFO] parent ............................................. SUCCESS [ 0.147 s]
[INFO] FrameWorkMinimized ................................. FAILURE [ 2.200 s]
[INFO] msgparser .......................................... SKIPPED
[INFO] MSGViewer .......................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.410 s
[INFO] Finished at: 2022-06-19T09:43:58+03:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M7:test (default-test) on project FrameWorkMinimized:
[ERROR]
[ERROR] Please refer to /home/nicolas/MsgViewer/FrameWorkMinimized/target/surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :FrameWorkMinimized

The required file is not installed:
$ cd MsgViewer/MSGViewer/target
bash: MsgViewer/MSGViewer/target: No such file or directory
Can anyone please help fixing these errors?

java.lang.NullPointerException

I got following exception while opening a msg file with attachments.

2022-06-21T18:45:08,208 ERROR (AutoMBox.java:30): Exception: java.lang.NullPointerException
null
java.lang.NullPointerException: null
        at sun.nio.fs.UnixPath.normalizeAndCheck(UnixPath.java:75) ~[?:?]
        at sun.nio.fs.UnixPath.<init>(UnixPath.java:69) ~[?:?]
        at sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:279) ~[?:?]
        at java.nio.file.Path.resolve(Path.java:515) ~[?:?]
        at net.sourceforge.MSGViewer.ViewerHelper.getTempFile(ViewerHelper.java:154) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerHelper.getTempFile(ViewerHelper.java:144) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.printFileAttachment(ViewerPanel.java:525) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.printAttachment(ViewerPanel.java:515) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.printAttachments(ViewerPanel.java:508) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.headerHtml(ViewerPanel.java:471) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.updateHeader(ViewerPanel.java:460) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.doParse(ViewerPanel.java:437) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.invoke(AutoMBox.java:27) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.<init>(AutoMBox.java:18) ~[msgviewer.jar:?]
        at at.redeye.FrameWork.base.AutoMBox.<init>(AutoMBox.java:22) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.parse(ViewerPanel.java:428) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.ViewerPanel.view(ViewerPanel.java:105) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.EditorDropTarget.lambda$dropFile$0(EditorDropTarget.java:149) ~[msgviewer.jar:?]
        at java.util.ArrayList.forEach(ArrayList.java:1541) ~[?:?]
        at net.sourceforge.MSGViewer.EditorDropTarget.dropFile(EditorDropTarget.java:147) ~[msgviewer.jar:?]
        at net.sourceforge.MSGViewer.EditorDropTarget.drop(EditorDropTarget.java:77) ~[msgviewer.jar:?]

To track what's going on, I added a System.out.printf here

    public static Pid from(int id, Ptyp typ) {
        System.out.printf("Parsing Pid: %d, 0x%X, typ: %s\n", id, id, typ.name());
        return Arrays.stream(Pid.values())
                .filter(value -> value.id == id)
                .filter(value -> value.typ == typ)
                .findFirst()
                .orElse(Unknown);
    }

which got following output for my msg file

Parsing Pid: 3093, 0xC15, typ: PtypInteger32
Parsing Pid: 3599, 0xE0F, typ: PtypBoolean
Parsing Pid: 4089, 0xFF9, typ: PtypBinary
Parsing Pid: 4094, 0xFFE, typ: PtypInteger32
Parsing Pid: 4095, 0xFFF, typ: PtypBinary
Parsing Pid: 12289, 0x3001, typ: PtypString8
Parsing Pid: 12290, 0x3002, typ: PtypString8
Parsing Pid: 12291, 0x3003, typ: PtypString8
Parsing Pid: 12299, 0x300B, typ: PtypBinary
Parsing Pid: 14592, 0x3900, typ: PtypInteger32
Parsing Pid: 14846, 0x39FE, typ: PtypString8
Parsing Pid: 14847, 0x39FF, typ: PtypString8
Parsing Pid: 14848, 0x3A00, typ: PtypString8
Parsing Pid: 14880, 0x3A20, typ: PtypString8
Parsing Pid: 14912, 0x3A40, typ: PtypBoolean
Parsing Pid: 14961, 0x3A71, typ: PtypInteger32
Parsing Pid: 15617, 0x3D01, typ: PtypBinary
Parsing Pid: 24542, 0x5FDE, typ: PtypInteger32
Parsing Pid: 24543, 0x5FDF, typ: PtypInteger32
Parsing Pid: 24566, 0x5FF6, typ: PtypString8
Parsing Pid: 24567, 0x5FF7, typ: PtypBinary
Parsing Pid: 24573, 0x5FFD, typ: PtypInteger32
Parsing Pid: 24575, 0x5FFF, typ: PtypInteger32
Parsing Pid: 4086, 0xFF6, typ: PtypBinary
Parsing Pid: 12288, 0x3000, typ: PtypInteger32
Parsing Pid: 3093, 0xC15, typ: PtypInteger32
Parsing Pid: 3599, 0xE0F, typ: PtypBoolean
Parsing Pid: 4089, 0xFF9, typ: PtypBinary
Parsing Pid: 4094, 0xFFE, typ: PtypInteger32
Parsing Pid: 4095, 0xFFF, typ: PtypBinary
Parsing Pid: 12289, 0x3001, typ: PtypString8
Parsing Pid: 12290, 0x3002, typ: PtypString8
Parsing Pid: 12291, 0x3003, typ: PtypString8
Parsing Pid: 12299, 0x300B, typ: PtypBinary
Parsing Pid: 14592, 0x3900, typ: PtypInteger32
Parsing Pid: 14597, 0x3905, typ: PtypInteger32
Parsing Pid: 14846, 0x39FE, typ: PtypString8
Parsing Pid: 14847, 0x39FF, typ: PtypString8
Parsing Pid: 14848, 0x3A00, typ: PtypString8
Parsing Pid: 14880, 0x3A20, typ: PtypString8
Parsing Pid: 14912, 0x3A40, typ: PtypBoolean
Parsing Pid: 14961, 0x3A71, typ: PtypInteger32
Parsing Pid: 15617, 0x3D01, typ: PtypBinary
Parsing Pid: 24542, 0x5FDE, typ: PtypInteger32
Parsing Pid: 24543, 0x5FDF, typ: PtypInteger32
Parsing Pid: 24555, 0x5FEB, typ: PtypInteger32
Parsing Pid: 24559, 0x5FEF, typ: PtypInteger32
Parsing Pid: 24562, 0x5FF2, typ: PtypInteger32
Parsing Pid: 24565, 0x5FF5, typ: PtypInteger32
Parsing Pid: 24566, 0x5FF6, typ: PtypString8
Parsing Pid: 24567, 0x5FF7, typ: PtypBinary
Parsing Pid: 24573, 0x5FFD, typ: PtypInteger32
Parsing Pid: 24575, 0x5FFF, typ: PtypInteger32
Parsing Pid: 4086, 0xFF6, typ: PtypBinary
Parsing Pid: 12288, 0x3000, typ: PtypInteger32
Parsing Pid: 3093, 0xC15, typ: PtypInteger32
Parsing Pid: 3599, 0xE0F, typ: PtypBoolean
Parsing Pid: 4089, 0xFF9, typ: PtypBinary
Parsing Pid: 4094, 0xFFE, typ: PtypInteger32
Parsing Pid: 4095, 0xFFF, typ: PtypBinary
Parsing Pid: 12289, 0x3001, typ: PtypString8
Parsing Pid: 12290, 0x3002, typ: PtypString8
Parsing Pid: 12291, 0x3003, typ: PtypString8
Parsing Pid: 12299, 0x300B, typ: PtypBinary
Parsing Pid: 14592, 0x3900, typ: PtypInteger32
Parsing Pid: 14846, 0x39FE, typ: PtypString8
Parsing Pid: 14847, 0x39FF, typ: PtypString8
Parsing Pid: 14880, 0x3A20, typ: PtypString8
Parsing Pid: 14912, 0x3A40, typ: PtypBoolean
Parsing Pid: 14961, 0x3A71, typ: PtypInteger32
Parsing Pid: 15617, 0x3D01, typ: PtypBinary
Parsing Pid: 24542, 0x5FDE, typ: PtypInteger32
Parsing Pid: 24543, 0x5FDF, typ: PtypInteger32
Parsing Pid: 24555, 0x5FEB, typ: PtypInteger32
Parsing Pid: 24559, 0x5FEF, typ: PtypInteger32
Parsing Pid: 24562, 0x5FF2, typ: PtypInteger32
Parsing Pid: 24565, 0x5FF5, typ: PtypInteger32
Parsing Pid: 24566, 0x5FF6, typ: PtypString8
Parsing Pid: 24567, 0x5FF7, typ: PtypBinary
Parsing Pid: 24573, 0x5FFD, typ: PtypInteger32
Parsing Pid: 24575, 0x5FFF, typ: PtypInteger32
Parsing Pid: 4086, 0xFF6, typ: PtypBinary
Parsing Pid: 12288, 0x3000, typ: PtypInteger32
Parsing Pid: 3093, 0xC15, typ: PtypInteger32
Parsing Pid: 3599, 0xE0F, typ: PtypBoolean
Parsing Pid: 4089, 0xFF9, typ: PtypBinary
Parsing Pid: 4094, 0xFFE, typ: PtypInteger32
Parsing Pid: 4095, 0xFFF, typ: PtypBinary
Parsing Pid: 12289, 0x3001, typ: PtypString8
Parsing Pid: 12290, 0x3002, typ: PtypString8
Parsing Pid: 12291, 0x3003, typ: PtypString8
Parsing Pid: 12299, 0x300B, typ: PtypBinary
Parsing Pid: 14592, 0x3900, typ: PtypInteger32
Parsing Pid: 14597, 0x3905, typ: PtypInteger32
Parsing Pid: 14846, 0x39FE, typ: PtypString8
Parsing Pid: 14847, 0x39FF, typ: PtypString8
Parsing Pid: 14848, 0x3A00, typ: PtypString8
Parsing Pid: 14880, 0x3A20, typ: PtypString8
Parsing Pid: 14912, 0x3A40, typ: PtypBoolean
Parsing Pid: 14961, 0x3A71, typ: PtypInteger32
Parsing Pid: 15617, 0x3D01, typ: PtypBinary
Parsing Pid: 24542, 0x5FDE, typ: PtypInteger32
Parsing Pid: 24543, 0x5FDF, typ: PtypInteger32
Parsing Pid: 24566, 0x5FF6, typ: PtypString8
Parsing Pid: 24567, 0x5FF7, typ: PtypBinary
Parsing Pid: 24573, 0x5FFD, typ: PtypInteger32
Parsing Pid: 24575, 0x5FFF, typ: PtypInteger32
Parsing Pid: 4086, 0xFF6, typ: PtypBinary
Parsing Pid: 12288, 0x3000, typ: PtypInteger32
Parsing Pid: 3093, 0xC15, typ: PtypInteger32
Parsing Pid: 3599, 0xE0F, typ: PtypBoolean
Parsing Pid: 4089, 0xFF9, typ: PtypBinary
Parsing Pid: 4094, 0xFFE, typ: PtypInteger32
Parsing Pid: 4095, 0xFFF, typ: PtypBinary
Parsing Pid: 12289, 0x3001, typ: PtypString8
Parsing Pid: 12290, 0x3002, typ: PtypString8
Parsing Pid: 12291, 0x3003, typ: PtypString8
Parsing Pid: 12299, 0x300B, typ: PtypBinary
Parsing Pid: 14592, 0x3900, typ: PtypInteger32
Parsing Pid: 14597, 0x3905, typ: PtypInteger32
Parsing Pid: 14846, 0x39FE, typ: PtypString8
Parsing Pid: 14847, 0x39FF, typ: PtypString8
Parsing Pid: 14848, 0x3A00, typ: PtypString8
Parsing Pid: 14880, 0x3A20, typ: PtypString8
Parsing Pid: 14912, 0x3A40, typ: PtypBoolean
Parsing Pid: 14961, 0x3A71, typ: PtypInteger32
Parsing Pid: 15617, 0x3D01, typ: PtypBinary
Parsing Pid: 24542, 0x5FDE, typ: PtypInteger32
Parsing Pid: 24543, 0x5FDF, typ: PtypInteger32
Parsing Pid: 24566, 0x5FF6, typ: PtypString8
Parsing Pid: 24567, 0x5FF7, typ: PtypBinary
Parsing Pid: 24573, 0x5FFD, typ: PtypInteger32
Parsing Pid: 24575, 0x5FFF, typ: PtypInteger32
Parsing Pid: 4086, 0xFF6, typ: PtypBinary
Parsing Pid: 12288, 0x3000, typ: PtypInteger32
Parsing Pid: 3617, 0xE21, typ: PtypInteger32
Unknown property: Unknown, value: 0
Parsing Pid: 4094, 0xFFE, typ: PtypInteger32
Unknown property: PidTagObjectType, value: 7
Parsing Pid: 4084, 0xFF4, typ: PtypInteger32
Unknown property: PidTagAccess, value: 2
Parsing Pid: 4087, 0xFF7, typ: PtypInteger32
Unknown property: PidTagAccessLevel, value: 0
Parsing Pid: 14085, 0x3705, typ: PtypInteger32
Unknown property: PidTagAttachMethod, value: 1
Parsing Pid: 14091, 0x370B, typ: PtypInteger32
Unknown property: PidTagRenderingPosition, value: -1
Parsing Pid: 4089, 0xFF9, typ: PtypBinary
Unknown property: PidTagRecordKey, value: [B@358e39c8
Parsing Pid: 12289, 0x3001, typ: PtypString8
Unknown property: Unknown, value: image001.png
Parsing Pid: 12295, 0x3007, typ: PtypTime
Unknown property: PidTagCreationTime, value: 2022-06-07T22:14:31.417137
Parsing Pid: 12296, 0x3008, typ: PtypTime
Unknown property: PidTagLastModificationTime, value: 2022-06-07T22:14:32.729532
Parsing Pid: 14081, 0x3701, typ: PtypBinary
Parsing Pid: 14082, 0x3702, typ: PtypBinary
Unknown property: PidTagAttachEncoding, value: [B@52469f77
Parsing Pid: 14083, 0x3703, typ: PtypString8
Unknown property: Unknown, value: .png
Parsing Pid: 14084, 0x3704, typ: PtypString8
Unknown property: Unknown, value: image001.png
Parsing Pid: 14087, 0x3707, typ: PtypString8
Unknown property: Unknown, value: image001.png
Parsing Pid: 14094, 0x370E, typ: PtypString8
Unknown property: Unknown, value: image/png
Parsing Pid: 14098, 0x3712, typ: PtypString8
Unknown property: Unknown, value: [email protected]
Parsing Pid: 14100, 0x3714, typ: PtypInteger32
Unknown property: PidTagAttachFlags, value: 4
Parsing Pid: 14109, 0x371D, typ: PtypBinary
Unknown property: Unknown, value: [B@7afd7971
Parsing Pid: 14860, 0x3A0C, typ: PtypString8
Unknown property: Unknown, value: EnUs
Parsing Pid: 32762, 0x7FFA, typ: PtypInteger32
Unknown property: PidTagAttachmentLinkId, value: 0
Parsing Pid: 32763, 0x7FFB, typ: PtypTime
Unknown property: PidTagExceptionStartTime, value: 4501-01-01T00:00
Parsing Pid: 32764, 0x7FFC, typ: PtypTime
Unknown property: PidTagExceptionEndTime, value: 4501-01-01T00:00
Parsing Pid: 32765, 0x7FFD, typ: PtypInteger32
Unknown property: PidTagAttachmentFlags, value: 8
Parsing Pid: 32766, 0x7FFE, typ: PtypBoolean
Unknown property: PidTagAttachmentHidden, value: true
Parsing Pid: 32767, 0x7FFF, typ: PtypBoolean
Unknown property: PidTagAttachmentContactPhoto, value: false
Parsing Pid: -32768, 0xFFFF8000, typ: PtypString8
Unknown property: Unknown, value: 
Parsing Pid: -32767, 0xFFFF8001, typ: PtypBoolean
Unknown property: Unknown, value: false

Some properties have different Ptyp from what have been defined in the code.
0x3001 for instance, it is defined in Pid.java as PidTagDisplayName(0x3001, PtypString), while what I got from log is PtypString8. I know the code follows MS document (https://docs.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxprops/f6ab1613-aefe-447d-a49c-18217230b148), but seems my msg file doesn't follow that.

The older version of MsgViewer works fine for the same msg file, but the latest release (22 May) doesn't work.
I think it is because the Ptyp filter was added
460ed5a#diff-2c91ecffe3e6950ee28ee9549cae88421b88acd247596de271a6be80a472d696

If I comment out .filter(value -> value.typ == typ), it works fine, but it's might not what you want to change, so raising an issue here instead of sending pull request.

Works on Windows 10 with openjdk 11 but is not opening for me in Linux

Hello,

I was able to use the program successfully on a Windows 10 computer with the current openjdk 11 installed, but I am having issues launching the jar file on my Linux desktop computer. The Linux computer is reporting this for the java version

└─(14:49:32)──> java --version                                                                                    ──(Mon,Jul25)─┘
openjdk 11.0.15 2022-04-19
OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.22.04.1)
OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.22.04.1, mixed mode, sharing)

This is what I am seeing when I try to run it on my Pop!_OS (Ubuntu based) 22.04 system. Would love to have the ability to view .eml / .msg files on my Linux computer (I do a fair amount of incident response / forensic work in my job). Hopefully this will end up working. Let me know if you need any other information.

Thanks very much

Robert

└─(14:49:38)──> java -jar msgviewer.jar                                                                           ──(Mon,Jul25)─┘
WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
14:49:47.815 [main] ERROR at.redeye.FrameWork.base.Setup - File /home/rstrom/.MSGViewer/MSGViewer.properties existiert noch nicht.
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt_xawt.so
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2633)
	at java.base/java.lang.Runtime.load0(Runtime.java:768)
	at java.base/java.lang.System.load(System.java:1837)
	at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
	at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2445)
	at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2501)
	at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2700)
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2651)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
	at java.base/java.lang.System.loadLibrary(System.java:1873)
	at java.desktop/java.awt.Toolkit$3.run(Toolkit.java:1399)
	at java.desktop/java.awt.Toolkit$3.run(Toolkit.java:1397)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.desktop/java.awt.Toolkit.loadLibraries(Toolkit.java:1396)
	at java.desktop/java.awt.Toolkit.<clinit>(Toolkit.java:1429)
	at java.desktop/java.awt.Component.<clinit>(Component.java:621)
	at at.redeye.FrameWork.base.translation.MLHelper.loadPropsFile(MLHelper.java:30)
	at at.redeye.FrameWork.base.translation.MLHelper.loadTrans(MLHelper.java:73)
	at at.redeye.FrameWork.base.translation.MLHelper.autoLoadCurrentLocale(MLHelper.java:80)
	at at.redeye.FrameWork.base.translation.MLHelper.<init>(MLHelper.java:24)
	at at.redeye.FrameWork.base.LocalRoot.setLanguageTranslationResourcePath(LocalRoot.java:222)
	at net.sourceforge.MSGViewer.ModuleLauncher.<init>(ModuleLauncher.java:23)
	at net.sourceforge.MSGViewer.ModuleLauncher.main(ModuleLauncher.java:27)

Convert RTF to HTML on msg parsing

Currently, the RTF is decompressed on demand, and conversion of RTF to HTML occurs only when HTML is displayed in the ViewerPanel.
It would be nice that the HTML would also be rendered when saving as EML or MBOX.

An error occured : Unclosed block

I'm getting this error when i'm trying to open a specific msg file. " An error occured : Unclosed block "

The msg file is working with Outlook. Let me know if you need anything to help.

Thanks

Class cast Exception while opening msg file

I got an msg file with a single .jpg as an attachement, and when I tried to open it i got an error:
"class [B cannot be cast do class java.lang.String([B and java.lang.String are in module Java.base of loader 'bootstrap')
That is the msg file (remove the .txt) for replication [Poss fehlender Vertrag (1).msg.txt]

Snapshot_Error_classcast_MsgViewer

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.


Warning

Renovate failed to look up the following dependencies: Failed to look up maven package at.redeye.Plugins:ShellExec.

Files affected: MSGViewer/pom.xml


Ignored or Blocked

These are blocked by an existing closed PR and will not be recreated unless you click a checkbox below.

Detected dependencies

circleci
.circleci/config.yml
  • cimg/openjdk 17.0.11-browsers
github-actions
.github/workflows/code_quality.yml
  • actions/checkout v4
  • JetBrains/qodana-action v2024.1.8
maven
FrameWorkMinimized/pom.xml
  • org.apache.maven.plugins:maven-surefire-plugin 3.3.1
  • commons-io:commons-io 2.16.1
  • org.junit.jupiter:junit-jupiter 5.10.3
  • org.assertj:assertj-core 3.26.3
  • org.mockito:mockito-all 2.0.2-beta
  • com.google.jimfs:jimfs 1.3.0
MSGViewer/pom.xml
  • org.apache.maven.plugins:maven-jar-plugin 3.4.2
  • org.apache.maven.plugins:maven-shade-plugin 3.6.0
  • org.javacc.plugin:javacc-maven-plugin 3.0.3
  • net.java.dev.javacc:javacc 7.0.13
  • at.redeye.Plugins:ShellExec 2.0.0
  • net.htmlparser.jericho:jericho-html 3.4
  • commons-io:commons-io 2.16.1
  • jakarta.mail:jakarta.mail-api 2.1.3
  • org.eclipse.angus:angus-mail 2.0.3
  • org.junit.jupiter:junit-jupiter 5.10.3
  • org.mockito:mockito-junit-jupiter 5.12.0
  • com.google.jimfs:jimfs 1.3.0
  • org.assertj:assertj-core 3.26.3
msgparser/pom.xml
  • commons-io:commons-io 2.16.1
  • org.junit.jupiter:junit-jupiter 5.10.3
pom.xml
  • org.apache.maven.plugins:maven-compiler-plugin 3.13.0
  • org.apache.maven.plugins:maven-resources-plugin 3.3.1
  • org.apache.maven.plugins:maven-surefire-plugin 3.3.1
  • org.apache.maven.plugins:maven-release-plugin 3.1.1
  • org.jacoco:jacoco-maven-plugin 0.8.12
  • org.apache.poi:poi-scratchpad 5.3.0
  • org.apache.logging.log4j:log4j-api 2.23.1
  • org.apache.logging.log4j:log4j-core 2.23.1
  • commons-validator:commons-validator 1.9.0
  • org.apache.commons:commons-lang3 3.15.0
maven-wrapper
.mvn/wrapper/maven-wrapper.properties
  • maven 3.9.8

  • Check this box to trigger a request for Renovate to run again on this repository

Should/Could this work for oft as well?

I wasn't able to find much on the topic of msg vs oft...

https://stackoverflow.com/questions/7957827/is-there-a-difference-between-the-outlook-msg-and-oft-file-formats

But what I did do was try and use MsgViewer without changing anything and it failed, but then I copied the file cp test.oft test.msg and tried again and then it worked flawlessly and made me very happy 👍 ...what a great app, have loved it for MSGtoEML for some time and was very happy to learn it supported OFT as well.

I'm using an Automator script/app that allows me to drag/drop the file onto the MSGtoEML app icon on my dock and automatically convert ... vs. needing to fiddle with the CLI or open the GUI:

MSGtoEML Automator app (run shell script /bin/bash):

for f in "$@"; do
	DIR="$(dirname "${f}")" ; FILE="$(basename "${f}")"
	filename="${FILE%.*}"
	java -jar /usr/local/bin/msgviewer.jar -msg2eml "$f" "$DIR/$filename.eml"
done

To save people from needing to cp .oft to .msg before running the program, I created this pull request I hope you will consider merging. Thanks for the great app!

Some skripts for system integration

This is not an issue as such…

Thank you for taking this under your wing!! I have some scripts on my computer to start msgviewer back from the time, when msgviewer was only available on sourceforge. You might be interested in them. I cannot remember where I got them from (they are definitely not mine ;-) )

Here we go:
cat /usr/local/share/MSGViewer/msgviewer:

#!/usr/bin/env bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

exec java -jar ${DIR}/msgviewer.jar "$@"

cat /usr/local/share/MSGViewer/msg2eml:

#!/usr/bin/env bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

exec java -jar ${DIR}/msgviewer.jar -msg2eml "$@"

cat /usr/local/share/MSGViewer/msg2mbox:

#!/usr/bin/env bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

exec java -jar ${DIR}/msgviewer.jar -msg2mbox "$@"

My directory layout on Linux is:

$ ls -l /usr/local/bin/
lrwxrwxrwx /usr/local/bin/msgviewer -> ../share/MSGViewer/msgviewer
lrwxrwxrwx /usr/local/bin/msg2eml -> ../share/MSGViewer/msg2eml
lrwxrwxrwx /usr/local/bin/msg2mbox -> ../share/MSGViewer/msg2mbox
$ ls -l /usr/local/share/MSGViewer/
-rw-r--r-- /usr/local/share/MSGViewer/icon.png
-rwxr-xr-x /usr/local/share/MSGViewer/msg2eml
-rwxr-xr-x /usr/local/share/MSGViewer/msg2mbox
-rwxr-xr-x /usr/local/share/MSGViewer/msgviewer
-rw-r--r-- /usr/local/share/MSGViewer/msgviewer.jar

Now I can call any of the three commands msgviewer, msg2eml and msg2mbox! Very hand indeed. (Mind you, I only have tested the msgviewer skript with your new github versions …)

BTW I also have a msgviewer.desktop file, to get the viewer into the application menu.
cat /usr/local/share/applications/msgviewer.desktop:

[Desktop Entry]
Encoding=UTF-8
Name=MSGViewer
Comment=
Exec=/usr/local/bin/msgviewer
Icon=/usr/local/share/msgviewer/icon.png
Categories=Application
Version=1.0
Type=Application
Terminal=0

Perhaps this can help persons like #1 to install that beast!

Please feel free to include it, wherever you think it is appropriate.

Feature Request : Add print option

Love this software, would it be hard to add a print option ?

That's the only thing missing for me.

Thank you for your fixes and to keeping it updated.

msg2eml: lists are not correctly converted in the html version

while testing the other issue, I found that msgs with lists are not converted correctly in the HTML version. Either the whole list item content is empty or just portions of it.

the text version is in the eml like this

Hello,

this is an email with formatted text

1.	sadasdasda
2.	sdasadas sd
3.	asdasdas

Another normal line

*	dasdasdasdasd
*	asdasd sdadsa
*	sdsad asdasda

the HTML is just

<div dir="ltr">
  Hello,
  <div><br /></div>
  <div>this is an email with formatted text</div>
  <div>
    <ol>
      <li></li>
      <li></li>
      <li></li>
    </ol>
    <div>Another normal line</div>
    <div>
      <ul>
        <li></li>
        <li></li>
        <li></li>
      </ul>
    </div>
    <div><br /></div>
    -- <br />
    <div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">
      <div>Regards</div>
    </div>
  </div>
</div>

Online Conversion Tool

To make sure that it wasn't an issue with the msg, I tested it with the first online conversion tool I could find for "msg to eml" (zamzar) and there the HTML looked like this when decoded from base64.

<div dir="ltr">
  Hello,
  <div><br /></div>
  <div>this is an email with formatted text</div>
  <div>
    <ol>
      <li>sadasdasda</li>
      <li>sdasadas sd</li>
      <li>asdasdas</li>
    </ol>
    <div>Another normal line</div>
    <div>
      <ul>
        <li>dasdasdasdasd</li>
        <li>asdasd sdadsa</li>
        <li>sdsad asdasda</li>
      </ul>
    </div>
    <div><br /></div>
    -- <br />
    <div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">
      <div>Regards</div>
    </div>
  </div>
</div>

Files

list-test.msg.zip
list-test-zamzar.eml.zip

Replicated jpeg attachment

Not always, but sometimes, the first image is replicated for all the other one.
The preview is replicated and also when the image is selected. We are not able to see the other images.

2021-10-06_15-47-13 copy (1)

Help Needed !!

Hi,

I am trying to extract Parsing and Msg convertion ability from this code. My requirement is build a REST api interface to convert .msg file in to .eml file.
I am more or less able to convert .msg file to Message object using MsgParser like below

MsgParser parser = new MsgParser();
Message msg = parser.parseMsg(new File("C:\Users\xyz\workspace\projects\demo\xyz.msg"));

However i am facing challenged in converting Message object to eml file using MsgWriter

MsgWriter writer = new MsgWriter();
writer.write(msg, new FileOutputStream("C:\Users\xyz\workspace\projects\demo\xyz.eml"));

These are the contents of my MsgContainer.write() method

public void write(Message msg, OutputStream out) throws IOException {
NPOIFSFileSystem fs = new NPOIFSFileSystem();
DirectoryNode root = fs.getRoot();
MsgContainer cont = new MsgContainer(msg);
cont.write(root);
fs.writeFilesystem(out);
fs.close();
}

Exception i see is

2020-03-03 10:52:37.069 INFO 18036 --- [nio-8080-exec-1] com.example.msgparser.MsgContainer : Msgontainer -> write null
2020-03-03 10:52:37.071 INFO 18036 --- [nio-8080-exec-1] c.example.msgparser.entries.SubstGEntry : SubstGEntry -> 55 - 31
2020-03-03 10:52:37.071 INFO 18036 --- [nio-8080-exec-1] c.example.msgparser.entries.SubstGEntry : __substg1.0_0037001F
2020-03-03 10:52:37.084 ERROR 18036 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Can't read from a new stream before it has been written to] with root cause

java.lang.IllegalStateException: Can't read from a new stream before it has been written to

Please let me know if this is making sense or if you need more information.
Any help is much appreciated.

Non-ASCII file name incorrectly encoded on saving as mbox files

How to reproduce :

  1. Open "cyril.msg" (in the test resources folder)
  2. Save as mbox
  3. Open the saved mbox message
    Exception :
2020-10-08 08:35:57,592 INFO  (JavaMailParser.java:78): Content Type: text/plain; charset=us-ascii
2020-10-08 08:35:57,593 INFO  (JavaMailParser.java:78): Content Type: application/octet-stream; name="�0@B>G:0 "� �:B.docx"
2020-10-08 08:35:57,611 ERROR (AutoMBox.java:67): Exception: javax.mail.internet.ParseException: Expected ';', got "�"
Expected ';', got "�"
javax.mail.internet.ParseException: Expected ';', got "�"
	at javax.mail.internet.ParameterList.<init>(ParameterList.java:292)
	at javax.mail.internet.ContentDisposition.<init>(ContentDisposition.java:100)
	at javax.mail.internet.MimeBodyPart.getDisposition(MimeBodyPart.java:1076)
	at javax.mail.internet.MimeBodyPart.getDisposition(MimeBodyPart.java:303)
	at net.sourceforge.MSGViewer.factory.mbox.JavaMailParser.parse(JavaMailParser.java:95)

mbox file content :

------=_Part_3_1061411986.1602138946413
Content-Type: application/octet-stream; name="�0@B>G:0 "� �:B.docx"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="�0@B>G:0 "� �:B.docx"

Looks like "Save as mbox" does not properly handle UTF-8 filenames

javac: invalid target release: 11

Any pointers what can be done to fix that ?

[INFO] parent ............................................. SUCCESS [  0.002 s]
[INFO] FrameWorkMinimized ................................. FAILURE [ 14.787 s]
....
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project FrameWorkMinimized: Compilation failure
[ERROR] Failure executing javac, but could not parse the error:
javac: invalid target release: 11
Usage: javac <options> <source files>
use -help for a list of possible options

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.