{"id":15590173,"url":"https://github.com/bkeepers/mailmerge","last_synced_at":"2026-04-19T22:32:39.794Z","repository":{"id":66302921,"uuid":"88020090","full_name":"bkeepers/mailmerge","owner":"bkeepers","description":null,"archived":false,"fork":false,"pushed_at":"2017-04-12T19:13:18.000Z","size":8,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-12-26T10:48:00.353Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"kytrinyx/mailmerge","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bkeepers.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2017-04-12T06:58:28.000Z","updated_at":"2023-05-09T16:48:29.000Z","dependencies_parsed_at":null,"dependency_job_id":"b69fe1b2-68b8-4f09-8f33-408924683028","html_url":"https://github.com/bkeepers/mailmerge","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bkeepers/mailmerge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkeepers%2Fmailmerge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkeepers%2Fmailmerge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkeepers%2Fmailmerge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkeepers%2Fmailmerge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bkeepers","download_url":"https://codeload.github.com/bkeepers/mailmerge/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bkeepers%2Fmailmerge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32025701,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"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":[],"created_at":"2024-10-02T23:20:32.491Z","updated_at":"2026-04-19T22:32:39.777Z","avatar_url":"https://github.com/bkeepers.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Mailmerge\n\nA bare-bones mailmerge script.\n\n## How it works\n\nThe mailmerge combines a CSV file of email addresses and associated data, with a TEXT file containing\nthe subject and body of an email.\n\nIt uses the headers of the CSV file to replace placeholders in the email template.\n\nTake a look at test.csv (the data) and test.txt (the email template) for an example.\n\n**Required fields**\n\nThe CSV file must have a header named `email`, which contains the email addresses used to dispatch\nthe emails.\n\n## Setup\n\nInstall the dependencies using bundler.\n\n```\nbundle install\n```\n\nCreate a .env file, and define the SMTP settings:\n\n```\ncp env.example .env\n# edit .env\n```\n\nThat can be whatever SMTP settings you have. Sendgrid, Mailgun, Gmail, etc.\n\nIf you want to send email from your Gmail account, you can set up an application-specific password, in\nhttps://security.google.com/settings/security/apppasswords\n\n```\nSMTP_LOGIN=\u003cyour gmail address\u003e\nSMTP_PASSWORD=\u003cyour app-specific password\u003e\nSMTP_PORT=587\nSMTP_SERVER=smtp.gmail.net\n```\n\n## Sending Emails\n\nSend emails with the following command:\n\n```\nCSV=foo.csv TEMPLATE=bar.txt ./mailmerge\n```\n\nIf you don't pass the CSV and TEMPLATE arguments, then the script will use the defaults:\n\n```\nCSV=test.csv\nTEMPLATE=test.txt\n```\n\n### Email Template\n\nThe first line of the template file is used for the subject line.\n\nThe rest of the file is used as the body of the email.\n\nEach header can be referenced in the email template using the header name,\nenclosed in double curly-braces (e.g. `{{username}}`).\n\nSee `test.txt` for an example.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbkeepers%2Fmailmerge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbkeepers%2Fmailmerge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbkeepers%2Fmailmerge/lists"}