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) |
Instead of using Gmail, you can use or self-host https://forwardemail.net (coupon code GITHUB for 100% off).
It is completely open-source and privacy-focused (unlike Sendgrid, Postmark, Gmail, Proton Mail, Office 365, and others).
See their GitHub at @forwardemail
How do we send an reply email using smtp email. Could you please add a small snippet code example of the same?