{"id":45186877,"url":"https://github.com/dburkart/check-sieve","last_synced_at":"2026-04-08T05:02:00.422Z","repository":{"id":33705726,"uuid":"37358938","full_name":"dburkart/check-sieve","owner":"dburkart","description":"Syntax checker for mail sieves.","archived":false,"fork":false,"pushed_at":"2026-04-08T03:41:16.000Z","size":666,"stargazers_count":57,"open_issues_count":28,"forks_count":8,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-04-08T04:27:11.853Z","etag":null,"topics":["c","email-filtering","mail-sieves","managesieve","rfc","sieve"],"latest_commit_sha":null,"homepage":"","language":"C++","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/dburkart.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-06-13T05:17:28.000Z","updated_at":"2026-04-08T03:29:44.000Z","dependencies_parsed_at":"2023-01-15T02:09:03.191Z","dependency_job_id":"f20ddf2e-c2ce-4e30-8f46-98c698c705f7","html_url":"https://github.com/dburkart/check-sieve","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/dburkart/check-sieve","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dburkart%2Fcheck-sieve","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dburkart%2Fcheck-sieve/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dburkart%2Fcheck-sieve/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dburkart%2Fcheck-sieve/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dburkart","download_url":"https://codeload.github.com/dburkart/check-sieve/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dburkart%2Fcheck-sieve/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31540826,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"online","status_checked_at":"2026-04-08T02:00:06.127Z","response_time":54,"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":["c","email-filtering","mail-sieves","managesieve","rfc","sieve"],"created_at":"2026-02-20T11:03:00.931Z","updated_at":"2026-04-08T05:02:00.416Z","avatar_url":"https://github.com/dburkart.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003ch1\u003e\n        check-sieve\n        \u003cbr\u003e\n        \u003cem\u003e\u003csup\u003e\u003csub\u003e\n            Because breaking your sieve in production sucks.\n        \u003c/sub\u003e\u003c/sup\u003e\u003c/em\u003e\n    \u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![badge-license]][url-license]\n[![badge-contributors]][url-contributors]\n![badge-language]\n[![badge-tests]][url-tests]\n[![badge-last-release]][url-last-release]\n\n\u003c/div\u003e\n\n[badge-license]: https://img.shields.io/github/license/dburkart/check-sieve?style=for-the-badge\n[badge-contributors]: https://img.shields.io/github/contributors/dburkart/check-sieve?style=for-the-badge\n[badge-language]: https://img.shields.io/github/languages/top/dburkart/check-sieve?style=for-the-badge\n[badge-tests]: https://img.shields.io/github/actions/workflow/status/dburkart/check-sieve/c-cpp.yml?style=for-the-badge\u0026label=Tests\n[badge-last-release]: https://img.shields.io/github/release-date/dburkart/check-sieve?style=for-the-badge\u0026label=Last%20Release\n\n[url-license]: ./LICENSE\n[url-contributors]: https://github.com/dburkart/check-sieve/graphs/contributors\n[url-tests]: https://github.com/dburkart/check-sieve/actions\n[url-last-release]: https://github.com/dburkart/check-sieve/releases/latest\n\n\nThis project aims to make checking mail [Sieve][wiki-sieve] syntax easy and painless.\n_Because breaking your sieve in production sucks._\n\n[wiki-sieve]: https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language)\n\nParticular attention is paid to the quality of errors generated. For example:\n\n```\nErrors found in \"testsieve\":\n\nIncorrect syntax for command \"convert\".\nOn line 2:\nconvert image image [\"pix-x=320\",\"pix-y=240\"];\n^^^^^^^\nUsage: convert  \u003cquoted-from-media-type: string\u003e                                      \n         \u003cquoted-to-media-type: string\u003e                                        \n         \u003ctranscoding-params: string-list\u003e  \n```\n\nFor a web-based demonstration of check-sieve which is entirely browser-based, visit https://checksieve.com.\n\n## Usage\n```\nUsage: check-sieve [options] file1 [file2 ...]                                 \n                                                                               \nOptions:                                                                       \n  -h, --help               Show this message                                   \n  --max-list-length N      Flag lists over a certain length (default: none)    \n  --server \u003chost\u003e:\u003cport\u003e   Only allow capabilities advertised by the specified \n                           server.                                             \n  --trace-parser           Trace the operation of the parser                   \n  --trace-scanner          Trace the operation of the scanner                  \n  --trace-tree             Trace the abstract-syntax-tree                      \n  --simulate \u003cemail-file\u003e  Simulate sieve processing against an email (.eml)\n  --version                Print out version information \n```\n\n## Features\n### Supported RFCs\n* Sieve: An Email Filtering Language ([RFC 5228](https://tools.ietf.org/html/rfc5228))\n* Variables Extension ([RFC 5229](https://tools.ietf.org/html/rfc5229))\n* Date and Index Extensions ([RFC 5260](https://tools.ietf.org/html/rfc5260))\n* Vacation Extension ([RFC 5230](https://tools.ietf.org/html/rfc5230))\n* Vacation \"Seconds\" Parameter ([RFC 6131](https://tools.ietf.org/html/rfc6131))\n* Include Extension ([RFC 6609](https://tools.ietf.org/html/rfc6609))\n* Copying Without Side Effects ([RFC 3894](https://tools.ietf.org/html/rfc3894))\n* Reject and Extended Reject Extensions ([RFC 5429](https://tools.ietf.org/html/rfc5429))\n* Body Extension ([RFC 5173](https://tools.ietf.org/html/rfc5173))\n* Relational Extension ([RFC 5231](https://tools.ietf.org/html/rfc5231))\n* MIME Part Tests, Iteration, Extraction, Replacement, and Enclosure ([RFC 5703](https://tools.ietf.org/html/rfc5703))\n* Imap4flags Extension ([RFC 5232](https://tools.ietf.org/html/rfc5232))\n* Editheader Extension ([RFC 5293](https://tools.ietf.org/html/rfc5293))\n* Regex Extension ([DRAFT](https://tools.ietf.org/html/draft-ietf-sieve-regex-01))\n* Spamtest and Virustest Extensions ([RFC 5235](https://tools.ietf.org/html/rfc5235))\n* Extensions for Notifications ([RFC 5435](https://tools.ietf.org/html/rfc5435))\n* Subaddress Extension ([RFC 5233](https://tools.ietf.org/html/rfc5233))\n* Ihave Extension ([RFC 5463](https://tools.ietf.org/html/rfc5463))\n* Environment Extension ([RFC 5183](https://tools.ietf.org/html/rfc5183))\n* Sieve Notification Mechanism: mailto ([RFC 5436](https://tools.ietf.org/html/rfc5436))\n* Extensions for Checking Mailbox Status and Accessing Mailbox Metadata ([RFC 5490](https://tools.ietf.org/html/rfc5490))\n* Internet Message Access Protocol (IMAP) Events ([RFC 6785](https://tools.ietf.org/html/rfc6785))\n* Converting Messages before Delivery ([RFC 6558](https://tools.ietf.org/html/rfc6558))\n* Detecting Duplicate Deliveries ([RFC 7352](https://tools.ietf.org/html/rfc7352))\n* Delivering to Special-Use Mailboxes ([RFC 8579](https://tools.ietf.org/html/rfc8579))\n* File Carbon Copy (FCC) ([RFC 8580](https://tools.ietf.org/html/rfc8580))\n* Delivery by MAILBOXID ([RFC 9042](https://tools.ietf.org/html/rfc9042))\n* Delivery Status Notifications and Deliver-By Extensions ([RFC 6009](https://tools.ietf.org/html/rfc6009))\n* Extension for Processing Calendar Attachments ([RFC 9671](https://datatracker.ietf.org/doc/html/rfc9671))\n* Proton Expiration Extension ([vnd.proton.expire](https://proton.me/support/sieve-advanced-custom-filters#managing-expiration))\n* Proton Eval Extension ([vnd.proton.eval](https://proton.me/support/sieve-advanced-custom-filters#transforming-variables))\n* Dovecot Invoking External Programs ([vnd.dovecot.{pipe,filter,execute}](https://raw.githubusercontent.com/dovecot/pigeonhole/refs/heads/main/doc/rfc/spec-bosch-sieve-extprograms.txt))\n\n\u003e [!NOTE]\n\u003e If you find any discrepancies with these RFCs,\n\u003e have a request for an RFC not included,\n\u003e or have test-cases that should work but don't,\n\u003e please [file an issue][file-issue].\n\n[file-issue]: https://github.com/dburkart/check-sieve/issues/new\n\n### Server capability matching\n\nSome mail servers support a subset of the above capabilities.\nYou can use the `--server` flag to have `check-sieve` match the capabilities of your sieve server.\nThis helps avoid cases where your sieve might break because you use a feature your server doesn't support!\n\n### Mail sorting simulation\n\nYou can simulate sorting a particular email by passing `--simulate \u003cpath/to/email.eml\u003e`.\n`check-sieve` will parse your sieve script(s), and print out a list of matched tests, and actions taken.\n\nAdditionally, you can maintain a directory of \"test\" email files, which can function as regression tests with the `--test-dir` flag.\nSimply run `check-sieve \u003csieve-file\u003e --test-dir \u003cpath/to/dir\u003e`, and `check-sieve` will simulate mail sorting, comparing output to any .out files in the same directory.\nRebase the `.out` files with the `--rebase` flag.\n\n\u003e [!NOTE]\n\u003e This feature is experimental, and does not currently\n\u003e implement all of the RFCs listed above. If you'd like\n\u003e your RFC of choice to be prioritized, leave a note in [issue #30](https://github.com/dburkart/check-sieve/issues/30).\n\n## Development\n### Dependencies\n`check-sieve` minimally depends on having a modern C++ compiler and the\n[Make][make] build automation software.\n\nOn BSD-like systems such as FreeBSD, the [`gmake`][gnu-make] tool is required.\n\n[make]: https://en.wikipedia.org/wiki/Make_(software)\n[gnu-make]: https://www.gnu.org/software/make/\n\nBuilding `check-sieve` only depends on those aforementioned tools. Developing\n`check-sieve` requires addition dependencies:\n\n* [GNU Bison][bison] \u003e= v3.0.4\n* [Flex][flex] \u003e= v2.5.35\n* [Python][python] \u003e= 3.7\n* Python development headers (for testing)\n\nAdditionally, [Emscripten][emscripten] is required to generate the Check Sieve JavaScript library.\n\n[bison]: https://www.gnu.org/software/bison/\n[flex]: https://github.com/westes/flex\n[python]: https://www.python.org/\n[emscripten]: https://emscripten.org/\n\n#### Installing dependencies\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eUbuntu and Debian-based distributions\u003c/strong\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n```bash\n# Synchronize mirrors\nsudo apt-get update\n\n# Core development dependencies\nsudo apt-get install make gcc g++ bison flex python3 libpython3-dev \n\n# JavaScript dependencies\nsudo apt-get install emscripten\n```\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eArch Linux\u003c/strong\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n```bash\n# Synchronize mirrors, and\n# Core development dependencies\nsudo pacman -Syu make gcc bison flex python \n\n# JavaScript dependencies\nsudo pacman -Sy emscripten\n```\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eFedora / RHEL\u003c/strong\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n```bash\nsudo dnf install make gcc bison flex python3 python3-devel\n```\n\nThere is no package providing emscripten, so you will need to install the [emsdk](https://emscripten.org/docs/getting_started/downloads.html).\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Compiling\n\nAt the moment, there are four targets for this project:\n\n1. `check-sieve` -- This is a command-line program you can use to verify sieves.\n2. `libchecksieve.a` -- A statically linked library for embedding in other programs (like `check-sieve`).\n3. `checksieve.so` -- This is a python extension created for use by the unit tests in the test directory\n4. `wasm` -- This builds a webassembly javascript library using emscripten.\n\nTo build `check-sieve` simply run `make`. This will also build the static library.\nRunning `make test` will compile `checksieve.so` and run the python tests in the tests directory.\nFinally, running `make all` will run all of the other targets.\n\n#### Installing\n\nTo install to `/usr/local/`, simply run the following:\n\n```\nmake install\n```\n\nTo install to a custom location, build and install with `INSTALL_PREFIX` set in your environment\nto the desired location.\n\n##### Packages\n\n* Arch Linux ([community](https://archlinux.org/packages/extra/x86_64/check-sieve/) repository)\n\n##### Snap\n\nInstallation of the latest edge snap from snapcraft can be done with the following command:\n```\nsnap install --edge check-sieve\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdburkart%2Fcheck-sieve","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdburkart%2Fcheck-sieve","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdburkart%2Fcheck-sieve/lists"}