.. blogpost:: :title: pymmails for teachings :keywords: about :date: 2015-06-06 :categories: teachings Over the past year, I needed this module in two cases. I set up a remote notebook server for my students this year and they needed to retrieve data they produced on this remote machine. IPython 3 solved that issue by exposing links to any new file but IPython could not do that. So, I suggested to send emails with attachments and I implemented a module to make it easier:: from pymmails import create_smtp_server, send_email server = create_smtp_server("gmail", "somebody", "pwd") send_email(server, "somebody@gmail.com", "somebody@else.com", "subject", attachements = [ os.path.abspath(__file__) ]) server.quit() With more than 80 students to follow, it is difficult to download reports, files for every student project I need to evaluate. To avoid that, I just move every email I receive in a separate folder in my inbox and I dump this folder on my laptop:: def grab_mails(mailbox, emails, subfolder, date, no_domain=False): """ look for some emails in a mail box from specific emails or sent to specific emails @param mailbox MailBoxImap object (we assume you are logged in) @param emails list of emails @param date date (grab emails since ..., example ``1-Oct-2014``) @param subfolder folder of the mailbox to look into @param no_domain remove domain when searching for emails @param fLOG logging function @return list of emails """ mid = {} res = [] for m in emails: ms = m.split('@')[0] if no_domain else m ms = ms.strip() iter = mailbox.enumerate_search_person(ms, subfolder, date=date) mails = [] for m in iter: if m["Message-ID"] not in mid: mails.append(m) mid[m["Message-ID"]] = m res.extend(mails) return res imap = pymmails.MailBoxImap("firstname.lastname", "pwd", "imap.gmail.com", True) imap.login() listmails = grab_mails(emails=["student@school.country", mailbox=imap, subfolder="inbox_folder_teachings", date="1-Oct-2014", no_domain=no_domain) mailbox.dump_html(listmails, "local_folder") imap.logout()