Use Python to:
- send a plain text email
- send an email with attachment
- receive and filter emails according to some criteria
Use Python to:
import smtplib | |
from email.mime.text import MIMEText | |
smtp_ssl_host = 'smtp.gmail.com' # smtp.mail.yahoo.com | |
smtp_ssl_port = 465 | |
username = 'USERNAME or EMAIL ADDRESS' | |
password = 'PASSWORD' | |
sender = '[email protected]' | |
targets = ['[email protected]', '[email protected]'] | |
msg = MIMEText('Hi, how are you today?') | |
msg['Subject'] = 'Hello' | |
msg['From'] = sender | |
msg['To'] = ', '.join(targets) | |
server = smtplib.SMTP_SSL(smtp_ssl_host, smtp_ssl_port) | |
server.login(username, password) | |
server.sendmail(sender, targets, msg.as_string()) | |
server.quit() |
import os | |
import smtplib | |
from email.mime.text import MIMEText | |
from email.mime.image import MIMEImage | |
from email.mime.multipart import MIMEMultipart | |
smtp_ssl_host = 'smtp.gmail.com' # smtp.mail.yahoo.com | |
smtp_ssl_port = 465 | |
username = 'USERNAME or EMAIL ADDRESS' | |
password = 'PASSWORD' | |
sender = '[email protected]' | |
targets = ['[email protected]', '[email protected]'] | |
msg = MIMEMultipart() | |
msg['Subject'] = 'I have a picture' | |
msg['From'] = sender | |
msg['To'] = ', '.join(targets) | |
txt = MIMEText('I just bought a new camera.') | |
msg.attach(txt) | |
filepath = '/path/to/image/file' | |
with open(filepath, 'rb') as f: | |
img = MIMEImage(f.read()) | |
img.add_header('Content-Disposition', | |
'attachment', | |
filename=os.path.basename(filepath)) | |
msg.attach(img) | |
server = smtplib.SMTP_SSL(smtp_ssl_host, smtp_ssl_port) | |
server.login(username, password) | |
server.sendmail(sender, targets, msg.as_string()) | |
server.quit() |
import time | |
from itertools import chain | |
import email | |
import imaplib | |
imap_ssl_host = 'imap.gmail.com' # imap.mail.yahoo.com | |
imap_ssl_port = 993 | |
username = 'USERNAME or EMAIL ADDRESS' | |
password = 'PASSWORD' | |
# Restrict mail search. Be very specific. | |
# Machine should be very selective to receive messages. | |
criteria = { | |
'FROM': 'PRIVILEGED EMAIL ADDRESS', | |
'SUBJECT': 'SPECIAL SUBJECT LINE', | |
'BODY': 'SECRET SIGNATURE', | |
} | |
uid_max = 0 | |
def search_string(uid_max, criteria): | |
c = list(map(lambda t: (t[0], '"'+str(t[1])+'"'), criteria.items())) + [('UID', '%d:*' % (uid_max+1))] | |
return '(%s)' % ' '.join(chain(*c)) | |
# Produce search string in IMAP format: | |
# e.g. (FROM "[email protected]" SUBJECT "abcde" BODY "123456789" UID 9999:*) | |
def get_first_text_block(msg): | |
type = msg.get_content_maintype() | |
if type == 'multipart': | |
for part in msg.get_payload(): | |
if part.get_content_maintype() == 'text': | |
return part.get_payload() | |
elif type == 'text': | |
return msg.get_payload() | |
server = imaplib.IMAP4_SSL(imap_ssl_host, imap_ssl_port) | |
server.login(username, password) | |
server.select('INBOX') | |
result, data = server.uid('search', None, search_string(uid_max, criteria)) | |
uids = [int(s) for s in data[0].split()] | |
if uids: | |
uid_max = max(uids) | |
# Initialize `uid_max`. Any UID less than or equal to `uid_max` will be ignored subsequently. | |
server.logout() | |
# Keep checking messages ... | |
# I don't like using IDLE because Yahoo does not support it. | |
while 1: | |
# Have to login/logout each time because that's the only way to get fresh results. | |
server = imaplib.IMAP4_SSL(imap_ssl_host, imap_ssl_port) | |
server.login(username, password) | |
server.select('INBOX') | |
result, data = server.uid('search', None, search_string(uid_max, criteria)) | |
uids = [int(s) for s in data[0].split()] | |
for uid in uids: | |
# Have to check again because Gmail sometimes does not obey UID criterion. | |
if uid > uid_max: | |
result, data = server.uid('fetch', uid, '(RFC822)') # fetch entire message | |
msg = email.message_from_string(data[0][1]) | |
uid_max = uid | |
text = get_first_text_block(msg) | |
print 'New message :::::::::::::::::::::' | |
print text | |
server.logout() | |
time.sleep(1) |