{"id":13674390,"url":"https://github.com/slurdge/goeland","last_synced_at":"2026-03-07T15:01:42.929Z","repository":{"id":36976722,"uuid":"244188099","full_name":"slurdge/goeland","owner":"slurdge","description":"An alternative to rss2email written in golang with many filters","archived":false,"fork":false,"pushed_at":"2026-03-06T15:28:56.000Z","size":5419,"stargazers_count":193,"open_issues_count":6,"forks_count":14,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-03-06T17:35:56.203Z","etag":null,"topics":["email-sender","go","golang","hacktoberfest","hacktoberfest2022","pipes","rss","rss-feed","rss-feed-scraper","rss2email"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/slurdge.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["slurdge"]}},"created_at":"2020-03-01T16:57:41.000Z","updated_at":"2026-03-06T13:56:16.000Z","dependencies_parsed_at":"2023-02-16T04:01:33.344Z","dependency_job_id":"4fc51961-1af8-494c-9e83-1d7f7a785c23","html_url":"https://github.com/slurdge/goeland","commit_stats":null,"previous_names":[],"tags_count":44,"template":false,"template_full_name":null,"purl":"pkg:github/slurdge/goeland","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slurdge%2Fgoeland","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slurdge%2Fgoeland/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slurdge%2Fgoeland/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slurdge%2Fgoeland/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/slurdge","download_url":"https://codeload.github.com/slurdge/goeland/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slurdge%2Fgoeland/sbom","scorecard":{"id":832128,"data":{"date":"2025-08-11","repo":{"name":"github.com/slurdge/goeland","commit":"572ab8cc4ec1affd1d79bbd79af509503695aecb"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.9,"checks":[{"name":"Code-Review","score":1,"reason":"Found 1/10 approved changesets -- score normalized to 1","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":"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":"Maintained","score":5,"reason":"7 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:27","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:26","Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/docker.yml:1","Warn: topLevel 'contents' permission set to 'write': .github/workflows/release-please.yml:9","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":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":1,"reason":"dependency not pinned by hash detected -- score normalized to 1","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/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/slurdge/goeland/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:75: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docker.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-please.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/slurdge/goeland/release-please.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1","Warn: containerImage not pinned by hash: Dockerfile:15: pin your Docker image by updating alpine to alpine@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   7 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned","Info:   2 out of   2 goCommand 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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/docker.yml:13"],"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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.20.1 not signed: https://api.github.com/repos/slurdge/goeland/releases/222380692","Warn: release artifact v0.20.0 not signed: https://api.github.com/repos/slurdge/goeland/releases/222295049","Warn: release artifact v0.19.0 not signed: https://api.github.com/repos/slurdge/goeland/releases/210218380","Warn: release artifact v0.18.3 not signed: https://api.github.com/repos/slurdge/goeland/releases/136055834","Warn: release artifact v0.18.2 not signed: https://api.github.com/repos/slurdge/goeland/releases/135979996","Warn: release artifact v0.20.1 does not have provenance: https://api.github.com/repos/slurdge/goeland/releases/222380692","Warn: release artifact v0.20.0 does not have provenance: https://api.github.com/repos/slurdge/goeland/releases/222295049","Warn: release artifact v0.19.0 does not have provenance: https://api.github.com/repos/slurdge/goeland/releases/210218380","Warn: release artifact v0.18.3 does not have provenance: https://api.github.com/repos/slurdge/goeland/releases/136055834","Warn: release artifact v0.18.2 does not have provenance: https://api.github.com/repos/slurdge/goeland/releases/135979996"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2025-3787 / GHSA-fv92-fjc5-jj9h"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":9,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 21 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T18:00:56.023Z","repository_id":36976722,"created_at":"2025-08-23T18:00:56.023Z","updated_at":"2025-08-23T18:00:56.023Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30219256,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T14:02:48.375Z","status":"ssl_error","status_checked_at":"2026-03-07T14:02:43.192Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["email-sender","go","golang","hacktoberfest","hacktoberfest2022","pipes","rss","rss-feed","rss-feed-scraper","rss2email"],"created_at":"2024-08-02T11:00:48.719Z","updated_at":"2026-03-07T15:01:42.922Z","avatar_url":"https://github.com/slurdge.png","language":"Go","funding_links":["https://github.com/sponsors/slurdge"],"categories":["Software"],"sub_categories":["Feed Readers"],"readme":"# goeland\r\n\r\n![goeland](cmd/asset/goeland_small.png)\r\n\r\n![GitHub release (latest by date)](https://img.shields.io/github/v/release/slurdge/goeland)\r\n![version](https://img.shields.io/github/go-mod/go-version/slurdge/goeland)\r\n![GitHub](https://img.shields.io/github/license/slurdge/goeland)\r\n![Image license](https://img.shields.io/badge/Images-CC%20BY--SA%204.0-blueviolet)\r\n\r\n[![Build Status](https://github.com/slurdge/goeland/actions/workflows/build.yml/badge.svg)](https://github.com/slurdge/goeland/actions/workflows/build.yml)[![Docker images](https://github.com/slurdge/goeland/actions/workflows/docker.yml/badge.svg)](https://github.com/slurdge/goeland/actions/workflows/docker.yml)\r\n![CodeQL](https://github.com/slurdge/goeland/actions/workflows/codeql-analysis.yml/badge.svg)\r\n\r\nAn RSS to email, à la rss2email, written in Go.\r\n\r\nSupport this project by giving it a ⭐️ and sharing it.\r\n\r\n## About\r\n\r\nGoeland excels at creating beautiful emails from RSS feeds, tailored for daily or weekly digest.\r\n\r\nIt includes a number of filters (see below) that can transform the RSS content along the way. It can also consume other sources, such as Imgur tags.\r\n\r\nGoeland transforms this...\r\n\r\n```xml\r\n\u003crss version=\"2.0\"\u003e\r\n\u003cchannel\u003e\r\n\u003ctitle\u003ePhoronix\u003c/title\u003e\r\n\u003clink\u003ehttps://www.phoronix.com/\u003c/link\u003e\r\n\u003cdescription\u003e\r\nLinux Hardware Reviews, Benchmarks \u0026 Open-Source News\r\n\u003c/description\u003e\r\n\u003clanguage\u003een-us\u003c/language\u003e\r\n\u003citem\u003e\r\n\u003ctitle\u003e\r\nGoogle Announces KataOS As Security-Focused OS, Leveraging Rust \u0026 seL4 Microkernel\r\n\u003c/title\u003e\r\n\u003clink\u003ehttps://www.phoronix.com/news/Google-KataOS\u003c/link\u003e\r\n\u003cguid\u003ehttps://www.phoronix.com/news/Google-KataOS\u003c/guid\u003e\r\n\u003cdescription\u003e\r\nGoogle this week has announced the release of KataOS as their newest operating system effort focused on embedded devices running ambient machine learning workloads. KataOS is security-minded, exclusively uses the Rust programming language, and is built atop the seL4 microkernel as its foundation...\r\n\u003c/description\u003e\r\n\u003cpubDate\u003eSun, 16 Oct 2022 06:10:25 -0400\u003c/pubDate\u003e\r\n\u003c/item\u003e\r\n\u003c/rss\u003e\r\n```\r\n\r\ninto this\r\n\r\n![email](documentation/screenshots/phoronix_mixed.png)\r\n\r\nGoeland has a size-fits-all default template that works well with mobile, tablet, desktop and webmail clients.\r\n\r\nGoeland can extract full text from most article sources, enabling a ready to consume email.\r\n\r\n## Status\r\n\r\nGoeland is used in production with many email clients, and has sent over thousands of emails. It is considered stable.\r\n\r\n## Installation\r\n\r\nGrab the latest binary release from the [release page](https://github.com/slurdge/goeland/releases/latest/).\r\nBinaries are available for the following platforms:\r\n\r\n* linux/386\r\n* linux/amd64\r\n* linux/arm\r\n* linux/arm64\r\n* darwin/amd64\r\n* windows/amd64\r\n* windows/386\r\n\r\nJust put it in a folder where you have write permissions and run it first with :\r\n\r\n```console\r\ngoeland run\r\n```\r\n\r\nIf you are interested for another platform to be supported, please open a PR or submit a feature request.\r\n\r\n## Usage\r\n\r\nOn first run, if it doesn't exist yet, goeland will create a `config.toml` with the default values. You need to adjust the `[email]` section with your SMTP server details.\r\nThe config values can also be set with environment variables (e.g. `GOELAND_EMAIL_PASSWORD_FILE=/path/to/pass`).\r\n\r\n### Sources\r\n\r\nAfterwards, fill the `[sources]` and `[pipes]` sections.\r\nSource are identified by their name after the `[source.]` field:\r\n\r\n```toml\r\n[sources.hackernews]\r\ntype = \"feed\"\r\nurl = \"https://hnrss.org/newest\"\r\nfilters = [\"all\", \"today\"]\r\n```\r\n\r\nYou can then use `'hackernews'` in the following pipes.\r\n\r\nThe different source types are:\r\n\r\n* `\"feed\"`: RSS, Atom or JSON feed (all supported formats can be found [here](https://github.com/mmcdole/gofeed#supported-feed-types)). Fill in the `url` field.\r\n* `\"imgur\"`: Return most recent results for a tag. Fill in the the `tag` field.\r\n* `\"merge\"`: Will merge two or more sources together. Fill in the `sources` field with a list of sources: `sources = [\"source1\", \"source2\"]`. Especially useful to merge different sources on the same topic. Don't forget to `digest` or `combine` it later.\r\n\r\n### Filtering\r\n\r\nOne powerful aspect of goeland is filtering. Instead of sending the content of the RSS directly to the email system, it can transform it in a number of ways in order to make it easier to read, process, etc.\r\n\r\nAny number of filters can be defined, **the order is important**. For example, the following:\r\n\r\n```toml\r\nfilters = [\"unseen\", \"retrieve\", \"digest\"]\r\n```\r\n\r\nWill first keep only previously `unseen` entries, then make it nicer with the `retrieve` filter, and, at last, will put them all together with `digest`. This will create only one email with a SourceTitle as the title of the RSS feed.\r\n\r\nFilters can have options. For example, to get the 3 newest post, you would do:\r\n```toml\r\nfilters = [\"first(3)\"]\r\n```\r\n\r\nThe available filters are as follows, full documentation is in [filters.md](documentation/filters.md)\r\n\r\n* none: Removes all entries\r\n* all: Default, include all entries\r\n* first: Keep only the first (usually newest) entries (default 1)\r\n* last: Keep only the last (usually oldest) entries (default 1)\r\n* reverse: Reverse the order of the entries\r\n* random: Keep 1 or more random entries (default 5)\r\n* unseen: Keep only unseen entry. Entries that have been seen will be put in a `goeland.db` file. Use the `purge` command to remove seen entries\r\n* today: Keep only the entries of the day\r\n* lasthours: Keep only the entries that are from the X last hours (default 24)\r\n* digest: Make a digest of all entries (optional heading level, default 2)\r\n* combine: Combine all the entries into one source and use the first entry title as source title. Useful for merged sources\r\n* links: Rewrite relative links src=\"// and href=\"// to have an https:// prefix\r\n* embedimage: Embed a picture if the entry has an attachment with a type of picture (optional position: top|bottom|left|right, default top)\r\n* replace: Replace a string with another. Use with an argument like this: replace(myreplace) and define\r\n\r\n```toml\r\n[replace.myreplace]\r\n        from=\"A string\"\r\n        to=\"Another string\"\r\n```\r\n\r\nin your config file.\r\n\r\n* includelink: Include the link of entries in the digest form\r\n* includesourcetitle: Include source titles of entries in the digest form\r\n* retrieve: Retrieves the full content from a goquery. E.g. you can use `retrieve(div.content)` to get the full excerpts of Next INpact's [LeBrief](https://www.nextinpact.com/lebrief/)\r\n* language: Keep only the specified languages (best effort detection), use like this: `language(en,de)`\r\n* untrack: Removes feedburner pixel tracking\r\n* reddit: Better formatting for reddit rss\r\n* sanitize: Sanitize the content of entries (to be used if --unsafe-no-sanitize-filter was passed)\r\n* toc: Create a special table of content entry containing the titles of all entries. Use `toc(title)` to use the Title as a link\r\n* limitwords: Limit the number of words in the entry, use like this:  `limitwords(32)`\r\n\r\n### Pipes\r\n\r\nAfter defining some sources, you can send them to a pipe. One source can be sent to multiple pipes, but a pipe can only have one source. If you need to combine sources together, use the above special `merge`.\r\n\r\nA pipe has the following structure:\r\n\r\n```toml\r\n[pipes.hackernews]\r\nsource = \"hackernews\"\r\ndestination = \"email\"\r\nemail_to = \"example@example.com\"\r\nemail_from = \"HackerNews \u003cgoeland@example.com\u003e\"\r\nemail_title = \"{{.EntryTitle}}\"\r\ntemplate = \"/path/to/template.html\" # optional\r\n```\r\n\r\nYou can use EntryTitle, SourceTitle and SourceName in the email template. SourceTitle is the title of the RSS feed.\r\n\r\nFor debugging purposes, or in order to pipe to other systems, you can set the destination to `terminal`.\r\n\r\n### Email\r\n\r\nIn the email section you need to specify your outgoing mail server. You can specify both `encryption` and `allow-insecure` to connect to self-hosted servers. You can also specify `authentication` to select the appropriate option for your server (the options available are `\"none\"`, `\"plain\"`, `\"login\"` and `\"crammd5\"`; if unspecified it defaults to `\"plain\"`; see [`go-simple-mail`](https://pkg.go.dev/github.com/xhit/go-simple-mail/v2#AuthType)'s documentation for details).\r\n\r\n```toml\r\n[email]\r\nhost = \"smtp.example.com\"\r\nport = 25\r\nusername = \"default\"\r\npassword = \"p4ssw0rd\"\r\n# password_file = /run/password/goeland_smtp_pass\r\nencryption = \"tls\"\r\nallow-insecure = false\r\nauthentication = \"plain\"\r\n#Email customization\r\ninclude-header = true\r\ninclude-footer = true\r\n#footer = Your custom footer\r\n#logo = internal:goeland.png\r\n#template = /path/to/template.html\r\n```\r\n\r\nYou can create your own template, see [relevant documentation](documentation/templates.md).\r\nThe pipe template takes precedence over the main template defined in the `[email]` section.\r\n\r\n## Examples\r\n\r\nThis will bring you 6 puppies to your inbox.\r\n\r\n```toml\r\nloglevel = \"info\"\r\ndry-run = false\r\n\r\n[email]\r\nhost = \"smtp.sendgrid.net\"\r\nport = 587\r\nusername = \"apikey\"\r\npassword = \"\u003csendgridapikey\u003e\"\r\n\r\n[sources]\r\n\r\n[sources.insta]\r\nurl = \"https://rssbridge.example.com/?action=display\u0026bridge=Instagram\u0026context=Hashtag\u0026h=puppy\u0026media_type=picture\u0026direct_links=on\u0026format=MRss\"\r\ntype = \"feed\"\r\nfilters = [\"random(3)\"]\r\n\r\n[sources.imgur]\r\ntype = \"imgur\"\r\ntag = \"puppy\"\r\nfilters = [\"random(3)\"]\r\n\r\n[sources.puppies]\r\ntype = \"merge\"\r\nsources = [\"insta\", \"imgur\"]\r\nfilters = [\"combine\"]\r\n\r\n[pipes]\r\n\r\n[pipes.puppies]\r\nsource = \"puppies\"\r\ndestination = \"email\"\r\nemail_to = [\"puppylover@example.com\"]\r\nemail_from = \"DailyPuppy \u003cgoeland@example.com\u003e\"\r\n```\r\n\r\nThis will give you the latest article on a specific subreddit:\r\n\r\n```toml\r\nloglevel = \"none\"\r\ndry-run = false\r\ndatabase = \"goeland.db\"\r\n\r\n[email]\r\nhost = \"example.com\"\r\nport = 25\r\nusername = \"username\"\r\npassword = \"password\"\r\n\r\n[sources]\r\n\r\n[sources.reddit]\r\nurl = \"https://www.reddit.com/r/selfhosted/top.rss\"\r\ntype = \"feed\"\r\nfilters = [\"unseen\", \"includelink\", \"digest\"]\r\n\r\n[pipes.reddit]\r\nsource = \"reddit\"\r\ndestination = \"email\"\r\nemail_to = [\"example@example.com\"]\r\nemail_from = \"Reddit \u003creddit@example.com\u003e\"\r\n```\r\n\r\nIt is possible to send an email to multiple addresses, just put them in a list:\r\n\r\n```toml\r\n[pipes.reddit]\r\nsource = \"reddit\"\r\ndestination = \"email\"\r\nemail_to = [\"bob@example.com\", \"alice@gmail.com\", \"charles@yahoo.com\"]\r\nemail_from = \"Reddit \u003creddit@example.com\u003e\"\r\n```\r\n\r\nSee also the `examples/` folder.\r\n\r\n## Contributing\r\n\r\nFeel free to open issues or PR for bugs and suggestions for more filters and source types.\r\n\r\nIf you encounter a problematic feed, please open an issue with the content of the feed attached.\r\n\r\n## Future\r\n\r\nHere is a list of things that could be nice\r\n\r\n* image inliner\r\n* embedded scripting language for filters\u0026manipulation\r\n* remove tags for instagram\r\n* footer text\r\n* use enclosure of the feed as header image\r\n* \u003chttps://github.com/go-shiori/go-readability\u003e\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslurdge%2Fgoeland","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fslurdge%2Fgoeland","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslurdge%2Fgoeland/lists"}