{"id":15713964,"url":"https://github.com/hashnuke/ennio","last_synced_at":"2025-03-30T19:24:52.125Z","repository":{"id":66983715,"uuid":"47702341","full_name":"HashNuke/ennio","owner":"HashNuke","description":null,"archived":false,"fork":false,"pushed_at":"2016-11-07T05:51:05.000Z","size":55,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-05T21:58:39.338Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HashNuke.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-12-09T16:05:50.000Z","updated_at":"2017-07-25T00:56:46.000Z","dependencies_parsed_at":"2023-03-01T16:15:30.171Z","dependency_job_id":null,"html_url":"https://github.com/HashNuke/ennio","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HashNuke%2Fennio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HashNuke%2Fennio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HashNuke%2Fennio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HashNuke%2Fennio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HashNuke","download_url":"https://codeload.github.com/HashNuke/ennio/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246367118,"owners_count":20765828,"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","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":[],"created_at":"2024-10-03T21:34:22.796Z","updated_at":"2025-03-30T19:24:52.085Z","avatar_url":"https://github.com/HashNuke.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ennio\n\n**TODO: Add description**\n\n## Installation\n\nIf [available in Hex](https://hex.pm/docs/publish), the package can be installed as:\n\n  1. Add ennio to your list of dependencies in `mix.exs`:\n\n        def deps do\n          [{:ennio, \"~\u003e 0.0.1\"}]\n        end\n\n  2. Ensure ennio is started before your application:\n\n        def application do\n          [applications: [:ennio]]\n        end\n\n## TODO\n\n* [x] EHLO\n* [x] HELO\n* [x] MAIL verb\n* [x] RCPT verb\n* [x] RSET verb\n* [x] STARTTLS\n* [x] Renegotiate SSL on RSET\n* [x] Assign session ID as soon as session starts\n* [ ] plain \u0026 html body parsing\n* [ ] AUTH\n* [ ] CHUNKING\n* [ ] PIPELINING\n* [ ] SPF records\n* [ ] MX verification\n* [ ] 8BITMIME\n* [ ] Support for \"EHLO \u003c\u003e\" and \"EHLO \u003cFQDN\u003e\"\n\n\n## WIP notes\n\n* start_ranch stuff should actually be in a supervisor\n* cache the DNS records for atleast 3 minutes in ETS\n* If user authenticates, then it's an outgoing email (to be relayed to another server). Else it is incoming mail to accept.\n* Check relaying mail if it is destined for the same (self) email server.\n\n\u003e  When the RFC 822 format ([28], [4]) is being used, the mail data\n   include the header fields such as those named Date, Subject, To, Cc,\n   and From.  Server SMTP systems SHOULD NOT reject messages based on\n   perceived defects in the RFC 822 or MIME (RFC 2045 [21]) message\n   header section or message body.  In particular, they MUST NOT reject\n   messages in which the numbers of Resent-header fields do not match or\n   Resent-to appears without Resent-from and/or Resent-date.\n\n* Perform recipient verification only after the whole mail transaction is complete (email bouncing)\n\n* Should prepend a \"Received\" header with mandatory protocol in the via clause.\nexample: \"from [ClientIP] by [self-ip] via SMTP, [date]\"\n\n\n* 421 response if need to shutdown SMTP service\n* EHLO with address literal for clients or FQDN for relays\n  * size\n  * extension list\n* What happens to Bcc emails? Are they sent the 2nd time or single copy?\n\n* RFC-822 says order for headers is important: \"Return-Path\", \"Received\", \"Date\",  \"From\",  \"Subject\",  \"Sender\", \"To\", \"cc\", etc\n\n## RFCs\n\n* [RFC 5321](https://tools.ietf.org/html/rfc5321) SMTP\n* [RFC 822](https://tools.ietf.org/html/rfc822) Standard for ARPA Internet Text Messages\n* [RFC 7504](https://tools.ietf.org/html/rfc7504) SMTP 521 and 556 reply codes\n* [RFC 6409](https://tools.ietf.org/html/rfc6409) Message Submission for Mail\n* [RFC 4954](https://tools.ietf.org/html/rfc4954) SMTP Service Extension for Authentication\n* [RFC 6152](https://tools.ietf.org/html/rfc6152) 8BITMIME extension\n\n* [RFC 5322](https://tools.ietf.org/html/rfc5322) Internet Message Format\n* [RFC 2045](https://tools.ietf.org/html/rfc2045) MIME\n\n## To test things out on command line\n\n```\n# For a plain connection\ntelnet localhost 2525\n\n# To use STARTTLS\nopenssl s_client -starttls smtp -crlf -connect localhost:2525\n```\n\nReplace port as necessary. 2525 is the default Ennio port.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhashnuke%2Fennio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhashnuke%2Fennio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhashnuke%2Fennio/lists"}