Send a periodic email through Gmail SMTP to a configured Google Voice SMS gateway address. Run it manually or with the included monthly GitHub Actions schedule.
SMTP acceptance is the only delivery result this script can verify. It does not prove SMS delivery or guarantee that a Google Voice number stays active.
- Create a private copy of this repository for your deployment.
- Add the following Actions secrets under Settings → Secrets and variables → Actions.
- Enable Actions and run Google Voice Keep Alive & Auto Log.
- Check both the send step and the destination account.
| Secret | Value |
|---|---|
GMAIL_USER |
Sender's Gmail address |
GMAIL_PASSWORD |
Gmail App Password |
GV_GATEWAY |
Destination ending in @txt.voice.google.com |
Use a dedicated Gmail App Password with two-step verification enabled. Keep credentials and destination addresses out of the repository and logs.
The workflow runs at 00:00 UTC on the first day of each month. Edit its cron expression to change the schedule. Scheduled runs may be delayed.
Runs are serialized and limited to 15 minutes; SMTP has a 30-second timeout. A send error fails the run. The workflow writes a timestamped record to keepalive.log on the logs branch, which requires contents: write permission. This record is not a delivery receipt.
Python's standard library is sufficient. Supply the three settings through your trusted environment or secret manager, then run:
python main.pyThis sends a real message. To run the isolated unit tests instead:
python -m unittest discover -s testsIf SMTP authentication fails, check the account and App Password. If SMTP accepts the message but the destination does not receive it, check the gateway and account directly rather than repeatedly resending.
Support · Contributing · Security · Code of conduct
MIT.
Weekly all-branch secret scan scans all branches and history on Mondays at
04:23 UTC (12:23 Asia/Shanghai). GitHub schedules can be delayed or skipped; an
active workflow alone does not prove a scan ran. Check the Actions run history
and use workflow_dispatch when a scheduled run is missing.
A successful Secret scan / Gitleaks job verifies the scanner completed. It
does not run the application's account workflow. Findings retain paths and
rule names only; never copy secret values into logs, issues or documentation.