{"id":14973038,"url":"https://github.com/groupe-sii/ogham","last_synced_at":"2025-09-13T14:13:13.122Z","repository":{"id":32496372,"uuid":"36077033","full_name":"groupe-sii/ogham","owner":"groupe-sii","description":"Sending email, sms or whatever is a piece of cake","archived":false,"fork":false,"pushed_at":"2023-06-02T11:00:20.000Z","size":163743,"stargazers_count":20,"open_issues_count":55,"forks_count":15,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-08-20T23:52:11.775Z","etag":null,"topics":["email","hacktoberfest","java","sms","spring-boot"],"latest_commit_sha":null,"homepage":"https://groupe-sii.github.io/ogham/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/groupe-sii.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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}},"created_at":"2015-05-22T14:38:27.000Z","updated_at":"2024-12-21T15:47:06.000Z","dependencies_parsed_at":"2024-09-23T12:30:46.475Z","dependency_job_id":"604fce55-ed77-4ec0-8cdd-cb071c7e8969","html_url":"https://github.com/groupe-sii/ogham","commit_stats":{"total_commits":537,"total_committers":7,"mean_commits":76.71428571428571,"dds":0.0949720670391061,"last_synced_commit":"cb303d2168a5f2a0bca69b4b5b92bdb3de90cfab"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/groupe-sii/ogham","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupe-sii%2Fogham","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupe-sii%2Fogham/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupe-sii%2Fogham/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupe-sii%2Fogham/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/groupe-sii","download_url":"https://codeload.github.com/groupe-sii/ogham/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/groupe-sii%2Fogham/sbom","scorecard":{"id":446427,"data":{"date":"2025-08-11","repo":{"name":"github.com/groupe-sii/ogham","commit":"cb303d2168a5f2a0bca69b4b5b92bdb3de90cfab"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.1,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"Code-Review","score":0,"reason":"Found 0/30 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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/generate-documentation.yml:1","Warn: no topLevel permission defined: .github/workflows/release-rollback.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/update-readme.yml:1","Warn: no topLevel permission defined: .github/workflows/update-site.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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"Binary-Artifacts","score":6,"reason":"binaries present in source code","details":["Warn: binary detected: .mvn/wrapper/maven-wrapper.jar:1","Warn: binary detected: documentation-generator/.mvn/wrapper/maven-wrapper.jar:1","Warn: binary detected: ogham-test-classpath/.mvn/wrapper/maven-wrapper.jar:1","Warn: binary detected: ogham-test-classpath/src/main/resources/mvnwrapper-for-projects/.mvn/wrapper/maven-wrapper.jar:1"],"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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Info: Possibly incomplete results: error parsing shell code: not a valid arithmetic operator: status: .github/workflows/update-readme.yml:45","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:120: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:121: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:125: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:133: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:152: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:157: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:175: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:176: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:180: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:188: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:206: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:216: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:217: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:221: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:229: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:249: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:294: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:295: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:299: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:309: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:322: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:327: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:511: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:522: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:79: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:97: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:259: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:261: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:270: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:278: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:348: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:349: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:353: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:367: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:385: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:390: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:427: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:428: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:432: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:446: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:464: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:469: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:483: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:484: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:488: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:77: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:93: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:101: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:112: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:116: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:125: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:142: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/generate-documentation.yml:167: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/generate-documentation.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-rollback.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release-rollback.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-rollback.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release-rollback.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-rollback.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release-rollback.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:251: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:269: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:289: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:308: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:101: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:112: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:115: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:119: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:136: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:154: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:157: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:161: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:197: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:200: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:204: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-readme.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-readme.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-readme.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-readme.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-readme.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-readme.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/update-readme.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-readme.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/update-readme.yml:86: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-readme.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:76: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:84: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/update-site.yml:100: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:108: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:119: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:120: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:124: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:130: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:138: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-site.yml:149: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/update-site.yml:171: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/update-site.yml:189: update your workflow using https://app.stepsecurity.io/secureworkflow/groupe-sii/ogham/update-site.yml/master?enable=pin","Warn: containerImage not pinned by hash: .tools/showcase-recorder/showcase-launcher/Dockerfile:1: pin your Docker image by updating borda/docker_python-opencv-ffmpeg:gpu-py3.7-cv4.3.0 to borda/docker_python-opencv-ffmpeg:gpu-py3.7-cv4.3.0@sha256:63e032d8a9cbbbf8a38fdf2e166f33be6210a622dfbad246006083d1c4507588","Warn: pipCommand not pinned by hash: .tools/showcase-recorder/showcase-launcher/Dockerfile:5","Warn: pipCommand not pinned by hash: .tools/showcase-recorder/showcase-launcher/Dockerfile:9","Warn: downloadThenRun not pinned by hash: ci/analyze.sh:9","Info:   0 out of  84 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  31 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned","Info:   0 out of   1 downloadThenRun 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":"Vulnerabilities","score":0,"reason":"225 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-42986 / GHSA-43fp-rhv2-5gv8","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-6p56-wp2h-9hxr","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: GHSA-cxjf-x6jp-p7mc","Warn: Project is vulnerable to: PYSEC-2023-181","Warn: Project is vulnerable to: GHSA-qr4w-53vh-m672","Warn: Project is vulnerable to: PYSEC-2023-183","Warn: Project is vulnerable to: GHSA-3f63-hfp8-52jq","Warn: Project is vulnerable to: PYSEC-2021-41 / GHSA-3wvg-mj6g-m9cv","Warn: Project is vulnerable to: GHSA-44wm-f244-xhp3","Warn: Project is vulnerable to: GHSA-4fx9-vc88-q2xc","Warn: Project is vulnerable to: PYSEC-2021-35 / GHSA-57h3-9rgr-c24m","Warn: Project is vulnerable to: PYSEC-2021-331 / GHSA-7534-mm45-c74v","Warn: Project is vulnerable to: PYSEC-2021-137 / GHSA-77gc-v2xv-rvvh","Warn: Project is vulnerable to: PYSEC-2021-92 / GHSA-7r7m-5h27-29hp","Warn: Project is vulnerable to: PYSEC-2023-227 / GHSA-8ghj-p4vj-mr35","Warn: Project is vulnerable to: PYSEC-2022-10 / GHSA-8vj2-vxx3-667w","Warn: Project is vulnerable to: PYSEC-2021-36 / GHSA-8xjq-8fcg-g5hw","Warn: Project is vulnerable to: PYSEC-2021-42 / GHSA-95q3-8gr9-gm8w","Warn: Project is vulnerable to: PYSEC-2021-317 / GHSA-98vv-pw6r-q6q4","Warn: Project is vulnerable to: PYSEC-2021-38 / GHSA-9hx2-hgq2-2g4f","Warn: Project is vulnerable to: PYSEC-2022-168 / GHSA-9j59-75qj-795w","Warn: Project is vulnerable to: PYSEC-2021-40 / GHSA-f4w8-cv6p-x6r5","Warn: Project is vulnerable to: PYSEC-2021-69 / GHSA-f5g8-5qq7-938w","Warn: Project is vulnerable to: PYSEC-2021-139 / GHSA-g6rj-rv7j-xwp4","Warn: Project is vulnerable to: PYSEC-2021-71 / GHSA-hf64-x4gq-p99h","Warn: Project is vulnerable to: PYSEC-2021-94 / GHSA-hjfx-8p6c-g7gx","Warn: Project is vulnerable to: GHSA-j7hp-h8jx-5ppr","Warn: Project is vulnerable to: GHSA-jgpv-4h4c-xhw3","Warn: Project is vulnerable to: PYSEC-2022-42979 / GHSA-m2vv-5vj5-2hm7","Warn: Project is vulnerable to: PYSEC-2021-37 / GHSA-mvg9-xffr-p774","Warn: Project is vulnerable to: PYSEC-2021-39 / GHSA-p43w-g3c5-g5mq","Warn: Project is vulnerable to: PYSEC-2022-8 / GHSA-pw3c-h7wp-cvhx","Warn: Project is vulnerable to: PYSEC-2021-93 / GHSA-q5hq-fp76-qmrc","Warn: Project is vulnerable to: PYSEC-2021-138 / GHSA-rwv7-3v45-hg29","Warn: Project is vulnerable to: PYSEC-2021-70 / GHSA-vqcj-wrf2-7v73","Warn: Project is vulnerable to: PYSEC-2022-9 / GHSA-xrcv-f9gm-v42c","Warn: Project is vulnerable to: PYSEC-2023-175","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: PYSEC-2022-43167","Warn: Project is vulnerable to: PYSEC-2023-206","Warn: Project is vulnerable to: GHSA-g7vv-2v7x-gj9p","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2021-108 / GHSA-q2q7-5pp4-w6pg","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f","Warn: Project is vulnerable to: GHSA-vmq6-5m68-f53m","Warn: Project is vulnerable to: GHSA-668q-qrv7-99fm","Warn: Project is vulnerable to: GHSA-6v67-2wr5-gvf4","Warn: Project is vulnerable to: GHSA-pr98-23f8-jwxv","Warn: Project is vulnerable to: GHSA-v6w3-2prq-h95f","Warn: Project is vulnerable to: GHSA-7v6m-28jr-rg84","Warn: Project is vulnerable to: GHSA-x83m-pf6f-pf9g","Warn: Project is vulnerable to: GHSA-rc42-6c7j-7h5r","Warn: Project is vulnerable to: GHSA-xf96-w227-r7c4","Warn: Project is vulnerable to: GHSA-36p3-wjmg-h94x","Warn: Project is vulnerable to: GHSA-hh26-6xwr-ggv7","Warn: Project is vulnerable to: GHSA-4gc7-5j7h-4qph","Warn: Project is vulnerable to: GHSA-4wp7-92pw-q264","Warn: Project is vulnerable to: GHSA-g5mm-vmx4-3rg7","Warn: Project is vulnerable to: GHSA-6gf2-pvqw-37ph","Warn: Project is vulnerable to: GHSA-rfmp-97jj-h8m6","Warn: Project is vulnerable to: GHSA-558x-2xjg-6232","Warn: Project is vulnerable to: GHSA-564r-hj7v-mcr5","Warn: Project is vulnerable to: GHSA-9cmq-m9j5-mvww","Warn: Project is vulnerable to: GHSA-wxqc-pxw9-g2p8","Warn: Project is vulnerable to: GHSA-3mc7-4q67-w48m","Warn: Project is vulnerable to: GHSA-98wm-3w3q-mw94","Warn: Project is vulnerable to: GHSA-9w3m-gqgf-c4p9","Warn: Project is vulnerable to: GHSA-c4r9-r8fh-9vj2","Warn: Project is vulnerable to: GHSA-hhhw-99gj-p3c3","Warn: Project is vulnerable to: GHSA-mjmj-j48q-9wg2","Warn: Project is vulnerable to: GHSA-w37g-rhq8-7m4j","Warn: Project is vulnerable to: GHSA-5mg8-w23w-74h3","Warn: Project is vulnerable to: GHSA-7g45-4rm6-3mm3","Warn: Project is vulnerable to: GHSA-wxr5-93ph-8wr9","Warn: Project is vulnerable to: GHSA-78wr-2p64-hpwj","Warn: Project is vulnerable to: GHSA-j288-q9x7-2f5v","Warn: Project is vulnerable to: GHSA-qw3f-w4pf-jh5f","Warn: Project is vulnerable to: GHSA-gp7f-rwcx-9369","Warn: Project is vulnerable to: GHSA-m72m-mhq2-9p6c","Warn: Project is vulnerable to: GHSA-h46c-h94j-95f3","Warn: Project is vulnerable to: GHSA-wf8f-6423-gfxg","Warn: Project is vulnerable to: GHSA-3x8x-79m2-3w2w","Warn: Project is vulnerable to: GHSA-57j2-w4cx-62h2","Warn: Project is vulnerable to: GHSA-jjjh-jjxp-wpff","Warn: Project is vulnerable to: GHSA-rgv9-q543-rqg4","Warn: Project is vulnerable to: GHSA-27hp-xhwr-wr2m","Warn: Project is vulnerable to: GHSA-5j33-cvvr-w245","Warn: Project is vulnerable to: GHSA-7w75-32cg-r6g2","Warn: Project is vulnerable to: GHSA-83qj-6fr2-vhqg","Warn: Project is vulnerable to: GHSA-fccv-jmmp-qg76","Warn: Project is vulnerable to: GHSA-g8pj-r55q-5c2v","Warn: Project is vulnerable to: GHSA-h2fw-rfh5-95r3","Warn: Project is vulnerable to: GHSA-h3gc-qfqq-6h8f","Warn: Project is vulnerable to: GHSA-hfrx-6qgj-fp6c","Warn: Project is vulnerable to: GHSA-j39c-c8hj-x4j3","Warn: Project is vulnerable to: GHSA-p22x-g9px-3945","Warn: Project is vulnerable to: GHSA-q3mw-pvr8-9ggc","Warn: Project is vulnerable to: GHSA-qppj-fm5r-hxr3","Warn: Project is vulnerable to: GHSA-r6j3-px5g-cq3x","Warn: Project is vulnerable to: GHSA-rq2w-37h9-vg94","Warn: Project is vulnerable to: GHSA-wc4r-xq3c-5cf3","Warn: Project is vulnerable to: GHSA-wm9w-rjj3-j356","Warn: Project is vulnerable to: GHSA-v682-8vv8-vpwr","Warn: Project is vulnerable to: GHSA-2rmj-mq67-h97g","Warn: Project is vulnerable to: GHSA-2wrp-6fg6-hmc5","Warn: Project is vulnerable to: GHSA-4wrc-f8pq-fpqp","Warn: Project is vulnerable to: GHSA-ccgv-vj62-xf9h","Warn: Project is vulnerable to: GHSA-gfwj-fwqj-fp3v","Warn: Project is vulnerable to: GHSA-hgjh-9rj2-g67j","Warn: Project is vulnerable to: GHSA-cx7f-g6mp-7hqm","Warn: Project is vulnerable to: GHSA-g5vr-rgqm-vf78","Warn: Project is vulnerable to: GHSA-w3c8-7r8f-9jp8","Warn: Project is vulnerable to: GHSA-qcj6-jqrg-4wp2","Warn: Project is vulnerable to: GHSA-27xj-rqx5-2255","Warn: Project is vulnerable to: GHSA-288c-cq4h-88gq","Warn: Project is vulnerable to: GHSA-4w82-r329-3q67","Warn: Project is vulnerable to: GHSA-58pp-9c76-5625","Warn: Project is vulnerable to: GHSA-5949-rw7g-wx7w","Warn: Project is vulnerable to: GHSA-5p34-5m6p-p58g","Warn: Project is vulnerable to: GHSA-5r5r-6hpj-8gg9","Warn: Project is vulnerable to: GHSA-5ww9-j83m-q7qx","Warn: Project is vulnerable to: GHSA-6fpp-rgj9-8rwc","Warn: Project is vulnerable to: GHSA-758m-v56v-grj4","Warn: Project is vulnerable to: GHSA-85cw-hj65-qqv9","Warn: Project is vulnerable to: GHSA-89qr-369f-5m5x","Warn: Project is vulnerable to: GHSA-8c4j-34r4-xr8g","Warn: Project is vulnerable to: GHSA-8w26-6f25-cm9x","Warn: Project is vulnerable to: GHSA-95cm-88f5-f2c7","Warn: Project is vulnerable to: GHSA-9gph-22xh-8x98","Warn: Project is vulnerable to: GHSA-9m6f-7xcq-8vf8","Warn: Project is vulnerable to: GHSA-9vvp-fxw6-jcxr","Warn: Project is vulnerable to: GHSA-c265-37vj-cwcc","Warn: Project is vulnerable to: GHSA-c2q3-4qrh-fm48","Warn: Project is vulnerable to: GHSA-cf6r-3wgc-h863","Warn: Project is vulnerable to: GHSA-cmfg-87vq-g5g4","Warn: Project is vulnerable to: GHSA-cvm9-fjm9-3572","Warn: Project is vulnerable to: GHSA-f3j5-rmmp-3fc5","Warn: Project is vulnerable to: GHSA-f9xh-2qgp-cq57","Warn: Project is vulnerable to: GHSA-fmmc-742q-jg75","Warn: Project is vulnerable to: GHSA-fqwf-pjwf-7vqv","Warn: Project is vulnerable to: GHSA-gjmw-vf9h-g25v","Warn: Project is vulnerable to: GHSA-gwp4-hfv6-p7hw","Warn: Project is vulnerable to: GHSA-gww7-p5w4-wrfv","Warn: Project is vulnerable to: GHSA-h3cw-g4mq-c5x2","Warn: Project is vulnerable to: GHSA-h4rc-386g-6m85","Warn: Project is vulnerable to: GHSA-h822-r4r5-v8jg","Warn: Project is vulnerable to: GHSA-j823-4qch-3rgm","Warn: Project is vulnerable to: GHSA-m6x4-97wx-4q27","Warn: Project is vulnerable to: GHSA-mc6h-4qgp-37qh","Warn: Project is vulnerable to: GHSA-mph4-vhrx-mv67","Warn: Project is vulnerable to: GHSA-mx7p-6679-8g3q","Warn: Project is vulnerable to: GHSA-p43x-xfjf-5jhr","Warn: Project is vulnerable to: GHSA-q93h-jc49-78gg","Warn: Project is vulnerable to: GHSA-qjw2-hr98-qgfh","Warn: Project is vulnerable to: GHSA-qmqc-x3r4-6v39","Warn: Project is vulnerable to: GHSA-r3gr-cxrf-hg25","Warn: Project is vulnerable to: GHSA-r695-7vr9-jgc2","Warn: Project is vulnerable to: GHSA-rf6r-2c4q-2vwg","Warn: Project is vulnerable to: GHSA-rpr3-cw39-3pxh","Warn: Project is vulnerable to: GHSA-v3xw-c963-f5hc","Warn: Project is vulnerable to: GHSA-v585-23hc-c647","Warn: Project is vulnerable to: GHSA-vfqx-33qm-g869","Warn: Project is vulnerable to: GHSA-wh8g-3j2c-rqj5","Warn: Project is vulnerable to: GHSA-2pj2-gchf-wmw7","Warn: Project is vulnerable to: GHSA-2rpm-4x8c-pvqg","Warn: Project is vulnerable to: GHSA-q62h-jw38-24vh","Warn: Project is vulnerable to: GHSA-2rvv-w9r2-rg7m","Warn: Project is vulnerable to: GHSA-9xcj-c8cr-8c3c","Warn: Project is vulnerable to: GHSA-c9hw-wf7x-jp9j","Warn: Project is vulnerable to: GHSA-hh3j-x4mc-g48r","Warn: Project is vulnerable to: GHSA-jgwr-3qm3-26f3","Warn: Project is vulnerable to: GHSA-q4hg-rmq2-52q9","Warn: Project is vulnerable to: GHSA-qxf4-chvg-4r8r","Warn: Project is vulnerable to: GHSA-m8p2-495h-ccmh","Warn: Project is vulnerable to: GHSA-rmrm-75hp-phr2","Warn: Project is vulnerable to: GHSA-cm59-pr5q-cw85","Warn: Project is vulnerable to: GHSA-8wx2-9q48-vm9r","Warn: Project is vulnerable to: GHSA-rvwf-54qp-4r6v","Warn: Project is vulnerable to: GHSA-pmxq-pj47-j8j4","Warn: Project is vulnerable to: GHSA-pfh2-hfmq-phg5","Warn: Project is vulnerable to: GHSA-vv7r-c36w-3prj","Warn: Project is vulnerable to: GHSA-5mcr-gq6c-3hq2","Warn: Project is vulnerable to: GHSA-9vjp-v76f-g363","Warn: Project is vulnerable to: GHSA-cqqj-4p63-rrmm","Warn: Project is vulnerable to: GHSA-f256-j965-7f32","Warn: Project is vulnerable to: GHSA-grg4-wf29-r9vv","Warn: Project is vulnerable to: GHSA-p2v9-g2qv-p635","Warn: Project is vulnerable to: GHSA-wm47-8v5p-wjpj","Warn: Project is vulnerable to: GHSA-wx5j-54mm-rqqq","Warn: Project is vulnerable to: GHSA-xfv3-rrfm-f2rv","Warn: Project is vulnerable to: GHSA-493p-pfq6-5258","Warn: Project is vulnerable to: GHSA-v528-7hrm-frqp","Warn: Project is vulnerable to: GHSA-rcjj-h6gh-jf3r","Warn: Project is vulnerable to: GHSA-rggv-cv7r-mw98","Warn: Project is vulnerable to: GHSA-wgh7-54f2-x98r","Warn: Project is vulnerable to: GHSA-wgmr-mf83-7x4j","Warn: Project is vulnerable to: GHSA-cj7v-27pg-wf7q","Warn: Project is vulnerable to: GHSA-hmr7-m48g-48f6","Warn: Project is vulnerable to: GHSA-qh8g-58pp-2wxh","Warn: Project is vulnerable to: GHSA-26vr-8j45-3r4w","Warn: Project is vulnerable to: GHSA-g8m5-722r-8whq","Warn: Project is vulnerable to: GHSA-m394-8rww-3jr7","Warn: Project is vulnerable to: GHSA-m6cp-vxjx-65j6","Warn: Project is vulnerable to: GHSA-p26g-97m4-6q7c","Warn: Project is vulnerable to: GHSA-q4rv-gq96-w7c5","Warn: Project is vulnerable to: GHSA-qw69-rqj8-6qw8","Warn: Project is vulnerable to: GHSA-3gh6-v5v9-6v9j","Warn: Project is vulnerable to: GHSA-gwcr-j4wh-j3cq","Warn: Project is vulnerable to: GHSA-j26w-f9rq-mr2q","Warn: Project is vulnerable to: GHSA-58qw-p7qm-5rvh","Warn: Project is vulnerable to: GHSA-chfm-68vv-pvw5","Warn: Project is vulnerable to: GHSA-4g9r-vxhx-9pgx","Warn: Project is vulnerable to: GHSA-7hfm-57qf-j43q","Warn: Project is vulnerable to: GHSA-crv7-7245-f45f","Warn: Project is vulnerable to: GHSA-mc84-pj99-q6hh","Warn: Project is vulnerable to: GHSA-xqfj-vm6h-2x34","Warn: Project is vulnerable to: GHSA-599f-7c49-w659","Warn: Project is vulnerable to: GHSA-7m5c-fgwf-mwph"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T06:50:34.731Z","repository_id":32496372,"created_at":"2025-08-19T06:50:34.731Z","updated_at":"2025-08-19T06:50:34.731Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274231559,"owners_count":25245625,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-08T02:00:09.813Z","response_time":121,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["email","hacktoberfest","java","sms","spring-boot"],"created_at":"2024-09-24T13:47:59.686Z","updated_at":"2025-09-13T14:13:13.098Z","avatar_url":"https://github.com/groupe-sii.png","language":"Java","funding_links":["https://www.paypal.com/donate?hosted_button_id=KQKEFU5LE5K2J"],"categories":[],"sub_categories":[],"readme":"////\nDo no edit this file, it is automatically generated. Sources are in src/docs/asciidoc.\n////\n\n\nifdef::env-github[]\n:tip-caption: :bulb:\n:note-caption: :information_source:\n:important-caption: :heavy_exclamation_mark:\n:caution-caption: :fire:\n:warning-caption: :warning:\nendif::[]\n\n\n= image:src/docs/resources/images/logo.png[logo,30,30] Ogham\n:toc: preamble\n:toclevels: 3\n\nimage:https://img.shields.io/maven-central/v/fr.sii.ogham/ogham-all.svg[\"Latest Release Standalone\", link=\"https://mvnrepository.com/artifact/fr.sii.ogham/ogham-all/\"]\nimage:https://img.shields.io/badge/License-Apache%202.0-lightgrey.svg[\"License\", link=\"https://opensource.org/licenses/Apache-2.0\"]\nimage:https://github.com/groupe-sii/ogham/workflows/Build/badge.svg?branch=master[\"Build Status\", link=\"https://github.com/groupe-sii/ogham/actions?query=workflow%3ABuild\"]\n\nimage:https://sonarcloud.io/api/project_badges/measure?project=fr.sii.ogham%3Aogham-parent\u0026metric=alert_status[\"Sonar\", link=\"https://sonarcloud.io/dashboard?id=fr.sii.ogham%3Aogham-parent\"]\nimage:https://sonarcloud.io/api/project_badges/measure?project=fr.sii.ogham%3Aogham-parent\u0026metric=sqale_rating[\"Sonar\", link=\"https://sonarcloud.io/dashboard?id=fr.sii.ogham%3Aogham-parent\"]\nimage:https://sonarcloud.io/api/project_badges/measure?project=fr.sii.ogham%3Aogham-parent\u0026metric=reliability_rating[\"Sonar\", link=\"https://sonarcloud.io/dashboard?id=fr.sii.ogham%3Aogham-parent\"]\nimage:https://sonarcloud.io/api/project_badges/measure?project=fr.sii.ogham%3Aogham-parent\u0026metric=security_rating[\"Sonar\", link=\"https://sonarcloud.io/dashboard?id=fr.sii.ogham%3Aogham-parent\"]\n\nimage:https://sonarcloud.io/api/project_badges/measure?project=fr.sii.ogham%3Aogham-parent\u0026metric=coverage[\"Sonar\", link=\"https://sonarcloud.io/dashboard?id=fr.sii.ogham%3Aogham-parent\"]\nimage:https://sonarcloud.io/api/project_badges/measure?project=fr.sii.ogham%3Aogham-parent\u0026metric=sqale_index[\"Sonar\", link=\"https://sonarcloud.io/dashboard?id=fr.sii.ogham%3Aogham-parent\"]\nimage:https://sonarcloud.io/api/project_badges/measure?project=fr.sii.ogham%3Aogham-parent\u0026metric=bugs[\"Sonar\", link=\"https://sonarcloud.io/dashboard?id=fr.sii.ogham%3Aogham-parent\"]\nimage:https://sonarcloud.io/api/project_badges/measure?project=fr.sii.ogham%3Aogham-parent\u0026metric=vulnerabilities[\"Sonar\", link=\"https://sonarcloud.io/dashboard?id=fr.sii.ogham%3Aogham-parent\"]\n\n--\n\nimage::https://groupe-sii.github.io/ogham/v3.0.0/presentation/showcase.png[Showcase, link=https://groupe-sii.github.io/ogham/v3.0.0/showcase-video.html]\n\n'''\n\n--\n\n\n== Resources\n\n\n\n[cols=3, %autowidth.stretch]\n|===\n| image:https://img.shields.io/endpoint?url=https://groupe-sii.github.io/ogham/badges/latest-release-version.json[Latest Release, link=\"https://groupe-sii.github.io/ogham/redirects/latest-release-site.html\"]\n| image:https://img.shields.io/static/v1?label=This%20version\u0026message=v3.0.0[This version, link=\"https://groupe-sii.github.io/ogham/v3.0.0\"]\n| image:https://img.shields.io/endpoint?url=https://groupe-sii.github.io/ogham/badges/nightly-build-version.json[Nightly build, link=\"https://groupe-sii.github.io/ogham/redirects/nightly-build-site.html\"]\n\n| https://groupe-sii.github.io/ogham/redirects/latest-release-site.html[site]\n| https://groupe-sii.github.io/ogham/v3.0.0[site]\n| https://groupe-sii.github.io/ogham/redirects/nightly-build-site.html[site]\n\n| https://groupe-sii.github.io/ogham/redirects/latest-release-code.html[code]\n| https://github.com/groupe-sii/ogham/tree/master[code]\n| https://github.com/groupe-sii/ogham/tree/master[code]\n\n| https://groupe-sii.github.io/ogham/redirects/latest-release-showcase.html[showcase]\n| https://groupe-sii.github.io/ogham/v3.0.0/presentation/showcase.html[showcase]\n| https://groupe-sii.github.io/ogham/redirects/nightly-build-showcase.html[showcase]\n|=== \n\n\n\n== Introduction\n\n\n\n=== Existing libraries\n\nSeveral libraries for sending email already exist: \n\n* https://commons.apache.org/proper/commons-email/[Apache Commons Email]\n* https://github.com/bbottema/simple-java-mail[Simple Java Mail/Vesijama]\n* http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mail.html[Spring Email Integration]\n* ... \n\nThese libraries help you send an email but if you want to use a templated content, you will have to manually integrate a template engine.\n\nThese libraries also provide only implementations based on Java Mail API. But in some environments, you might NOT want to send the email through SMTP but to use an external service (like https://sendgrid.com/[SendGrid] for example). Furthermore, those libraries are bound by design to frameworks or libraries that you might not want to use in your own context.\n\nSo, now you would want to find a sending library with a high level of abstraction to avoid binding issues with any template engine, design framework or sender service... Is email the only possible message type ? No, so why not sending SMS, Tweet or anything the same way ?\n\n\n=== The Ogham module\n\nThis module is designed for handling any kind of message the same way. It also provides several implementations for the same message type. It selects the best implementation based on the classpath or properties for example. You can easily add your own implementation.\n\nIt also provides **templating support** and integrates natively several template engines. You can also add your own.\n\nIt is **framework and library agnostic** and provides bridges for **common frameworks integration** (Spring, JSF, ...).\n\nWhen using the module to send email based on an HTML template, the templating system let you **design your HTML like a standard HTML page**. It automatically transforms the associated resources (images, css files...) to be usable in an email context (automatic inline css, embed images...). You don't need to write your HTML specifically for email.\n\n\n\n== Quick start\n\n=== Standalone\n\n\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/maven-logo.png[Maven,width=118,height=30]\n\n.pom.xml\n[source, xml, subs=attributes+, role=\"collapse-lines:1-14,20- highlight-lines:15-19\"]\n----\n...\n    \u003cdependency\u003e\n      \u003cgroupId\u003efr.sii.ogham\u003c/groupId\u003e\n      \u003cartifactId\u003eogham-all\u003c/artifactId\u003e\n      \u003cversion\u003e3.0.0\u003c/version\u003e\n    \u003c/dependency\u003e\n...\n----\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/pom.xml?ts=2[View code of an example pom.xml]\n\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/gradlephant-logo.png[Gradle,width=114,height=30]\n\n.build.gradle\n[source, groovy, subs=attributes+, role=\"collapse-lines:1-9 highlight-lines:11\"]\n----\n...\ndependencies {\n    implementation 'fr.sii.ogham:ogham-all:3.0.0'\n}\n----\n\n\n_____\n\n\n\nThis will include:\n\n* Sending email through SMTP server (using https://eclipse-ee4j.github.io/mail/[Jakarta Mail], formely JavaMail)\n* Sending email through https://sendgrid.com/[SendGrid]\n* Sending SMS through SMPP server (using https://github.com/fizzed/cloudhopper-smpp[Cloudhopper])\n* Sending SMS through https://www.ovhtelecom.fr/sms/api-sms.xml[OVH SMS API]\n* http://freemarker.org/[FreeMarker] template engine available for building message contents\n* http://www.thymeleaf.org/[ThymeLeaf] template engine available for building message contents\n\n\n\n.Java version compatibility\n[NOTE]\n====\nOgham is compatible with Java 8 and up to Java 15 (included).\n====\n\n\n\n=== With Spring Boot\n\n.Getting started with Spring Boot\n[%collapsible]\n==========\n\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/maven-logo.png[Maven,width=118,height=30]\n\n.pom.xml\n[source, xml, subs=attributes+, role=\"collapse-lines:1-21,28- highlight-lines:22-26\"]\n----\n...\n        \u003cdependency\u003e\n            \u003cgroupId\u003efr.sii.ogham\u003c/groupId\u003e\n            \u003cartifactId\u003eogham-spring-boot-starter-all\u003c/artifactId\u003e\n            \u003cversion\u003e3.0.0\u003c/version\u003e\n        \u003c/dependency\u003e\n\n...\n----\n\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/gradlephant-logo.png[Gradle,width=114,height=30]\n\n.build.gradle\n[source, groovy, subs=attributes+, role=\"collapse-lines:1-13,17-24 highlight-lines:16\"]\n----\n...\n\ndependencies {\n    implementation 'fr.sii.ogham:ogham-spring-boot-starter-all:3.0.0'\n...\n}\n----\n\n\n_____\n\n\n\nThis will include:\n\n* Sending email through SMTP server (using https://javaee.github.io/javamail/[JavaMail])\n* Sending email through https://sendgrid.com/[SendGrid]\n* Sending SMS through SMPP server (using https://github.com/fizzed/cloudhopper-smpp[Cloudhopper])\n* Sending SMS through https://www.ovhtelecom.fr/sms/api-sms.xml[OVH SMS API]\n* http://freemarker.org/[FreeMarker] template engine available for building message contents\n* http://www.thymeleaf.org/[ThymeLeaf] template engine available for building message contents\n* Support of https://projects.spring.io/spring-boot/[Spring Boot] auto-detection mechanism and configuration properties\n\nYou can combine Ogham with existing Spring Boot dependencies:\n\n\n.Ogham adapts itself to Spring Boot features\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/maven-logo.png[Maven,width=118,height=30]\n\n\n.pom.xml\n[source, xml, subs=attributes+, role=\"collapse-lines:1-21,40- highlight-lines:22-26\"]\n----\n...\n        \u003cdependency\u003e\n            \u003cgroupId\u003efr.sii.ogham\u003c/groupId\u003e\n            \u003cartifactId\u003eogham-spring-boot-starter-all\u003c/artifactId\u003e    \u003c!--1--\u003e\n            \u003cversion\u003e3.0.0\u003c/version\u003e\n        \u003c/dependency\u003e\n\n        \u003cdependency\u003e\n            \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n            \u003cartifactId\u003espring-boot-starter-freemarker\u003c/artifactId\u003e   \u003c!--2--\u003e\n        \u003c/dependency\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n            \u003cartifactId\u003espring-boot-starter-thymeleaf\u003c/artifactId\u003e    \u003c!--3--\u003e\n        \u003c/dependency\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n            \u003cartifactId\u003espring-boot-starter-mail\u003c/artifactId\u003e         \u003c!--4--\u003e\n        \u003c/dependency\u003e\n...\n----\n\u003c1\u003e Add Ogham starter for Spring Boot to benefit for all Ogham features in \nyour Spring Boot application.\n\u003c2\u003e Import FreeMarker starter as usual. Ogham will adapt to additional FreeMarker \nprovided by Spring Boot.\n\u003c3\u003e Import Thymeleaf starter as usual. Ogham will adapt to additional Thymeleaf \nprovided by Spring Boot.\n\u003c4\u003e Import Mail starter as usual. Ogham will adapt to use mail features provided\nby Spring Boot.\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/gradlephant-logo.png[Gradle,width=114,height=30]\n\n.build.gradle\n[source, groovy, subs=attributes+, role=\"collapse-lines:1-13,21-27 highlight-lines:16\"]\n----\n...\n\ndependencies {\n    implementation 'fr.sii.ogham:ogham-spring-boot-starter-all:3.0.0'   // \u003c1\u003e\n    \n    implementation 'org.springframework.boot:spring-boot-starter-freemarker'      // \u003c2\u003e\n    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'       // \u003c3\u003e\n    implementation 'org.springframework.boot:spring-boot-starter-mail'            // \u003c4\u003e\n...\n}\n----\n\u003c1\u003e Add Ogham starter for Spring Boot to benefit for all Ogham features in \nyour Spring Boot application.\n\u003c2\u003e Import FreeMarker starter as usual. Ogham will adapt to additional FreeMarker \nprovided by Spring Boot.\n\u003c3\u003e Import Thymeleaf starter as usual. Ogham will adapt to additional Thymeleaf \nprovided by Spring Boot.\n\u003c4\u003e Import Mail starter as usual. Ogham will adapt to use mail features provided\nby Spring Boot.\n\n\n\n_____\n\n\n\nOgham will auto-configure to use Spring Boot additions and support Spring Boot \nconfiguration properties like `spring.mail.host` for example.\n\n\nOgham is compatible with following Spring Boot versions:\n\n* 1.4.x (currently automatically tested against 1.4.7.RELEASE, see note below)\n* 1.5.x (currently automatically tested against 1.5.22.RELEASE)\n* 2.1.x (currently automatically tested against 2.1.18.RELEASE)\n* 2.2.x (currently automatically tested against 2.2.12.RELEASE)\n* 2.3.x (currently automatically tested against 2.3.7.RELEASE)\n* 2.4.x (currently automatically tested against 2.4.1.RELEASE)\n\n.Java version compatibility\n[NOTE]\n====\nOgham is compatible with Java 8 and up to Java 15 (included).\n\nHowever, Spring Boot may not be compatible with some Java versions (depending on\nSpring Boot version).\n====\n\n\n.Java 7\n[IMPORTANT]\n====\nJava 7 support has been dropped since Ogham 3.0.0. Therefore, Ogham is no more \ntested with Spring Boot 1.3.x\n====\n\n\n.Spring Boot 1.4.x and WireMock\n[IMPORTANT]\n====\nLatest WireMock versions are not compatible with Spring Boot 1.4.x. So if you\nare using Spring Boot 1.4.x, also using `ogham-test-utils` for writing tests and\nwant to use WireMock in one of your test, you may experience `ClassNotFoundException`.\nThis is due to different `org.apache.httpcomponents` versions.\n\nIn this case, just use a different version of WireMock by manually adding the dependency\n`com.github.tomakehurst:wiremock-jre8:2.23.2:test`. This will force to use a \nprevious WireMock version that is compatible with Spring Boot 1.4.x.\n====\n\n==========\n\n== Select the features you need\n\nImporting `ogham-all` dependency or `ogham-spring-boot-starter-all` dependency \nis easy but may import dependencies that you\ndon't need. For example, you may only need FreeMarker but not Thymeleaf. Or\nyou may only need to send emails through SMTP but never use SendGrid.\n\nSee how to https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#select-features-standalone[select features].\n\n\n== Usage\n\n[NOTE]\n====\nAll samples with templates are using ThymeLeaf as template engine. For FreeMarker samples, \ntake a look at https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#freemarker[FreeMarker section].\n====\n\n=== Send Email\n\n[NOTE]\n====\nThe samples are available in the https://github.com/groupe-sii/ogham/tree/master/sample-standard-usage[sample-standard-usage sub-project].\n\nAll samples shown bellow are using SMTP for sending email. \nSee https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#sendgrid[Sending email through SendGrid] \nto know how to send email using SendGrid HTTP API.\n====\n\n==== First email using an existing SMTP server\n\n\n:note-caption: :grey_question:\n[NOTE]\n====\nThis sample demonstrates a basic usage of Ogham. This sample doesn't \nshow real improvement compared to other libraries. However, it is a\nthe base for understanding the other samples.\n====\n:note-caption: :information_source:\n\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\n\nThis sample shows how to send a basic email.\n\nThe first lines configure the properties that will be used by the sender.\nThen you must create the service. You can use the MessagingBuilder to help you to create the service.\nFinally, the last line sends the email. The specified email is really basic. It only contains the subject, the textual content and the receiver address. The sender address is automatically added to the email by the service based on configuration properties.\n\n\n[role=tab-container no-max-height]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-9 irrelevant-lines:1-9\"]\n----\n...\npublic class BasicSample {\n\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.put(\"mail.smtp.host\", \"\u003cyour server host\u003e\");\n        properties.put(\"mail.smtp.port\", \"\u003cyour server port\u003e\");\n        properties.put(\"ogham.email.from.default-value\", \"\u003cemail address to display for the sender user\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()      // \u003c1\u003e\n                .environment()\n                    .properties(properties)                         // \u003c2\u003e\n                    .and()\n                .build();                                           // \u003c3\u003e\n        // send the email using fluent API\n        service.send(new Email()                                    // \u003c4\u003e\n                        .subject(\"BasicSample\")\n                        .body().string(\"email content\")\n                        .to(\"ogham-test@yopmail.com\"));\n    }\n\n}\n----\n\u003c1\u003e Use the standard builder (predefined behavior)\n\u003c2\u003e Register the custom properties\n\u003c3\u003e Create a MessagingService instance\n\u003c4\u003e Send an email with a subject and a simple body. The sender address is automatically set using `ogham.email.from.default-value` property\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/email/BasicSample.java?ts=2[Source code of the sample].\n\n\n_____\n\n\n\nThe construction of the email is done using a fluent API in order to chain calls and to have a more readable code.\n\nProperties are directly provided in the code. You can instead https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#properties-handling[use a configuration file].\n\n\n.Email address format\n[TIP]\n====\nOgham supports the personal information in email address. The format is `personal \u003caddress\u003e`.\n\nFor example, the address with personal `Ogham Test \u003cogham-test@yopmail.com\u003e` will result in\n`ogham-test@yopmail.com` as email address and `Ogham Test` as personal.\n====\n==========\n\n==== Use an HTML template for email body\n\n:note-caption: :grey_question:\n[NOTE]\n====\nThis sample demonstrates templating integration to easily externalize\nthe email content from the source code.\n====\n:note-caption: :information_source:\n\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\n\nThis sample shows how to send an email with a content following a template engine language.\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-9,34-46 irrelevant-lines:1-9,12-19 highlight-lines:28-29\"]\n----\n...\npublic class HtmlTemplateSample {\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.setProperty(\"mail.smtp.host\", \"\u003cyour server host\u003e\");\n        properties.setProperty(\"mail.smtp.port\", \"\u003cyour server port\u003e\");\n        properties.setProperty(\"ogham.email.from.default-value\", \"\u003cemail address to display for the sender user\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()                           // \u003c1\u003e\n                .environment()\n                    .properties(properties)                                              // \u003c2\u003e\n                    .and()\n                .build();                                                                // \u003c3\u003e\n        // send the email using fluent API\n        service.send(new Email()                                                         // \u003c4\u003e\n                        .subject(\"HtmlTemplateSample\")\n                        .body().template(\"classpath:/template/thymeleaf/simple.html\",    // \u003c5\u003e\n                                                    new SimpleBean(\"foo\", 42))           // \u003c6\u003e\n                        .to(\"ogham-test@yopmail.com\"));\n    }\n\n    public static class SimpleBean {\n...\n    }\n}\n----\n\u003c1\u003e Use the standard builder (predefined behavior)\n\u003c2\u003e Register the custom properties\n\u003c3\u003e Create a MessagingService instance\n\u003c4\u003e Send an email with an explicit subject. The sender address is automatically set using `ogham.email.from.default-value` property\n\u003c5\u003e Indicate the path to the HTML template file (in the classpath)\n\u003c6\u003e Use any bean object for replacing variables in template\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/email/HtmlTemplateSample.java?ts=2[Source code of the sample].\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/thymeleaf.jpg[width=30,height=30] ThymeLeaf template\n\n[source, html]\n----\n\u003c!DOCTYPE html\u003e\n\u003chtml xmlns:th=\"http://www.thymeleaf.org\"\u003e                \u003c!--1--\u003e\n    \u003chead\u003e\n        \u003cmeta charset=\"utf-8\" /\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        \u003ch1 class=\"title\" th:text=\"${name}\"\u003e\u003c/h1\u003e        \u003c!--2--\u003e\n        \u003cp class=\"text\" th:text=\"${value}\"\u003e\u003c/p\u003e            \u003c!--3--\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n----\n\u003c1\u003e Include the ThymeLeaf namespace\n\u003c2\u003e Use the `name` attribute value in the template\n\u003c3\u003e Use the `value` attribute value in the template\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/resources/template/thymeleaf/simple.html?ts=2[Source code of the HTML template]\n\n\n_____\n\n\n\nUsing a template is straightforward. Instead of providing a string as body (using `body().string(...)`), \nyou change to `body().template(..., ...)`.\nThe `template` method requires two pieces of information:\n\n* The path to the template\n* The variables to evaluate in the template\n\nThe path to the template is a string that may contain a *lookup* prefix. The lookup prefix is used to indicate \nwhere to search the template (from file system, from classpath or anywhere else). Here we explicitly \nask to load the template from classpath (using prefix `classpath:`). If no lookup is defined, \nclasspath is used by default. See https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#resource-resolution[Resource resolution section] for more information.\n\nThe variables are any object you are using in your application. No need to convert your object to a \nparticular format. Directly use what you want.\n==========\n\n==== Use HTML title as email subject\n\n:note-caption: :grey_question:\n[NOTE]\n====\nThis sample demonstrates that you can use a single source for both the body and\nthe subject (same variables and same context). This is particularly useful\nfor internationalization.\n====\n:note-caption: :information_source:\n\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\n\nThis sample is a variant of the previous one. It allows you to \ndirectly use the HTML title as subject of your email. It may be \nuseful to use variables in the subject too, to mutualize the code \nand to avoid to create a new file or to use\na different evaluation syntax or context just for one line.\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-10,35-47 irrelevant-lines:1-10,12-19\"]\n----\n...\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.setProperty(\"mail.smtp.host\", \"\u003cyour server host\u003e\");\n        properties.setProperty(\"mail.smtp.port\", \"\u003cyour server port\u003e\");\n        properties.setProperty(\"ogham.email.from.default-value\", \"\u003cemail address to display for the sender user\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()\n                .environment()\n                    .properties(properties)\n                    .and()\n                .build();\n        // send the email using fluent API (do not specify subject)\n        // subject is set to null to let automatic mechanism to read the title\n        // of the HTML and use it as subject of your email\n        service.send(new Email()                                                                    // \u003c1\u003e\n                        .body().template(\"classpath:/template/thymeleaf/simpleWithSubject.html\", \n                                                    new SimpleBean(\"foo\", 42))\n                        .to(\"ogham-test@yopmail.com\"));\n    }\n    \n    public static class SimpleBean {\n...\n    }\n}\n----\n\u003c1\u003e Subject is no more in Java code\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/email/HtmlTemplateWithSubjectSample.java?ts=2[Source code of the sample]\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/thymeleaf.jpg[width=30,height=30] ThymeLeaf template\n\n[source, html, role=\"highlight-lines:4\"]\n----\n\u003c!DOCTYPE html\u003e\n\u003chtml xmlns:th=\"http://www.thymeleaf.org\"\u003e\n    \u003chead\u003e\n        \u003ctitle\u003eSubject of the email - [[${name}]]\u003c/title\u003e                \u003c!--1--\u003e\n        \u003cmeta charset=\"utf-8\" /\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        \u003ch1 class=\"title\" th:text=\"${name}\"\u003e\u003c/h1\u003e\n        \u003cp class=\"text\" th:text=\"${value}\"\u003e\u003c/p\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n----\n\u003c1\u003e The subject is defined in the template and can use same evaluation context (`SimpleBean`).\n\n\nNOTE: The subject of the email will be `Subject of the email - Welcome foo !`\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/resources/template/thymeleaf/simpleWithSubject.html?ts=2[Source code of the HTML template]\n\n\n_____\n\n\n\n\nFor text templates, the subject is automatically used (like for HTML title) if the first line starts \nwith `Subject:` (spaces can be added after colon). Other lines are used as content of the email.\n\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-9,35-47 irrelevant-lines:1-9,12-19\"]\n----\n...\npublic class TextTemplateWithSubjectSample {\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.setProperty(\"mail.smtp.host\", \"\u003cyour server host\u003e\");\n        properties.setProperty(\"mail.smtp.port\", \"\u003cyour server port\u003e\");\n        properties.setProperty(\"ogham.email.from.default-value\", \"\u003cemail address to display for the sender user\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()\n                .environment()\n                    .properties(properties)\n                    .and()\n                .build();\n        // send the email using fluent API (do not specify subject)\n        // subject is set to null to let automatic mechanism to read the title\n        // of the first line if prefixed by \"Subject:\" and use it as subject of your email\n        service.send(new Email()                                                                       // \u003c1\u003e\n                        .body().template(\"classpath:/template/freemarker/simpleWithSubject.txt.ftl\", \n                                                    new SimpleBean(\"foo\", 42))\n                        .to(\"ogham-test@yopmail.com\"));\n    }\n    \n    public static class SimpleBean {\n...\n    }\n}\n----\n\u003c1\u003e Subject is no more in Java code\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/email/TextTemplateWithSubjectSample.java?ts=2[Source code of the sample]\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/freemarker-logo.png[width=60,height=24] Text template\n\n[source, text, role=\"highlight-lines:1\"]\n----\nSubject: Welcome ${name} !\nHello ${name},\n\nFoo bar ${value}\n----\n\nNOTE: The subject of the email will be `Welcome foo !`\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/resources/template/freemarker/simpleWithSubject.txt.ftl?ts=2[Source code of the text template]\n\n\n_____\n\n==========\n\n==== HTML body with CSS and images\n\n:note-caption: :grey_question:\n[NOTE]\n====\nThis sample demonstrates that you can reference resources like CSS files or\nimages as usual without worrying about technical concerns and limitations for\nsuch resources in email context.\n====\n:note-caption: :information_source:\n\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\nWhen you develop a Web application, you can use HTML for the content and CSS for \nlayout and theming. HTML and CSS can use images to make a beautiful Web page. \nEach concern is separated in a different file. This is a good practice.\n\nHowever, writing an HTML email is totally different. Indeed, email clients are \nnot as evolved as Web browsers. Even worse, some clients disable some features \non purpose (like GMail that prevents using `style` tag). To make an email work \non several clients, you should follow these rules:\n\n* `\u003cimg\u003e` tags that use local images must be embedded\n* Use XHTML instead of HTML\n* Remove HTML comments (except conditional comments used to target Outlook)\n* Add border=0 on all images to avoid an ugly border\n* Do not write shortcut CSS values (`padding: 4px 4px 4px 4px;` instead of \n`padding: 4px`)\n* Padding is not supported on some clients so you must use margins instead \n(adding a parent just for the layout)\n* Background images on body should be moved on another node\n* CSS3 properties are not supported\n* Images must have `alt` attribute\n* ...\n\nThere are many other rules but the developer should not be constrained and \nshould be able to write its HTML and CSS like as usual in Web browsers. Ogham \nsimplifies image and CSS integration and is able to partially rewrite the HTML.  \n\n[role=\"tab-container  no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-10,36-48 irrelevant-lines:1-10,12-19 highlight-lines:30-31\"]\n----\n...\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.setProperty(\"mail.smtp.host\", \"\u003cyour server host\u003e\");\n        properties.setProperty(\"mail.smtp.port\", \"\u003cyour server port\u003e\");\n        properties.setProperty(\"ogham.email.from.default-value\", \"\u003cemail address to display for the sender user\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()\n                .environment()\n                    .properties(properties)\n                    .and()\n                .build();\n        // send the email using fluent API\n        // Note that the extension of the template is not given. This version\n        // automatically takes the provided path and adds the '.html' extension\n        // for the HTML template and '.txt.ftl' for text template\n        service.send(new Email()\n                        .body().template(\"classpath:/template/withImagesAndCss/resources\",    // \u003c1\u003e\n                                                            new SimpleBean(\"foo\", 42))        // \u003c2\u003e\n                        .to(\"ogham-test@yopmail.com\"));\n    }\n\n    public static class SimpleBean {\n...\n    }\n}\n----\n\u003c1\u003e The path to the templates (`/template/withImagesAndCss/resources.html` for the main body, \n`/template/withImagesAndCss/resources.txt.ftl` for the text alternative)\n\u003c2\u003e The template context\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/email/HtmlWithImagesAndCssTemplateSample.java?ts=2[Source code of the sample]\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/thymeleaf-html.jpg[width=30,height=30] ThymeLeaf template\n\n[source, html, role=\"highlight-lines:7-8,12,18,27,39,42\"]\n----\n\u003c!DOCTYPE html\u003e\n\u003chtml xmlns:th=\"http://www.thymeleaf.org\"\u003e\n\u003chead\u003e\n\u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /\u003e\n\u003ctitle\u003eHtmlWithImagesAndCssTemplateSample\u003c/title\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /\u003e\n\u003clink href=\"css/layout.css\" rel=\"stylesheet\" /\u003e                                                            \u003c!--1--\u003e\n\u003clink href=\"css/theme.css\" rel=\"stylesheet\" /\u003e                                                            \u003c!--2--\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003cheader\u003e\n        \u003cimg src=\"images/h1.gif\" alt=\"Creating Email Magic\" /\u003e                                            \u003c!--3--\u003e\n    \u003c/header\u003e\n    \u003cdiv class=\"content\"\u003e\n        \u003cspan th:text=\"${name}\"\u003ename\u003c/span\u003e\n        \u003cp th:text=\"${value}\"\u003evalue\u003c/p\u003e\n        \u003cdiv class=\"left\"\u003e\n            \u003cimg src=\"images/left.gif\" data-inline-image=\"base64\" /\u003e                                    \u003c!--4--\u003e\n            \u003cp class=\"text\"\u003e\n                Lorem ipsum dolor sit amet, consectetur adipiscing elit. In\n                tempus adipiscing felis, sit amet blandit ipsum volutpat sed. Morbi\n                porttitor, eget accumsan dictum, nisi libero ultricies ipsum, in\n                posuere mauris neque at erat.\n            \u003c/p\u003e\n        \u003c/div\u003e\n        \u003cdiv class=\"right\"\u003e\n            \u003cimg src=\"images/right.gif\" data-inline-image=\"attach\" /\u003e                                    \u003c!--5--\u003e\n            \u003cp class=\"text\"\u003e\n                Lorem ipsum dolor sit amet, consectetur adipiscing elit. In\n                tempus adipiscing felis, sit amet blandit ipsum volutpat sed. Morbi\n                porttitor, eget accumsan dictum, nisi libero ultricies ipsum, in\n                posuere mauris neque at erat.\n            \u003c/p\u003e\n        \u003c/div\u003e\n    \u003c/div\u003e\n    \u003cfooter\u003e\n        \u003cdiv class=\"social\"\u003e\n            \u003ca href=\"http://www.twitter.com/\"\u003e\n                \u003cimg src=\"images/tw.gif\" alt=\"Twitter\" /\u003e                                                \u003c!--6--\u003e\n            \u003c/a\u003e\n            \u003ca href=\"http://www.facebook.com/\"\u003e\n                \u003cimg src=\"images/fb.gif\" alt=\"Facebook\" data-inline-image=\"skip\" /\u003e                        \u003c!--7--\u003e\n            \u003c/a\u003e\n        \u003c/div\u003e\n        \u003cdiv class=\"sender-info\"\u003e\n            \u0026reg; Someone, somewhere 2013\u003cbr /\u003e\n            \u003ca href=\"#\" class=\"white\" data-inline-styles=\"skip\"\u003eUnsubscribe\u003c/a\u003e to this newsletter instantly    \u003c!--8--\u003e\n        \u003c/div\u003e\n    \u003c/footer\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n----\n\u003c1\u003e The CSS is parsed by Ogham and applied directly on the HTML (using `style` attribute)\n\u003c2\u003e The CSS is parsed by Ogham and applied directly on the HTML (using `style` attribute). The CSS may\ncontain rules that override some rules of other CSS files (like in a browser)\n\u003c3\u003e The image is automatically embedded (the path is replaced by a \nhttps://tools.ietf.org/html/rfc4021#section-2.2.2[Content-ID (or CID)] and the image is attached\nto the email using `ContentDisposition.INLINE` with the Content-ID header). The content type is\nautomatically determined\n\u003c4\u003e The image is converted to a base64 string. The `src` attribute of the image is updated using\nhttps://en.wikipedia.org/wiki/Data_URI_scheme[data URI scheme]. The content type is automatically\ndetermined\n\u003c5\u003e Same as \u003c3\u003e\n\u003c6\u003e Same as \u003c3\u003e\n\u003c7\u003e The image is not inlined by Ogham. This can be useful to embed it manually.\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/resources/template/withImagesAndCss/resources.html?ts=2[Source code of the HTML template]\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/css.png[width=37,height=30] CSS\n\n.layout.css\n[source, css]\n----\nbody {\n    margin: 10px auto 30px auto;\n    width: 600px;\n}\n\nheader {\n    padding: 40px 30px;\n}\n\nheader img {\n    display: block;\n    margin: auto;\n}\n\n\n.content {\n    padding: 40px 30px;\n}\n\n.left,\n.right {\n    width: 250px;\n    display: inline-block;\n}\n\n.left {\n    margin-right: 36px;\n}\n\nfooter {\n    padding: 30px;\n}\n\nfooter .sender-info,\nfooter .social {\n    text-align: center;\n}\nfooter .social a {\n    display: inline-block;\n}\nfooter .sender-info {\n    margin-top: 20px;\n}\n----\n\n.theme.css\n[source, css]\n----\nbody {\n    border: 1px solid #ccc;\n}\n\nheader {\n    background: #70bbd9;\n}\n\n.content {\n    text-align: justify;\n}\n\nfooter {\n    color:#ffffff;\n    font-family:Arial, sans-serif;\n    font-size:14px;\n    background: #ee4c50;\n}\n\nfooter .social a {\n    color:#ffffff;\n}\n\n.white {\n    color: #fff;\n}\n----\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/html.png[width=37,height=30] Sent HTML\n\n\n\n\n_____\n\n\n\nHere is the list of supported transformations:\n\n* [x] `\u003cimg\u003e` tags that use local images are embedded (using `cid` reference)\n* [x] `\u003cimg\u003e` tags that use local images are embedded (using base64 data URI)\n* [x] Inline CSS rules using `style` attribute\n* [x] `background` images that use local images are embedded (using `cid` reference)\n* [x] `background` images that use local images are embedded (using base64 data URI)\n* [ ] Use XHTML instead of HTML\n* [ ] Tables used for layout explicitly set default values\n* [ ] Remove HTML comments (except conditional comments used to target Outlook)\n* [ ] Add border=0 on all images to avoid an ugly border\n* [ ] Do not write shortcut CSS values (`padding: 4px 4px 4px 4px;` instead of `padding: 4px`)\n* [ ] Padding is not supported on some clients so you must use margins instead (adding a parent just for the layout)\n* [ ] Background images on body should be moved on another node\n* [ ] Images must have `alt` attribute\n\n\n==========\n\n==== A working preview of the HTML body (text alternative)\n\n:note-caption: :grey_question:\n[NOTE]\n====\nHave you never received an email with strange characters in a textual preview ?\n\nThis sample demonstrates how to easily provide a text alternative that is\nused as textual preview.\n====\n:note-caption: :information_source:\n\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\n\nSending an email with HTML content **and** text content might be really important, at least for \nsmartphones. When a smartphone receives an email, it displays the sender, the subject and also a \npreview of the message, using the text alternative. If the message is only HTML, the preview might \nbe unreadable.\n\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-9 irrelevant-lines:1-9,11-20,23-30 highlight-lines:39-40\"]\n----\n...\npublic class HtmlAndTextSample {\n    private static String html = \"\u003c!DOCTYPE html\u003e\"\n                                + \"\u003chtml\u003e\"\n                                +     \"\u003chead\u003e\u003cmeta charset=\\\"utf-8\\\" /\u003e\u003c/head\u003e\"\n                                +     \"\u003cbody\u003e\"\n                                +         \"\u003ch1 class=\\\"title\\\"\u003eHello World\u003c/h1\u003e\"\n                                +         \"\u003cp class=\\\"text\\\"\u003eFoo bar\u003c/p\u003e\"\n                                +     \"\u003c/body\u003e\"\n                                + \"\u003c/html\u003e\";\n    private static String text = \"Hello World !\\r\\n\"\n                                + \"Foo bar\";\n\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.put(\"mail.smtp.host\", \"\u003cyour server host\u003e\");\n        properties.put(\"mail.smtp.port\", \"\u003cyour server port\u003e\");\n        properties.put(\"ogham.email.from.default-value\", \"\u003cemail address to display for the sender user\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()\n                .environment()\n                    .properties(properties)\n                    .and()\n                .build();\n        // send the email using the fluent API\n        service.send(new Email()\n                        .subject(\"HtmlAndTextSample\")\n                        .text().string(text)              // \u003c1\u003e\n                        .html().string(html)              // \u003c2\u003e\n                        .to(\"ogham-test@yopmail.com\"));\n    }\n}\n----\n\u003c1\u003e Explicitly set the textual content (used as alternative body). The alternative body is used when \nthe email client doesn't support HTML or as a preview of the email.\n\u003c2\u003e Explicitly set the HTML content (used as main body)\n\n[NOTE]\n=====\nThe call order between `text()` and `html()` doesn't matter (unlike using `.content(new MultiContent(...))`).\n=====\n\n[NOTE]\n=====\nThe underlying `Content` is a `MultiContent`.\n=====\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/email/HtmlAndTextSample.java?ts=2[Source code of the sample]\n\n\n_____\n\n\n\n\nObviously, you can use templates too. Even better, the following sample shows the shorthand version \nthat avoids specifying twice the path to the templates (a single path without extension for both HTML \nand text template files).\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-9,37-49 irrelevant-lines:1-9,12-19 highlight-lines:31-32\"]\n----\n...\npublic class HtmlAndTextTemplateSample {\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.setProperty(\"mail.smtp.host\", \"\u003cyour server host\u003e\");\n        properties.setProperty(\"mail.smtp.port\", \"\u003cyour server port\u003e\");\n        properties.setProperty(\"ogham.email.from.default-value\", \"\u003cemail address to display for the sender user\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()\n                .environment()\n                    .properties(properties)\n                    .and()\n                .build();\n        // send the email using fluent API\n        // Note that the extension of the template is not given. This version\n        // automatically takes the provided path and adds the '.html' extension\n        // for the HTML template and '.txt' for text template\n        service.send(new Email()\n                        .subject(\"HtmlAndTextTemplateSample\")\n                        .body().template(\"classpath:/template/thymeleaf/simple\",          // \u003c1\u003e\n                                                            new SimpleBean(\"foo\", 42))    // \u003c2\u003e\n                        .to(\"ogham-test@yopmail.com\"));\n    }\n    \n    public static class SimpleBean {\n...\n    }\n}\n----\n\u003c1\u003e The body contains two parts (main body and alternative body) because there are two templates (one \nfor HTML located at `/template/thymeleaf/simple.html` and one for text located at \n`/template/thymeleaf/simple.txt`). Only a single path is specified for both template files (without \nextension).\n\u003c2\u003e The object used for evaluation as usual when using templates (same object used for both HTML and text)\n\n[NOTE]\n=====\nThe underlying `Content` is a `MultiTemplateContent`.\n=====\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/email/HtmlAndTextTemplateSample.java?ts=2[Source code of the sample]\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/thymeleaf-text.jpg[width=30,height=30] Text template\n\n.Text template located in `src/main/resources/template/thymeleaf/simple.txt`\n[source, txt]\n----\n[[${name}]] [[${value}]]\n----\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/resources/template/thymeleaf/simple.txt?ts=2[Source code of the text template]\n\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/thymeleaf-html.jpg[width=30,height=30] HTML template\n\n.HTML template located at `src/main/resources/template/thymeleaf/simple.html`\n[source, html]\n----\n\u003c!DOCTYPE html\u003e\n\u003chtml xmlns:th=\"http://www.thymeleaf.org\"\u003e                \u003c!--1--\u003e\n    \u003chead\u003e\n        \u003cmeta charset=\"utf-8\" /\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        \u003ch1 class=\"title\" th:text=\"${name}\"\u003e\u003c/h1\u003e        \u003c!--2--\u003e\n        \u003cp class=\"text\" th:text=\"${value}\"\u003e\u003c/p\u003e            \u003c!--3--\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n----\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/resources/template/thymeleaf/simple.html?ts=2[Source code of the HTML template]\n\n\n_____\n\n\nOgham will automatically determine file extensions to append according to the kind of message you \nare sending. For email, Ogham will search a HTML and a text file by default:\n\n* Using ThymeLeaf, the file extensions are `.html` and `.txt` (configurable).\n* Using FreeMarker, Ogham will search files with extensions `.html.ftl` and `.txt.ftl` (configurable).\n\n\nIf you are using `body()` (or explicitly using `content(new MultiTemplateContent(...))`) and you only \nprovide one template (only `HTML` for example). Ogham will not fail by default (configurable). \nTherefore, you can start your code with only a HTML template and add the text template later when you \nneed it. That way, your Java code doesn't require any change.\n\n\n\nIt is possible to mix templates in the same application. Even better, you can use a template engine \nthat is better suited for HTML like Thymeleaf and FreeMarker that is better for textual version for \nthe same email. Just write your templates with the engine you want.\n\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-9,37-49 irrelevant-lines:1-9,12-19 highlight-lines:31-32\"]\n----\n...\npublic class HtmlAndTextMixedTemplateEnginesSample {\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.setProperty(\"mail.smtp.host\", \"\u003cyour server host\u003e\");\n        properties.setProperty(\"mail.smtp.port\", \"\u003cyour server port\u003e\");\n        properties.setProperty(\"ogham.email.from.default-value\", \"\u003cemail address to display for the sender user\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()\n                .environment()\n                    .properties(properties)\n                    .and()\n                .build();\n        // send the email using fluent API\n        // Note that the extension of the template is not given. This version\n        // automatically takes the provided path and adds the '.html' extension\n        // for the HTML template and '.txt.ftl' for text template\n        service.send(new Email()\n                        .subject(\"HtmlAndTextMixedTemplateEnginesSample\")\n                        .body().template(\"classpath:/template/mixed/simple\",                // \u003c1\u003e\n                                                            new SimpleBean(\"foo\", 42))      // \u003c2\u003e\n                        .to(\"ogham-test@yopmail.com\"));\n    }\n    \n    public static class SimpleBean {\n...\n    }\n}\n----\n\u003c1\u003e The body contains two parts (main body and alternative body) because there are two templates (one \nfor HTML located at `/template/thymeleaf/simple.html` and one for text located at \n`/template/thymeleaf/simple.txt.ftl`). Only a single path is specified for both template files (without \nextension). The HTML template uses Thymeleaf while the text template uses FreeMarker.\n\u003c2\u003e The object used for evaluation as usual when using templates (same object used for both HTML and text)\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/email/HtmlAndTextMixedTemplateEnginesSample.java?ts=2[Source code of the sample]\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/freemarker-logo.png[width=60,height=24] Text template\n\n.Text template located in `src/main/resources/template/mixed/simple.txt.ftl`\n[source, txt]\n----\n${name} ${value}\n----\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/resources/template/mixed/simple.txt.ftl?ts=2[Source code of the text template]\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/thymeleaf.jpg[width=30,height=30] HTML template\n\n.HTML template located at `src/main/resources/template/mixed/simple.html`\n[source, html]\n----\n\u003c!DOCTYPE html\u003e\n\u003chtml xmlns:th=\"http://www.thymeleaf.org\"\u003e\n    \u003chead\u003e\n        \u003cmeta charset=\"utf-8\" /\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        \u003ch1 class=\"title\" th:text=\"${name}\"\u003e\u003c/h1\u003e\n        \u003cp class=\"text\" th:text=\"${value}\"\u003e\u003c/p\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n----\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/resources/template/mixed/simple.html?ts=2[Source code of the HTML template]\n\n\n_____\n\n\nYou can notice that the Java code has not changed at all (only the path for the sample). The aim is \nto use the template engine that best suits your needs.\n==========\n\n==== Attach files to the email\n\n:note-caption: :grey_question:\n[NOTE]\n====\nThis sample demonstrates how to send files with the email.\n====\n:note-caption: :information_source:\n\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-12 irrelevant-lines:1-12,14-21 highlight-lines:32-33\"]\n----\n...\n    public static void main(String[] args) throws MessagingException, IOException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.put(\"mail.smtp.host\", \"\u003cyour server host\u003e\");\n        properties.put(\"mail.smtp.port\", \"\u003cyour server port\u003e\");\n        properties.put(\"ogham.email.from.default-value\", \"\u003cemail address to display for the sender user\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()\n                .environment()\n                    .properties(properties)\n                    .and()\n                .build();\n        // send the email using fluent API\n        service.send(new Email()\n                        .subject(\"WithAttachmentSample\")\n                        .body().string(\"content of the email\")\n                        .to(\"ogham-test@yopmail.com\")\n                        .attach().resource(\"classpath:/attachment/test.pdf\")            // \u003c1\u003e\n                        .attach().stream(\"from-stream.pdf\", loadInputStream()));        // \u003c2\u003e\n    }\n\n    private static InputStream loadInputStream() {\n        return WithAttachmentSample.class.getResourceAsStream(\"/attachment/test.pdf\");\n    }\n}\n----\n\u003c1\u003e Attach a PDF file that exists in the classpath to the email. The name of the attachment uses the name of the file\n\u003c2\u003e Use an `InputStream` and name the attachment\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/email/WithAttachmentSample.java?ts=2[Source code of the sample]\n\n\n_____\n\n\nAttaching a file to the email is quite simple. You just need to provide the path to the file. \nThe file is loaded from classpath but could also be loaded from file system or anywhere else \n(see https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#resource-resolution[ resource resolution section]). In case you are using a file, \nthe name of the attachment displayed in the email is automatically determined (`test.pdf` in the example).\n\nIt is often not possible to handle files directly. In that case you will use `InputStream` or \n`byte[]`. In that case, you need to name the attachment explicitly.\n\nIn both cases, the mimetype is automatically determined (`application/pdf` in this case). \nMimetype is really important to ensure that the recipient(s) will be able to download or view \nthe files correctly. It is possible to explicitly set the content type of the attachment if the\nautomatic behavior doesn't fit your needs.\n\nThe file content is linked to the email using `ContentDisposition.ATTACHMENT`.\n\n\nIMPORTANT: If you are using `InputStream`, you need to close the stream after sending the email.\n\nTIP: You can also add a custom description for any attachment but in this case use `Attachment` class.\n\n[TIP]\n====\nYou can link a file to the email body using `embed()` instead of `attach()`. To make the link,\nthe email body must contain an explicit reference using a \nhttps://tools.ietf.org/html/rfc4021#section-2.2.2[Content-ID (or CID)]. The linked attachment\nmust provide the Content-ID header with the same CID (automatically set by Ogham). The embedded attachment \ndisposition is automatically set to `ContentDisposition.INLINE`.\n====\n==========\n\n==== Other email features\n\nSee user guide to read about https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#email-usage[the many other features]. \n\n=== Send SMS\n\n[NOTE]\n====\nThe samples are available in the https://github.com/groupe-sii/ogham/tree/master/sample-standard-usage[sample-standard-usage sub-project].\n\nAll samples shown bellow are using SMPP for sending SMS. \nThe https://en.wikipedia.org/wiki/Short_Message_Peer-to-Peer[SMPP] protocol \nis the standard way to send SMS. Only a subset of SMPP properties are used \nin following samples. The whole list of SMPP properties is available \nin https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#advanced-smpp-configuration[advanced configuration].\n\nSee https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#ovh[Sending SMS through OVH] to know how to send SMS using OVH HTTP API.\n====\n\n==== First SMS using an existing SMPP server\n\n:note-caption: :grey_question:\n[NOTE]\n====\nThis sample demonstrates a basic usage of Ogham for sending SMS. It is a\nthe base for understanding the other samples.\n====\n:note-caption: :information_source:\n\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\nThis sample defines two properties mandatory (system ID and password) by this protocol in order to use it.\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-9 irrelevant-lines:1-9\"]\n----\n...\npublic class BasicSample {\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.setProperty(\"ogham.sms.smpp.host\", \"\u003cyour server host\u003e\");                                 // \u003c1\u003e\n        properties.setProperty(\"ogham.sms.smpp.port\", \"\u003cyour server port\u003e\");                                 // \u003c2\u003e\n        properties.setProperty(\"ogham.sms.smpp.system-id\", \"\u003cyour server system ID\u003e\");                       // \u003c3\u003e\n        properties.setProperty(\"ogham.sms.smpp.password\", \"\u003cyour server password\u003e\");                         // \u003c4\u003e\n        properties.setProperty(\"ogham.sms.from.default-value\", \"\u003cphone number to display for the sender\u003e\");  // \u003c5\u003e\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()                                               // \u003c6\u003e\n                .environment()\n                    .properties(properties)                                                                  // \u003c7\u003e\n                    .and()\n                .build();                                                                                    // \u003c8\u003e\n        // send the sms using fluent API\n        service.send(new Sms()                                                                               // \u003c9\u003e\n                        .message().string(\"sms content\")\n                        .to(\"+33752962193\"));\n    }\n\n}\n----\n\u003c1\u003e Configure the SMPP server host\n\u003c2\u003e Configure the SMPP server port\n\u003c3\u003e The SMPP system ID\n\u003c4\u003e The SMPP password\n\u003c5\u003e The phone number of the sender\n\u003c6\u003e Use the standard builder (predefined behavior)\n\u003c7\u003e Register the custom properties\n\u003c8\u003e Create a MessagingService instance\n\u003c9\u003e Send a SMS with a simple message. The sender phone number is automatically set using \n`ogham.sms.from.default-value` property\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/sms/BasicSample.java?ts=2[Source code of the sample].\n\n\n_____\n\n\nThe construction of the SMS is done using a fluent API in order to chain calls and to have a more \nreadable code.\n\nProperties are directly provided in the code. You can instead https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#properties-handling[use a configuration file].\n==========\n\n==== Use a template for SMS content\n\n:note-caption: :grey_question:\n[NOTE]\n====\nThis sample demonstrates templating integration to easily externalize\nthe SMS content from the source code.\n====\n:note-caption: :information_source:\n\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\nThis sample shows how to send a SMS with a content following a template engine language.\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-9,35-47 irrelevant-lines:1-9,12-21 highlight-lines:29,30\"]\n----\n...\npublic class TemplateSample {\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.setProperty(\"ogham.sms.smpp.host\", \"\u003cyour server host\u003e\");\n        properties.setProperty(\"ogham.sms.smpp.port\", \"\u003cyour server port\u003e\");\n        properties.setProperty(\"ogham.sms.smpp.system-id\", \"\u003cyour server system ID\u003e\");\n        properties.setProperty(\"ogham.sms.smpp.password\", \"\u003cyour server password\u003e\");\n        properties.setProperty(\"ogham.sms.from.default-value\", \"\u003cphone number to display for the sender\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()                              // \u003c1\u003e\n                .environment()\n                    .properties(properties)                                                 // \u003c2\u003e\n                    .and()\n                .build();                                                                   // \u003c3\u003e\n        // send the sms using fluent API\n        service.send(new Sms()                                                              // \u003c4\u003e\n                        .message().template(\"classpath:/template/thymeleaf/simple.txt\",     // \u003c5\u003e\n                                                    new SimpleBean(\"foo\", 42))              // \u003c6\u003e\n                        .to(\"+33752962193\"));\n    }\n\n    public static class SimpleBean {\n...\n    }\n}\n----\n\u003c1\u003e Use the standard builder (predefined behavior)\n\u003c2\u003e Register the custom properties\n\u003c3\u003e Create a MessagingService instance\n\u003c4\u003e Send a SMS with message that comes from the evaluated template. The sender address is automatically \nset using `ogham.sms.from.default-value` property\n\u003c5\u003e Indicate the path to the template file (in the classpath)\n\u003c6\u003e Use any bean object for replacing variables in template\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/sms/TemplateSample.java?ts=2[Source code of the sample].\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/thymeleaf.jpg[width=30,height=30] ThymeLeaf template\n\n[source, html]\n----\n[[${name}]] [[${value}]]\n----\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/resources/template/thymeleaf/simple.txt?ts=2[Source code of the template]\n\n\n_____\n\n\n\nUsing a template is straightforward. Instead of providing a string content (using `.message().string(...)`),\nyou call `.message().template(..., ...)`.\nThe `template` method requires two pieces of information:\n\n* The path to the template\n* The variables to evaluate in the template\n\nThe path to the template is a string with a *lookup* prefix. The lookup prefix is used to indicate \nwhere to search the template (from file system, from classpath or anywhere else). Here we explicitly \nask to load the template from classpath (using prefix `classpath:`). If no lookup is defined, \nclasspath is used by default. See https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#resource-resolution[Resource resolution section] for more information.\n\nThe variables are any object you are using in your application. No need to convert your object to \na particular format. Directly use what you want.\n==========\n\n==== Send a long SMS\n\n:note-caption: :grey_question:\n[NOTE]\n====\nThis sample demonstrates that you don't have to handle these kind of\ntechnical concerns.\n====\n:note-caption: :information_source:\n\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\nAs you may know, SMS stands for Short Message Service. Basically, the messages are limited to a maximum \nof 160 characters if character encoding is using 7bits. Using a 8-bit character encoding decreases \nthe limit to 140 characters and 70 characters for a 16-bit encoding. If needed, the library will \nsplit your messages into several parts the right way to be recomposed by clients later (according \nto the message encoding). Therefore, you don't need to handle the split of messages in your code:\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-9 irrelevant-lines:1-9,12-21 highlight-lines:27-30\"]\n----\n...\npublic class LongMessageSample {\n    public static void main(String[] args) throws MessagingException {\n        // configure properties (could be stored in a properties file or defined\n        // in System properties)\n        Properties properties = new Properties();\n        properties.setProperty(\"ogham.sms.smpp.host\", \"\u003cyour server host\u003e\");\n        properties.setProperty(\"ogham.sms.smpp.port\", \"\u003cyour server port\u003e\");\n        properties.setProperty(\"ogham.sms.smpp.system-id\", \"\u003cyour server system ID\u003e\");\n        properties.setProperty(\"ogham.sms.smpp.password\", \"\u003cyour server password\u003e\");\n        properties.setProperty(\"ogham.sms.from.default-value\", \"\u003cphone number to display for the sender\u003e\");\n        // Instantiate the messaging service using default behavior and\n        // provided properties\n        MessagingService service = MessagingBuilder.standard()\n                .environment()\n                    .properties(properties)\n                    .and()\n                .build();\n        String longMessage = \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad \"\n                            + \"minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehender\"\n                            + \"it in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui o\"\n                            + \"fficia deserunt mollit anim id est laborum.\";\n        // send the sms using fluent API\n        service.send(new Sms()\n                        .message().string(longMessage)\n                        .to(\"+33752962193\"));\n    }\n\n}\n----\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/main/java/fr/sii/ogham/sample/standard/sms/LongMessageSample.java?ts=2[Source code of the sample].\n\n\n\n_____\n\n\n\n.Message length depends on encoding\n[NOTE]\n====\nLarger content (concatenated SMS, multipart or segmented SMS, or \"long SMS\") can be sent using \nmultiple messages, in which case each message will start with a User Data Header (UDH) containing \nsegmentation information. Since UDH is part of the payload, the number of available characters per \nsegment is lower: 153 for 7-bit encoding, 134 for 8-bit encoding and 67 for 16-bit encoding. The \nreceiving handset is then responsible for reassembling the message and presenting it to the user \nas one long message. While the standard theoretically permits up to 255 segments, 6 to 8 segment \nmessages are the practical maximum.\n====\n\n.Default encoding\n[NOTE]\n====\nBy default, Ogham sends the SMS using 8-bit encoding.\n====\n\n\n==========\n\n==== Other SMS features\n\nOgham provides https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#sms-usage[many other features]. \n\n\n== Testing\n\n=== Include test utilities\n\n.Getting started\n[%collapsible]\n==========\n\n\n[role=tab-container]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/maven-logo.png[Maven,width=118,height=30]\n\n.Add `ogham-test-utils` dependency to your pom.xml\n[source, xml, subs=attributes+]\n----\n\u003cdependency\u003e\n    \u003cgroupId\u003efr.sii.ogham\u003c/groupId\u003e\n    \u003cartifactId\u003eogham-test-utils\u003c/artifactId\u003e\n    \u003cversion\u003e3.0.0\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n----\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/pom.xml?ts=2[View code of an example pom.xml]\n\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/gradlephant-logo.png[Gradle,width=114,height=30]\n\n\n.Add `ogham-test-utils` to your build.gradle\n[source, groovy, subs=attributes+]\n----\ndependencies {\n    testImplementation 'fr.sii.ogham:ogham-test-utils:3.0.0'\n}\n----\n\n\n\n_____\n\n\n\nThis will include:\n\n* http://junit.org/junit5/[JUnit to run tests (JUnit 4 and Junit 5)]\n* http://site.mockito.org/[Mockito for mocking Java code]\n* http://hamcrest.org/JavaHamcrest/[Hamcrest for assertions]\n* http://www.icegreen.com/greenmail/[GreenMail for mocking a SMTP server]\n* https://jsmpp.org/[jSMPP for mocking a SMPP server]\n* http://wiremock.org/[WireMock for mocking HTTP server]\n* http://spockframework.org/[Spockframework for writing very very readable unit tests]\n* and some utilities that may be useful\n\n\n[TIP]\n====\nYou can \nhttps://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#testing-tools-eclipse-static-imports[configure Eclipse]\nto provide autocompletion for static imports.\n====\n==========\n\n=== Testing emails\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\n\nTo test your application emails, you can start a local SMTP server. You can then use Ogham to make \nassertions on your email (right recipients, right sender, right body...). Ogham uses \nhttp://www.icegreen.com/greenmail/[GreenMail] as local SMTP server.\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-23 irrelevant-lines:1-23\"]\n----\n...\npublic class EmailTestSample {\n    private MessagingService oghamService;\n    \n    @Rule\n    public final GreenMailRule greenMail = new GreenMailRule(SMTP);              // \u003c1\u003e\n\n    @Before\n    public void setUp() throws IOException {\n        oghamService = MessagingBuilder.standard()\n                .environment()\n                    .properties()\n                        .set(\"ogham.email.from.default-value\", \"Sender Name \u003ctest.sender@sii.fr\u003e\")\n                        .set(\"mail.smtp.host\", SMTP.getBindAddress())            // \u003c2\u003e\n                        .set(\"mail.smtp.port\", String.valueOf(SMTP.getPort()))   // \u003c3\u003e\n                        .and()\n                    .and()\n                .build();\n    }\n\n    @Test\n    public void simple() throws MessagingException, javax.mail.MessagingException {\n        // @formatter:off\n        oghamService.send(new Email()\n                                .subject(\"Simple\")\n                                .body().string(\"string body\")\n                                .to(\"Recipient Name \u003crecipient@sii.fr\u003e\"));\n        assertThat(greenMail).receivedMessages()                                 // \u003c4\u003e\n            .count(is(1))                                                        // \u003c5\u003e\n            .message(0)                                                          // \u003c6\u003e\n                .subject(is(\"Simple\"))                                           // \u003c7\u003e\n                .from()\n                    .address(hasItems(\"test.sender@sii.fr\"))                     // \u003c8\u003e\n                    .personal(hasItems(\"Sender Name\")).and()                     // \u003c9\u003e\n                .to()\n                    .address(hasItems(\"recipient@sii.fr\"))                       // \u003c10\u003e\n                    .personal(hasItems(\"Recipient Name\")).and()                  // \u003c11\u003e\n                .body()\n                    .contentAsString(is(\"string body\"))                          // \u003c12\u003e\n                    .contentType(startsWith(\"text/plain\")).and()                 // \u003c13\u003e\n                .alternative(nullValue())                                        // \u003c14\u003e\n                .attachments(emptyIterable());                                   // \u003c15\u003e\n        // @formatter:on\n    }\n}\n----\n\u003c1\u003e Declare and initialize the GreenMail JUnit rule to start a local SMTP server\n\u003c2\u003e Get the local SMTP server host address and configure Ogham to use this value\n\u003c3\u003e Get the local SMTP server port and configure Ogham to use this value\n\u003c4\u003e Entry point for declaring assertion on received emails using a fluent API\n\u003c5\u003e Assert that one and only one email has been received\n\u003c6\u003e Access the first received message for declaring assertions for that message using fluent API\n\u003c7\u003e Assert that the subject of the first message is exactly `Simple` string\n\u003c8\u003e Assert that the sender email address is exactly `test.sender@sii.fr`\n\u003c9\u003e Assert that the sender name is exactly `Sender Name`\n\u003c10\u003e Assert that the recipient email address is exactly `recipient@sii.fr`\n\u003c11\u003e Assert that the recipient name is exactly `Recipient Name`\n\u003c12\u003e Assert that the body of the received email is exactly `string body`\n\u003c13\u003e Assert that the mimetype of the body of the received email starts with `text/plain`\n\u003c14\u003e Assert that received email has no alternative content\n\u003c15\u003e Assert that received email has no attachment\n\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/test/java/fr/sii/ogham/sample/test/EmailTestSample.java?ts=2[Source code of the sample].\n\n\n_____\n\n==========\n\n\n=== Testing SMS\n\n.Explanations \u0026 sample\n[%collapsible]\n==========\n\nTo test your application SMS, you can start a local SMPP server. You can then use Ogham to make assertions on you SMS (recipient phone number, sender phone number and message). Ogham uses https://jsmpp.org/[jSMPP] as local SMPP server.\n\n[role=\"tab-container no-max-height\"]\n_____\n\n'''\n\n[role=tab]\nimage:src/docs/resources/images/icons/java-logo.png[width=16,height=30] Java\n\n[source, java, role=\"collapse-lines:1-19 irrelevant-lines:1-19\"]\n----\n...\npublic class SmsTestSample {\n    private MessagingService oghamService;\n    \n    @Rule\n    public final SmppServerRule\u003cSubmitSm\u003e smppServer = new JsmppServerRule();    // \u003c1\u003e\n    \n    @Before\n    public void setUp() throws IOException {\n        oghamService = MessagingBuilder.standard()\n                .environment()\n                    .properties()\n                        .set(\"ogham.sms.from.default-value\", \"+33603040506\")\n                        .set(\"ogham.sms.smpp.host\", \"localhost\")                 // \u003c2\u003e\n                        .set(\"ogham.sms.smpp.port\", smppServer.getPort())        // \u003c3\u003e\n                        .and()\n                    .and()\n                .build();\n    }\n    \n    @Test\n    public void simple() throws MessagingException {\n        // @formatter:off\n        oghamService.send(new Sms()\n                            .message().string(\"sms content\")\n                            .to(\"0601020304\"));\n        assertThat(smppServer).receivedMessages()                                // \u003c4\u003e\n            .count(is(1))                                                        // \u003c5\u003e\n            .message(0)                                                          // \u003c6\u003e\n                .content(is(\"sms content\"))                                      // \u003c7\u003e\n                .from()\n                    .number(is(\"+33603040506\"))                                  // \u003c8\u003e\n                    .and()\n                .to()\n                    .number(is(\"0601020304\"));                                   // \u003c9\u003e\n        // @formatter:on\n    }\n}\n----\n\u003c1\u003e Declare and initialize the JUnit rule that encapsulates jSMPP for starting a local SMPP server in tests (you can set a different port than the default one)\n\u003c2\u003e Configure Ogham to use `localhost` for SMPP host\n\u003c3\u003e Get the local SMPP server port and configure Ogham to use this value\n\u003c4\u003e Entry point for declaring assertion on received SMS using a fluent API\n\u003c5\u003e Assert that one and only one SMS has been received\n\u003c6\u003e Access the first received message for declaring assertions for that message using fluent API\n\u003c7\u003e Assert that the received message text is exactly `sms content`\n\u003c8\u003e Assert that the sender phone number is `+33603040506`\n\u003c9\u003e Assert that the recipient phone number is `0601020304`\n\n\nhttps://github.com/groupe-sii/ogham/tree/master/sample-standard-usage/src/test/java/fr/sii/ogham/sample/test/SmsTestSample.java?ts=2[Source code of the sample].\n\n\n_____\n\n==========\n\n\n=== More testing features\n\nOgham provides many other tool features:\n\n* https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#testing-email[Email assertions and tools].\n* https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#testing-sms[SMS assertions and tools].\n* https://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#random-ports[Use random ports to parallelize tests].\n\n\n== Advanced configuration\n\nhttps://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#section-advanced-configuration[See advanced configuration in full documentation]\n\n== Extend\n\nhttps://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#section-extend[See how to extend Ogham in full documentation]\n\n== Tips\n\nhttps://groupe-sii.github.io/ogham/v3.0.0/user-manual.html#section-tips[See tips in full documentation]\n\n== Support developer\n\nI am currently the single developer on this project for several years.\nI have many ideas for this project to ease other developer work.\n\nYou can help me by either https://groupe-sii.github.io/ogham/v3.0.0/contribute.html[contributing] or by https://groupe-sii.github.io/ogham/v3.0.0/donate.html[making a donation].\n\nimage:src/docs/resources/images/donation/paypal-small.png[alt=\"Donate with PayPal\", link=\"https://www.paypal.com/donate?hosted_button_id=KQKEFU5LE5K2J\"]\nimage:src/docs/resources/images/donation/coinbase-small.png[alt=\"Donate crypto (Bitcoin, Ethereum, ...)\", link=\"https://commerce.coinbase.com/checkout/7c322363-b8ef-4624-8957-a750b631f859\"]\n\nThank you !","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgroupe-sii%2Fogham","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgroupe-sii%2Fogham","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgroupe-sii%2Fogham/lists"}