Design requirements
- Send from the real ETH mailbox via authenticated SMTP (
mail.ethz.ch:587, STARTTLS — R package blastula or emayili), so replies and bounces land where they can be acted on. No third-party bulk-mail service: this is individual scholarly correspondence and should look like it.
- One message per unique address, grouping multiple papers into a single email.
- Dry-run by default (write previews to disk, send nothing) and a send-to-self test mode before any real batch.
- Sent log (git-ignored) appended after each send; a logged address is never emailed again, so runs are resumable and duplicate-proof.
- Batch cap (~20 per run) with randomised 20–40 s spacing; work off the 153 recipients over several days. A burst of near-identical messages from one account is exactly what spam filters and relay rate limits trigger on.
- Credentials only via environment variables; nothing secret in the repo.
- Skip any row marked
exclude in the contact list (the review and opt-out mechanism).
Follow-up tasks for @larnsce
A draft send script implementing all of the above exists on branch claude/automated-author-email-outreach-amipwb (data-raw/outreach/02_send_emails.R) — untested against a live mailbox.
Refs #41
Design requirements
mail.ethz.ch:587, STARTTLS — R packageblastulaoremayili), so replies and bounces land where they can be acted on. No third-party bulk-mail service: this is individual scholarly correspondence and should look like it.excludein the contact list (the review and opt-out mechanism).Follow-up tasks for @larnsce
mail.ethz.ch:587, login = ETH email + mail password). Some mailboxes need an app-specific password or have legacy SMTP disabled — check your ETH mailbox settings / IT knowledge base and note the working host/port/user here.A draft send script implementing all of the above exists on branch
claude/automated-author-email-outreach-amipwb(data-raw/outreach/02_send_emails.R) — untested against a live mailbox.Refs #41