What if protonmail, gmail or whatever email provider you are using goes belly-up? Are all your accounts doomed?

If so, what are some preventive measures? Adding backup emails to your registered accounts?

  • scsi@lemm.ee
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    7 days ago

    If you have access to some sort of basic Linux system (cloud server, local server whatever works for you) you can run a program on a timer such as https://isync.sourceforge.io/ (Debian package: isync) which reads email from one source and clones it to another. Be careful and run it in a security context that meets your needs (I use a local laptop w/encryption at home that runs headless 24/7, think raspberry Pi mode).

    This includes IMAP (1) -> IMAP (2) as well as IMAP -> Local and so on; as with any app you’ll need to spend a bit learning how to build the optimum config file for your needs, but once you get it going it’s truly a “set and forget” little widget. Use an on-fail service like https://healthchecks.io in your wrapper script to get notified on error, then go about your life.

    Edit: @[email protected] glanced at your comments and see you have a lot of self-hosting chops, here’s a markdown doc of mine to use isync to clone one IMAP provider (domain1.com) to another IMAP provider (domain2.com) subfolder for archiving. (using a subfolder allows you to go both ways and use both domains normally)

    ----

    Sync email via IMAP from host1/domain1 to a subfolder on host2/domain2 via a cron/timer. Can be reversed as well, just update Patterns to exclude the subfolders from being cross-replicated (looped).

    • Install the isync package: apt-get update && apt-get install isync

    Passwords for IMAP must be left on disk in plain text

    • Generate “app passwords” at the email providers, host1 can be READ only
    • Keep ${HOME}/.secure contents on encrypted volume unlocked manually

    The mbsync program keeps it’s transient index files in ${HOME}/.mbsync/ with one per IMAP folder; these are used to keep track of what it’s already synced. Should something break it may be necessary to delete one of these files to force a resync.

    By design, mbsync will not delete a destination folder if it’s not empty first; this means if you delete a folder and all emails on the source in one step, a sync will break with an error/warning. Instead, delete all emails in the folder first, sync those deletions, then delete the empty folder on the source and sync again. See: https://sourceforge.net/p/isync/mailman/isync-devel/thread/f278216b-f1db-32be-fef2-ccaeea912524%40ojkastl.de/#msg37237271

    Simple crontab to run the script:

    0 */6 * * * /home/USER/bin/hasync.sh
    

    Main config for the mbsync program:

    ${HOME}/.mbsyncrc

    # Source
    IMAPAccount imap-src-account
    Host imap.host1.com
    Port 993
    User user1
    PassCmd "cat /home/USER/.secure/psrc"
    SSLType IMAPS
    SystemCertificates yes
    PipeLineDepth 1
    #CertificateFile /etc/ssl/certs/ca-certificates.crt
    
    # Dest
    IMAPAccount imap-dest-account
    Host imap.host2.com
    Port 993
    User user2
    PassCmd "cat /home/USER/.secure/pdst"
    SSLType IMAPS
    SystemCertificates yes
    PipeLineDepth 1
    #CertificateFile /etc/ssl/certs/ca-certificates.crt
    
    # Source map
    IMAPStore imap-src
    Account imap-src-account
    
    # Dest map
    IMAPStore imap-dest
    Account imap-dest-account
    
    # Transfer options
    Channel hasync
    Far :imap-src:
    Near :imap-dest:HASync/
    Sync Pull
    Create Near
    Remove Near
    Expunge Near
    Patterns *
    CopyArrivalDate yes
    

    This script leverages healthchecks.io to alert on failure; replace XXXXX with the UUID of your monitor URL.

    ${HOME}/bin/hasync.sh

    #!/bin/bash
    
    # vars
    LOGDIR="${HOME}/log"
    TIMESTAMP=$(date +%Y-%m-%d_%H%M)
    LOGFILE="${LOGDIR}/mbsync_${TIMESTAMP}.log"
    HCPING="https://hc-ping.com/XXXXXXXXXXXXXXXXXXXXXXXXX"
    
    # preflight
    if [[ ! -d "${LOGDIR}" ]]; then
      mkdir -p "${LOGDIR}"
    fi
    
    # sync
    echo -e "\nBEGIN $(date +%Y-%m-%d_%H%M)\n" >> "${LOGFILE}"
    /usr/bin/mbsync -c ${HOME}/.mbsyncrc -V hasync 1>>"${LOGFILE}" 2>&1
    EC=$?
    echo -e "\nEC: ${EC}" >> "${LOGFILE}"
    echo -e "\nEND $(date +%Y-%m-%d_%H%M)\n" >> "${LOGFILE}"
    
    # report
    if [[ $EC -eq 0 ]]; then
      curl -fsS -m 10 --retry 5 -o /dev/null "${HCPING}"
      find "${LOGDIR}" -type f -mtime +30 -delete
    fi
    
    exit $EC