{"id":32999731,"url":"https://github.com/cloudinary/mailinary","last_synced_at":"2025-12-25T01:48:21.614Z","repository":{"id":41803484,"uuid":"158552375","full_name":"cloudinary/mailinary","owner":"cloudinary","description":"scrape and email web pages on schedule or on demand","archived":false,"fork":false,"pushed_at":"2024-03-31T10:13:47.000Z","size":573,"stargazers_count":3,"open_issues_count":13,"forks_count":2,"subscribers_count":14,"default_branch":"master","last_synced_at":"2024-07-06T03:44:06.837Z","etag":null,"topics":["cloudinary-library"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/cloudinary.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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}},"created_at":"2018-11-21T13:30:08.000Z","updated_at":"2021-11-03T10:09:28.000Z","dependencies_parsed_at":"2024-03-31T11:24:46.116Z","dependency_job_id":"a7b247ef-c0c5-42ba-a4be-2713d43e0e7e","html_url":"https://github.com/cloudinary/mailinary","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cloudinary/mailinary","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudinary%2Fmailinary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudinary%2Fmailinary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudinary%2Fmailinary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudinary%2Fmailinary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cloudinary","download_url":"https://codeload.github.com/cloudinary/mailinary/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudinary%2Fmailinary/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":285879574,"owners_count":27247109,"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-11-22T02:00:05.934Z","response_time":64,"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":["cloudinary-library"],"created_at":"2025-11-13T13:00:27.152Z","updated_at":"2025-11-23T00:02:23.097Z","avatar_url":"https://github.com/cloudinary.png","language":"JavaScript","readme":"Mailinary\n==========\n\nScheduled mail delivery of web content\n\nBasically what it does it scrapes a url and replaces it's content or parts of it with screenshots, and sends it as a mail message.\n\nI had an attachment version but eventualy went with image hosting since mail messages where too large.\nCloudinary, and sends the resulting HTML as a  mail message.\n\n\n## Setup \n\n1. clone the repository \n```\n$ git clone git@github.com:cloudinary/mailinary.git\n```\n2. install dependencies\n```\n$ npm install\n```\n3. populate your environment configuration file (.env) \n\n```\nSMTP_HOST=YOUR_SMTP_HOST\nSMTP_PORT=YOUR_SMTP_PORT\nSMTP_SECURE=0\nSMTP_AUTH_USER=YOUR_SMTP_AUTH_USER\nSMTP_AUTH_PASS=YOUR_SMTP_AUTH_PASS\nCLOUDINARY_URL=YOUR_CLOUDINARY_URL\n```\n4. test with a one time mail delivery\n```\nbin/mailinary --url https://marketplace.clicdata.com/v/yYF0JrwBkrHw --subject \"it works 🔥\" --from reports@YOUR_DOMAIN --to YOU@YOUR_DOMAIN --selectors '#dashboard'\n```\n\n\n### Job (configuration options): \n\n- `to` \u003c[string]\u003e recepient email address list seperated by comma.\n- `from` \u003c[string]\u003e sender email address.\n- `subject` \u003c?[string|function]\u003e email message subject, either as string or a function that receives html and options object.\n- `url` \u003c[string]\u003e the url to scrape.\n- `selectors` \u003c[Array\u003c[string|RegExp]\u003e]\u003e array of strings or regular expressions of selectors of elements that would be replaced with a screenshot.\n- `page_load_timeout` \u003c?[number]\u003e add aditional wait time to page load.\n- `schedule ` \u003c[string]\u003e schedule in cron expression.\n- `login_form` \u003c[Object|function]\u003e either async function that receives a page handle and interacts with the page or an Object with element selector/value pairs .\n- `sentinel` \u003c[Object]\u003e a kill switch configuration for stale reports.\n  - `validate` \u003c[function]\u003e receives a handle to the element and checks if a condition is met.\n  - `error_notifier` \u003c[Object]\u003e error notifier configuration.\n    - `from` \u003c[string]\u003e sender email address.\n    - `to` \u003c[string]\u003e error notification recepient email address list seperated by comma.\n    - `subject` \u003c?[string|function]\u003e email message subject, either as string or a function that receives html and options object.\n\n\n## Debugging tips\n\n1. Turn off headless mode - sometimes it's useful to see what the browser is\n   displaying. Instead of launching in headless mode, launch a full version of\n   the browser using  `UI_DEBUG=1`:\n\n        UI_DEBUG=1 bin/mailinary --job jobs/schedule/sample\n\n\n### But i don't have a Cloudinary account\n\nYou can sign up for a [free account](https://cloudinary.com/users/register/free) .\n\nTo this date (nov 2018) Cloudinary's free plan includes 25 monthly credits (1 Credit equals 1000 transformations or 1GB of managed storage or 1GB of monthly viewing bandwidth)\nwhich is more than plenty if you have a daily mail process in place.\n\nAdditional resources are available at:\n\n* [Website](https://cloudinary.com)\n* [Documentation](https://cloudinary.com/documentation)\n\n## License #######################################################################\n\nReleased under the MIT license.\n\n","funding_links":[],"categories":["Tools"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudinary%2Fmailinary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloudinary%2Fmailinary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudinary%2Fmailinary/lists"}