Once upon a time, I used to store some automated small backups into GMail just by having the scheduled backup send an email to my GMail account. At one stage they blocked me from doing so, marking those repeated email as SPAM.
After that, I took a different approach: I kept sending the mail on the SAME server as the backup, and using IMAP I could DRAG-and-DROP the backup attachment from the mailbox on one server to the mailbox on another server (=GMail). They did not mark me as a spammer that way, of course.
So that worked for a while, but then I got tired of doing this manually.
So the following ruby script is the way I automated the “move offsite” part of that backup.
For completeness, I will give the due credits about who set me on the right track: I started off by this example by Ryan.
#!/usr/bin/env ruby begin_ = Time.now #includes require 'net/imap' ##Source Info $SRCSERVER="mail.muscetta.com" $SRCPORT=143 $SRCSSL=false $SRCUSERNAME="daniele" $SRCPASSWORD="" $SRCFOLDER="INBOX.Backups" ##Destination Info $DSTSERVER="imap.gmail.com" $DSTPORT=993 $DSTSSL=true $DSTUSERNAME="muscetta@gmail.com" $DSTPASSWORD="" $DSTFOLDER="Backup" #connect to source puts "connecting to source server #{$SRCSERVER}... nn" srcimap = Net::IMAP.new($SRCSERVER,$SRCPORT,$SRCSSL) srcimap.login($SRCUSERNAME, $SRCPASSWORD) srcimap.select($SRCFOLDER) #connect to destination puts "connecting to destination server #{$DSTSERVER}... nn" dstimap = Net::IMAP.new($DSTSERVER,$DSTPORT,$DSTSSL) dstimap.login($DSTUSERNAME, $DSTPASSWORD) dstimap.select($DSTFOLDER) # Loop through all messages in the source folder. uids = srcimap.uid_search(['ALL']) if uids.length > 0 $count = uids.length puts "found #{$count} messages to move... nn" srcimap.uid_fetch(uids, ['ENVELOPE']).each do |data| mid = data.attr['ENVELOPE'].message_id # Download the full message body from the source folder. puts "reading message... #{mid}" msg = srcimap.uid_fetch(data.attr['UID'], ['RFC822', 'FLAGS', 'INTERNALDATE']).first # Append the message to the destination folder, preserving flags and internal timestamp. puts "copying message #{mid} to destination..." dstimap.append($DSTFOLDER, msg.attr['RFC822'], msg.attr['FLAGS'], msg.attr['INTERNALDATE']) #delete the msg puts "deleting messsage #{mid}..." srcimap.uid_store(data.attr['UID'], '+FLAGS', [:Deleted]) srcimap.expunge end #disconnect dstimap.close srcimap.close end total_time = Time.now - begin_ puts "Done. RunTime: #{total_time} sec. nn"