Web page of meissner-wohnen.de
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

194 lines
6.0 KiB

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import cgi
  4. import cgitb
  5. import os
  6. from email.mime.text import MIMEText
  7. from subprocess import call
  8. from datetime import datetime
  9. from fnmatch import fnmatch
  10. from string import Template
  11. def escapeTags(text):
  12. text = text.replace('<', '')
  13. text = text.replace('>', '')
  14. return text
  15. def checkEntries(buchung):
  16. mailstring = '*@*'
  17. datestring = '[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]'
  18. entries = {'name': False, 'sender': False, 'dates': False}
  19. if len(buchung['name']) > 0:
  20. entries['name'] = True
  21. if fnmatch(buchung['sender'], mailstring):
  22. entries['sender'] = True
  23. try:
  24. if (fnmatch(buchung['begin'], datestring) and fnmatch(buchung['end'], datestring) and
  25. datetime.strptime(buchung['begin'], '%d.%m.%Y') >= datetime.now() and
  26. datetime.strptime(buchung['end'], '%d.%m.%Y') > datetime.strptime(buchung['begin'], '%d.%m.%Y')):
  27. entries['dates'] = True
  28. except ValueError:
  29. pass
  30. return entries
  31. class Mail:
  32. def __init__(self, buchung, receiver, reply=False):
  33. self.buchung = buchung
  34. self.buchung['receiver'] = receiver
  35. self.reply = reply
  36. def genMailFile(self):
  37. # write email to file
  38. try:
  39. self.filename = "../data/email_" + datetime.now().strftime('%d-%m-%Y_%H-%M-%S-%f') + ".txt"
  40. fp = open(self.filename, 'wb')
  41. fp.write(self.msg.as_string())
  42. fp.close()
  43. except IOError:
  44. http = HttpResponse(url)
  45. http.sendError()
  46. exit()
  47. def sendMail(self):
  48. # send mail on strato powerweb
  49. call(["mail", self.buchung['receiver']], stdin=open(self.filename))
  50. def genMail(self):
  51. # replace evil html tags
  52. self.buchung['msg'] = escapeTags(self.buchung['msg'])
  53. # gen mail text
  54. if self.reply is True:
  55. self.text = ("Buchungsanfrage:\n\nName: " + self.buchung['name'] +
  56. "\nEmail: " + self.buchung['receiver'] + "\nTelefon: " + self.buchung['tel'] +
  57. "\nAnreise: " + self.buchung['begin'] + "\nAbreise: " + self.buchung['end'] +
  58. "\nPersonen: " + self.buchung['persons'] + "\n\nNachricht:\n" + self.buchung['msg'])
  59. else:
  60. self.text = ("Buchungsanfrage:\n\nName: " + self.buchung['name'] +
  61. "\nEmail: " + self.buchung['sender'] + "\nTelefon: " + self.buchung['tel'] +
  62. "\nAnreise: " + self.buchung['begin'] + "\nAbreise: " + self.buchung['end'] +
  63. "\nPersonen: " + self.buchung['persons'] + "\n\nNachricht:\n" + self.buchung['msg'])
  64. # gen mail
  65. self.msg = MIMEText(self.text, 'plain', 'utf-8')
  66. self.msg['Subject'] = 'Buchungsanfrage von %s' % self.buchung['name']
  67. self.msg['From'] = self.buchung['sender']
  68. self.msg['To'] = self.buchung['receiver']
  69. class HttpResponse:
  70. def __init__(self, url='https://www.meissner-wohnen.de'):
  71. self.url = url
  72. def sendRedirect(self):
  73. # redirect to buchung.html
  74. print 'Status: 301'
  75. print 'Location: https://www.meissner-wohnen.de/%s' % self.url
  76. print ''
  77. def sendError(self):
  78. print "Content-type: text/html\n"
  79. print "<p>Uuups, da ist ein Fehler aufgetreten. Bitte zur <a href='https://www.meissner-wohnen.de'>Startseite</a> zurückkehren</p>"
  80. def main():
  81. #cgitb.enable()
  82. # some values
  83. buchung = {}
  84. blub = ["name", "sender", "tel", "begin", "end", "persons", "msg", "reply"]
  85. template_values = {'name_warning': '', 'email_warning': '', 'date_warning': '', 'name': '', 'email': '', 'tel': '', 'msg': '', 'kopie': ''}
  86. url = 'buchung'
  87. receiver = 'kontakt@meissner-wohnen.de'
  88. # get cgi object
  89. form = cgi.FieldStorage()
  90. # bot detection
  91. if form.getvalue('email'):
  92. # logging
  93. now = datetime.now().strftime('%d.%m.%Y %H:%M:%S')
  94. f = open("../data/meissner_wohnen.log", "ab")
  95. f.write(now + " : " + cgi.escape(os.environ["REMOTE_ADDR"]) + " : bot detected\n")
  96. f.close()
  97. # gen and send http response
  98. http = HttpResponse(url + '.html')
  99. http.sendRedirect()
  100. exit()
  101. # get form values if exist
  102. for index in range(0, 8):
  103. if form.getvalue(str(index)):
  104. buchung[blub[index]] = form.getvalue(str(index))
  105. else:
  106. buchung[blub[index]] = ""
  107. # check for valid entries
  108. test = checkEntries(buchung)
  109. # generate mails if entries are valid
  110. if (test['name'] and test['sender'] and test['dates']):
  111. msg = Mail(buchung, receiver)
  112. msg.genMail()
  113. msg.genMailFile()
  114. msg.sendMail()
  115. if buchung['reply'] == 'true':
  116. receiver, buchung['sender'] = buchung['sender'], 'kontakt@meissner-wohnen.de'
  117. msg = Mail(buchung, receiver, True)
  118. msg.genMail()
  119. msg.genMailFile()
  120. msg.sendMail()
  121. url = url + '_erfolgreich.html'
  122. # generate error site from template if entries are invalid
  123. else:
  124. if not test['name']:
  125. template_values['name_warning'] = 'warning'
  126. if not test['sender']:
  127. template_values['email_warning'] = 'warning'
  128. if not test['dates']:
  129. template_values['date_warning'] = 'warning'
  130. url = url + '_fehler.html'
  131. # read html template
  132. try:
  133. f = open("../data/buchung.template", "rb")
  134. html_template = Template(f.read())
  135. f.close()
  136. except IOError:
  137. http = HttpResponse(url)
  138. http.sendError()
  139. exit()
  140. # write templated html file
  141. try:
  142. f = open('../meissner-wohnen/%s' % url, "wb")
  143. f.write(html_template.safe_substitute(template_values))
  144. f.close()
  145. except IOError:
  146. http = HttpResponse(url)
  147. http.sendError()
  148. exit()
  149. # gen and send http response
  150. http = HttpResponse(url)
  151. http.sendRedirect()
  152. if __name__ == '__main__':
  153. main()