User:Andre Castro/prototyping/1.2/traces
From NetworkedMedia
Contents |
Trance
About the project: Traces is a story written by Giulia Ciliberto, told by email in short parts, one per day
Links
Front-end: http://pzwart3.wdka.hro.nl/~slorusso/traces/
Form handler: /home/acastro/public_html/cgi-bin/traces_form_handler.cgi
Text:
/home/acastro/public_html/cgi-bin/traces-text.txt
Database: /home/acastro/public_html/cgi-bin/traces-database.xml
Part1 Form and email subscription into database
Form handler: /home/acastro/public_html/cgi-bin/traces_form_handler.cgi
- users subscribe their email address in front-end
- html page calls traces_form_handler.cgi
- cgi receives email address appends it within the today's date node in traces-database.xml
#!/usr/bin/python2.6 import cgi, cgitb, lxml.etree, datetime, os from datetime import * date_now = datetime.now() today = date_now.strftime("%Y-%m-%d") date_delta = timedelta(days=22) date_old = (date_now - date_delta).strftime("%Y-%m-%d") print date_old # Create instance of FieldStorage form = cgi.FieldStorage() # Get email from form email = form.getvalue('email') #APPEND EMAIL AND DATE TO XML FILE if os.path.exists('/home/acastro/public_html/cgi-bin/traces-database.xml'): #open file doc = lxml.etree.parse('/home/acastro/public_html/cgi-bin/traces-database.xml') entries = doc.find('entries') # find root element node_today = '//date[@date="'+ str(today) + '"]' old_node = '//date[@date="'+ str(date_old ) + '"]' #remove outdated addresses for outdated in doc.xpath(old_node): outdated.getparent().remove(outdated)# here I grab the parent of the element to call the remove directly on it #check if todays date element is present if today not in doc.xpath('//@date'): date = lxml.etree.SubElement(entries, "date", attrib={'date':today} ) #append date SubElement date addrs = lxml.etree.SubElement(date, "address")#append grandchild addrs.text = str(email) else: test = doc.xpath(node_today) addrs = lxml.etree.SubElement(test[0], "address")#append grandchild addrs.text = email doc.write('/home/acastro/public_html/cgi-bin/traces-database.xml',xml_declaration=True,encoding='utf-8') #write else: #Create a new file root = lxml.etree.Element('email-address') entries = lxml.etree.SubElement(root, 'entries') dates = lxml.etree.SubElement(entries, "date", attrib={'date':today} ) #append date addrs = lxml.etree.SubElement(dates, "address")#append grandchild addrs.text = str(email) tree = lxml.etree.ElementTree(root) tree.write('/home/acastro/public_html/cgi-bin/traces-database.xml', pretty_print=True, xml_declaration=True,encoding='utf-8') tree.close()
part2 and 3 Days calculations and sending emails
/home/acastro/public_html/cgi-bin/traces_date_email.py
Script which parses xml database. Checks the dates and email address under each date. According the date decides what part of story will be send
#! /usr/bin/python # coding: utf-8 import lxml.etree, re import smtplib, email.utils from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from datetime import * # Script that: # 1: parses xml database. # 2: Checks the dates and email address under each date # 3: Sends the corresponding email part #CRON IT FOR 1 x per Day text_file = open('/home/acastro/public_html/cgi-bin/traces-text.txt', "r") text = text_file.read() #CONTENT INTO VARIABLE !!!! text_splited = text.split("\n\n@\n\n") print text_splited[0] print '##' print text_splited[1] print '##' print len(text_splited) f = ('/home/acastro/public_html/cgi-bin/traces-database.xml') database = lxml.etree.parse(f) dates = database.xpath('//date') # database find dates #create the dictionary {date: [address, address]} dateDict = {} for date_subscription in dates: date_is_attr = date_subscription.get("date") myAddrs = database.xpath("//date[@date='{0}']/address/text()".format(date_is_attr)) dateDict[date_is_attr] = myAddrs #print dateDict #creat list of 19 day dates, today and before today dates = [] for day in range(20): date = date.today() delta = timedelta(days= day) subtract = date - delta dates.append(str(subtract)) print dates #checks the dates when emails were subscribe #matchs them with the dates list #sends the corresponding email part for date in dateDict.keys(): print date for i, value in enumerate(dates): if str(date) == value: email_addrs = dateDict[date] # list of receivers print email_addrs email_body = '<html><body><div style="text-align: center; font-family: serif; font-size: 15px;"><br/><br/>@<br/><br/>' + text_splited[i] + '<br/><br/>@<br/><br/></div></body></html>' msg = MIMEMultipart('alternative') #Create Multipart msg (allows html) msg['To'] = email.utils.formataddr(('Recipient', 'readers@traces.net')) msg['From'] = email.utils.formataddr(('Traces', 'traces@noreply.net')) msg['Subject'] = 'Traces @ part#' + str((i+1)) part_html = MIMEText(email_body, 'html') msg.attach(part_html) server = smtplib.SMTP('localhost') server.set_debuglevel(False) # show communication with the server try: server.sendmail('traces@noreply.net', email_addrs, msg.as_string()) finally: server.quit()
Examples on sending email
- multipart email - allows imgs attachments
import smtplib, email.utils from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart #Reference: http://docs.python.org/library/email-examples.html # address list addr = ['andrecastro@c-e-m.org', 'andrecastro83@gmail.com']#, 'silviolorusso@gmail.com'] msg = MIMEMultipart() #msg = MIMEText('This is the b@dy of the message.') #Create the message (simple ASCII) msg['To'] = email.utils.formataddr(('Recipient', 'readers@traces.net')) msg['From'] = email.utils.formataddr(('Traces', 'traces@noreply.net')) msg['Subject'] = 'Traces Multipart - test' msg.attach( MIMEText('This is the b@dy of the email') ) #attach a picture fp = open('animpnky_e0.gif', 'rb') img = MIMEImage(fp.read()) fp.close() msg.attach(img) server = smtplib.SMTP('localhost') server.set_debuglevel(False) # show communication with the server try: server.sendmail('traces@noreply.net', addr, msg.as_string()) finally: server.quit()
- text email - plain text
import smtplib, email.utils from email.mime.text import MIMEText # address list addr = ['andrecastro@c-e-m.org', 'andrecastro83@gmail.com'] #, 'silviolorusso@gmail.com'] msg = MIMEText('This is the b@dy of the message.') #Create the message (simple ASCII) msg['To'] = email.utils.formataddr(('Recipient', 'readers@traces.net')) msg['From'] = email.utils.formataddr(('Traces', 'traces@noreply.net')) msg['Subject'] = 'Traces plain - test ' server = smtplib.SMTP('localhost') server.set_debuglevel(False) # show communication with the server try: server.sendmail('traces@noreply.net', addr, msg.as_string()) finally: server.quit()