{"id":38964055,"url":"https://github.com/ctabin/jotlmsg","last_synced_at":"2026-01-17T16:27:34.944Z","repository":{"id":15483559,"uuid":"77867633","full_name":"ctabin/jotlmsg","owner":"ctabin","description":"Simple API on top of Apache POI to write Outlook .msg files","archived":false,"fork":false,"pushed_at":"2025-11-17T09:26:52.000Z","size":7360,"stargazers_count":35,"open_issues_count":0,"forks_count":11,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-17T11:22:57.220Z","etag":null,"topics":["mail","microsoft-outlook","mime-message","msg","poi"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ctabin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-01-02T23:08:08.000Z","updated_at":"2025-11-17T09:26:55.000Z","dependencies_parsed_at":"2023-01-13T20:00:22.063Z","dependency_job_id":"8714461e-c255-4845-8052-733da44c3f30","html_url":"https://github.com/ctabin/jotlmsg","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/ctabin/jotlmsg","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctabin%2Fjotlmsg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctabin%2Fjotlmsg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctabin%2Fjotlmsg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctabin%2Fjotlmsg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ctabin","download_url":"https://codeload.github.com/ctabin/jotlmsg/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctabin%2Fjotlmsg/sbom","scorecard":{"id":311592,"data":{"date":"2025-08-11","repo":{"name":"github.com/ctabin/jotlmsg","commit":"ba4f5f0bedf6b25dcf48267365475dfd95d2be9a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.3,"checks":[{"name":"Maintained","score":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/13 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":9,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql.yml:16","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:17","Warn: no topLevel permission defined: .github/workflows/codeql.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENCE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/ctabin/jotlmsg/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/ctabin/jotlmsg/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/ctabin/jotlmsg/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/ctabin/jotlmsg/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/ctabin/jotlmsg/codeql.yml/master?enable=pin","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T23:15:51.129Z","repository_id":15483559,"created_at":"2025-08-17T23:15:51.129Z","updated_at":"2025-08-17T23:15:51.129Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28511864,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T13:38:16.342Z","status":"ssl_error","status_checked_at":"2026-01-17T13:37:44.060Z","response_time":85,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mail","microsoft-outlook","mime-message","msg","poi"],"created_at":"2026-01-17T16:27:34.801Z","updated_at":"2026-01-17T16:27:34.897Z","avatar_url":"https://github.com/ctabin.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Maven](https://img.shields.io/maven-central/v/ch.astorm/jotlmsg.svg)](https://search.maven.org/search?q=g:ch.astorm%20AND%20a:jotlmsg)\n[![Build](https://app.travis-ci.com/ctabin/jotlmsg.svg?branch=master)](https://app.travis-ci.com/github/ctabin/jotlmsg/branches)\n[![Javadoc](https://javadoc.io/badge2/ch.astorm/jotlmsg/javadoc.svg)](https://javadoc.io/doc/ch.astorm/jotlmsg) \n\n# jotlmsg\nIt's a simple API meant to easily generate Microsoft Outlook message files (.msg). \nThis library is based on [Apache POI](https://poi.apache.org) and is a 100% Java implementation.\n\nHere the compatibility map of this API:\n\n| Version | JDK                 | Package\n| ------- | ------------------- | ---------\n| \u003c= 1.9  | JDK 8 and upwards   | `javax` \n| \u003e= 2.0  | JDK 11 and upwards  | `jakarta`\n| \u003e= 3.0  | JDK 21 and upwards  | `jakarta`\n\n## Installation\n\nSimply add the `jotlmsg.jar` and its dependencies to your classpath.\n\nIf you're using maven, then simply add the following dependency:\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ech.astorm\u003c/groupId\u003e\n    \u003cartifactId\u003ejotlmsg\u003c/artifactId\u003e\n    \u003cversion\u003e3.0.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Usage examples\n\nCreate a new message:\n```Java\nOutlookMessage message = new OutlookMessage();\nmessage.setSubject(\"Hello\");\n\n//plain text body or html body\nmessage.setPlainTextBody(\"This is a plain text body.\");\nmessage.setHtmlBody(\"\u003chtml\u003e\u003cbody\u003e\u003cp\u003eThis is an html body with \u003cstrong\u003ebold\u003c/strong\u003e and \u003ci\u003eitalic\u003c/i\u003e styles.\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e\");\n\n//creates a new Outlook Message file\nmessage.writeTo(new File(\"myMessage.msg\"));\n\n//creates a javax.mail MimeMessage\nMimeMessage mimeMessage = message.toMimeMessage();\n```\n\nRead an existing message:\n```Java\nOutlookMessage message = new OutlookMessage(new File(\"aMessage.msg\"));\nSystem.out.println(message.getSubject());\nSystem.out.println(message.getPlainTextBody());\n```\n\nManaging recipients:\n```Java\nOutlookMessage message = new OutlookMessage();\nmessage.addRecipient(Type.TO, \"cedric@jotlmsg.com\");\nmessage.addRecipient(Type.TO, \"bill@microsoft.com\", \"Bill\");\nmessage.addRecipient(Type.CC, \"steve@apple.com\", \"Steve\");\nmessage.addRecipient(Type.BCC, \"john@gnu.com\");\n        \nList\u003cOutlookMessageRecipient\u003e toRecipients = message.getRecipients(Type.TO);\nList\u003cOutlookMessageRecipient\u003e ccRecipients = message.getRecipients(Type.CC);\nList\u003cOutlookMessageRecipient\u003e bccRecipients = message.getRecipients(Type.BCC);\nList\u003cOutlookMessageRecipient\u003e allRecipients = message.getAllRecipients();\n```\n\nManaging optional replyto recipients:\n```Java\nOutlookMessage message = new OutlookMessage();\nmessage.setReplyTo(List.of(\"reply1@jotlmsg.com\", \"reply2@jotlmsg.com\"));\n\nList\u003cString\u003e replyToRecipients = message.getReplyTo();\n```\n\nManaging attachments:\n```Java\nOutlookMessage message = new OutlookMessage();\nmessage.addAttachment(\"aFile.txt\", \"text/plain\", new FileInputStream(\"data.txt\")); //will be stored in memory\nmessage.addAttachment(\"aDocument.pdf\", \"application/pdf\", new FileInputStream(\"file.pdf\")); //will be stored in memory\nmessage.addAttachment(\"hugeFile.zip\", \"application/zip\", a -\u003e new FileInputStream(\"data.zip\")); //piped to output stream\n\nList\u003cOutlookMessageAttachment\u003e attachments = message.getAttachments();\n```\n\n### HTML message with inlined attachments\n\nThe APIs allow to generate a message with embedded picture inside an HTML body that\nwill then be editable directly in Outlook. The inlined attachment can be referenced\nby using the `cid:` prefix in a tag.\n\n```java\n//generate a unique content id to be referenced\nString contentId = UUID.randomUUID().toString();\n\nOutlookMessage message = new OutlookMessage();\nmessage.setSubject(\"My HTML message\");\nmessage.setFrom(\"sender@jotlmsg.com\");\nmessage.addRecipient(Type.TO, \"cedric@jotlmsg.com\", \"Cédric\");\n\n//optional alternative plain text message that can be shown if HTML is not displayed\nmessage.setPlainTextBody(\"Alternative plain text message\");\n\n//defines the htmlbody with injected content id reference\nString htmlBody = \"\"\"\n                  \u003chtml\u003e\n                    \u003cbody\u003e\n                      \u003cdiv\u003e\n                        Inline attached smiley:\n                        \u003cimg src=\"cid:%s\" alt=\"Smiley\"\u003e\n                      \u003c/div\u003e\n                    \u003c/body\u003e\n                  \u003c/html\u003e\n                  \"\"\";\nmessage.setHtmlBody(String.format(htmlBody, contentId));\n\n//adds the inlined attachment with the referenced content id\nOutlookMessageAttachment inlineAttachment = new OutlookMessageAttachment(\"Face-smile.png\", \"image/png\", a -\u003e OutlookMessageMIMETest.class.getResourceAsStream(\"Face-smile.png\"));\ninlineAttachment.setContentId(contentId);\nmessage.addAttachment(inlineAttachment);\n```\n\n**Note:** The inlined attachements are not shown as \"real\" attachment in Outlook. It's an alternative to external URLs that\nmight be prevented to be loaded by the mail client of the final recipient.\n\n## Limitations\n\nThe current implementation allows to create simple msg files with many recipients (up to 2048) and attachments (up to 2048). \nHowever, there is no current support of Microsoft Outlook advanced features like appointments or calendar integration, nor embedded messages.\n\n## Donate\n\nThis project is completely developed during my spare time.\n\nSince I'm a big fan of cryptocurrencies and especially [Cardano](https://cardano.org) (ADA), you can send me\nsome coins at the address below (check it [here](https://cardanoscan.io/address/addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66)):\n\n```\naddr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fctabin%2Fjotlmsg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fctabin%2Fjotlmsg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fctabin%2Fjotlmsg/lists"}