|
|
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
-
-
- import cgi
- import cgitb
- import os
- from email.mime.text import MIMEText
- from subprocess import call
- from datetime import datetime
- from fnmatch import fnmatch
- from string import Template
- import json
-
-
- def escapeTags(text):
- text = text.replace('<', '')
- text = text.replace('>', '')
- return text
-
-
- def checkEntries(buchung):
-
- mailstring = '*@*'
- datestring = '[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]'
- entries = {'name': False, 'sender': False, 'dates': False}
-
- if len(buchung['name']) > 0:
- entries['name'] = True
-
- if fnmatch(buchung['sender'], mailstring):
- entries['sender'] = True
-
- try:
- if (fnmatch(buchung['begin'], datestring) and fnmatch(buchung['end'], datestring) and
- datetime.strptime(buchung['begin'], '%d.%m.%Y') >= datetime.now() and
- datetime.strptime(buchung['end'], '%d.%m.%Y') > datetime.strptime(buchung['begin'], '%d.%m.%Y')):
- entries['dates'] = True
- except ValueError:
- pass
-
- return entries
-
-
- class Mail:
-
- def __init__(self, buchung, receiver, reply=False):
- self.buchung = buchung
- self.buchung['receiver'] = receiver
- self.reply = reply
-
- def genMailFile(self):
- # write email to file
- try:
- self.filename = "../data/email_" + datetime.now().strftime('%d-%m-%Y_%H-%M-%S-%f') + ".txt"
- fp = open(self.filename, 'wb')
- fp.write(self.msg)
- fp.close()
- except IOError:
- http = HttpResponse(url)
- http.sendError()
- exit()
-
- def sendMail(self):
- with open(os.devnull, 'wb') as DEVNULL:
- # send mail on strato powerweb
- #call(["mail", self.buchung['receiver']], stdin=open(self.filename))
- # what's with content type: '-a', "Content-Type: text/plain; charset=utf-8"
- self.ret = call(["mail", '-s', "Buchungsanfrage von " + self.buchung['name'], \
- '-r', self.buchung['sender'], self.buchung['receiver']], \
- stdin=open(self.filename), stdout=DEVNULL)
- return self.ret
-
- def genMail(self):
- # replace evil html tags
- self.buchung['msg'] = escapeTags(self.buchung['msg'])
- # gen mail text
- if self.reply is True:
- self.text = ("Buchungsanfrage:\n\nName: " + self.buchung['name'] +
- "\nEmail: " + self.buchung['receiver'] + "\nTelefon: " + self.buchung['tel'] +
- "\nAnreise: " + self.buchung['begin'] + "\nAbreise: " + self.buchung['end'] +
- "\nPersonen: " + self.buchung['persons'] + "\n\nNachricht:\n" + self.buchung['msg'])
- else:
- self.text = ("Buchungsanfrage:\n\nName: " + self.buchung['name'] +
- "\nEmail: " + self.buchung['sender'] + "\nTelefon: " + self.buchung['tel'] +
- "\nAnreise: " + self.buchung['begin'] + "\nAbreise: " + self.buchung['end'] +
- "\nPersonen: " + self.buchung['persons'] + "\n\nNachricht:\n" + self.buchung['msg'])
- # gen mail
- self.msg = self.text
-
- class HttpResponse:
-
- def __init__(self, url='https://www.meissner-wohnen.de'):
- self.url = url
-
- def sendRedirect(self):
- # redirect to given url
- print 'Location: https://www.meissner-wohnen.de/%s' % self.url
- print ''
-
- def sendError(self):
- print "Content-type: text/html\n"
- print "<p>Uuups, da ist ein Fehler aufgetreten. Bitte zur <a href='https://www.meissner-wohnen.de'>Startseite</a> zurückkehren</p>"
- print "<p>Falls Sie eine Buchungsanfrage stellen möchten, bitte per Mail an: <a href='mailto:kontakt@meissner-wohnen.de'>kontakt@meissner-wohnen.de</a></p>"
-
-
- def main():
- #cgitb.enable()
-
- # some values
- buchung = {}
- blub = ["name", "sender", "tel", "begin", "end", "persons", "msg", "reply"]
- template_values = {'name_warning': '', 'email_warning': '', 'date_warning': '', 'name': '', 'email': '', 'tel': '', 'msg': '', 'kopie': ''}
- url = 'buchung'
- receiver = 'kontakt@meissner-wohnen.de'
-
- # get cgi object
- form = cgi.FieldStorage()
-
- # bot detection
- if form.getvalue('email'):
- # logging
- now = datetime.now().strftime('%d.%m.%Y %H:%M:%S')
- f = open("../data/meissner_wohnen.log", "ab")
- f.write(now + " : " + cgi.escape(os.environ["REMOTE_ADDR"]) + " : bot detected\n")
- f.close()
- # gen and send http response
- http = HttpResponse(url + '.html')
- http.sendRedirect()
- exit()
-
- # get form values if exist
- for index in range(0, len(blub)):
- if form.getvalue(str(index)):
- buchung[blub[index]] = form.getvalue(str(index))
- else:
- buchung[blub[index]] = ""
-
- # check for valid entries
- test = checkEntries(buchung)
-
- # generate mails if entries are valid
- if (test['name'] and test['sender'] and test['dates']):
-
- msg = Mail(buchung, receiver)
- msg.genMail()
- msg.genMailFile()
- if msg.sendMail() != 0:
- http = HttpResponse(url)
- http.sendError()
- exit()
-
- if buchung['reply'] == 'true':
- receiver, buchung['sender'] = buchung['sender'], 'kontakt@meissner-wohnen.de'
- msg = Mail(buchung, receiver, True)
- msg.genMail()
- msg.genMailFile()
- if msg.sendMail() != 0:
- http = HttpResponse(url)
- http.sendError()
- exit()
-
- url = url + '_erfolgreich.html'
-
- # generate error site from template if entries are invalid
- else:
-
- if not test['name']:
- template_values['name_warning'] = 'warning'
- if not test['sender']:
- template_values['email_warning'] = 'warning'
- if not test['dates']:
- template_values['date_warning'] = 'warning'
-
- url = url + '_fehler.html'
-
- # read html template
- try:
- f = open("../data/buchung.template", "rb")
- html_template = Template(f.read())
- f.close()
- except IOError:
- http = HttpResponse(url)
- http.sendError()
- exit()
-
- # write templated html file
- try:
- f = open('../meissner-wohnen/%s' % url, "wb")
- f.write(html_template.safe_substitute(template_values))
- f.close()
- except IOError:
- http = HttpResponse(url)
- http.sendError()
- exit()
-
- # gen and send http response
- http = HttpResponse(url)
- http.sendRedirect()
- exit()
-
- if __name__ == '__main__':
- main()
-
|