Download: mail2.tar.gz
captcha.css
body { margin: 0; padding: 0; display:inline-block; } body:after{ display:none; content: url(/mail/refresh1.png) url(/mail/refresh2.png); } table { margin: 0; padding: 0; height: 40px; border: 0; } td { margin: 0; padding: 0; height: 40px; border: 0; outline: 0; } img { display:inline-block; vertical-align:top; } input { background:url(/mail/refresh1.png) no-repeat; cursor:pointer; width: 40px; height: 40px; border:0 none !important; } input:hover { background:url(/mail/refresh2.png) no-repeat; } input:focus { border:none !important; outline: 0 !important; } input::-moz-focus-inner {border:0;}
compose.css
body { background-color: none; color: white; font-family: Verdana; font-size: 14px; margin: 0; padding: 0; } h1 { font-family: Tahoma; font-size: 20px; } input { display:inline-block; vertical-align:top; } table { margin: 0; padding: 0; border: 0; } td { padding-top: 0; padding-bottom: 0; display:table-cell; } iframe { margin: 0; padding: 0; border: 0; }
compose.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Compose</title> </head> <body> <!-- === Копируй отсюда === --> <iframe src="/cgi-bin/compose.py" width="500" height="300" frameBorder="1"></iframe> <!-- === и досюда ========= --> </body> </html>
index.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="refresh" content="0;url=/mail/compose.html"> <link rel="canonical" href="/mail/compose.html"/> <title>Home</title> </head> <body> <a href="/mail/compose.html">Home</a> </body> </html>
response.css
body { background-color: darkmagenta ; color: white; font-family: Verdana; font-size: 14px; } h1 { font-family: Tahoma; font-size: 20px; }
response.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <base target="_parent" /> <link rel="stylesheet" type="text/css" href="response.css"> <title>Спасибо</title> </head> <body> <h1>Thank you</h1>Name: aaa<br>Email: a@gmail.com<br>Subject: done<br><br>done </body> </html>
settings.txt
path_blocks = /var/www/html/mail/blocks.txt path_font = /var/www/html/mail/alfphabet.ttf path_mail_dir = /var/www/html/mail/ path_response = /var/www/html/mail/response.html path_template = /var/www/html/mail/template.txt path_tokens = /var/www/html/mail/tokens.txt N_tokens = 50 url_captcha_css = /mail/captcha.css url_compose_css =/mail/compose.css url_mail_dir = /mail/ url_open = /wordpress/index.php/response code_bg_color = (253, 0, 211, 255) code_dots_color = (0, 0, 0, 255) code_dots_n = 3000 code_text_color = (255, 255, 255, 255) email_to = vasqpupkin@mail.ru sender_name = Мой секси сайт smtp_login = moisexisite@gmail.com smtp_password = T&ldkwtE4P smtp_port = 587 smtp_security_type = TLS smtp_server = smtp.gmail.com mail_form_width = 400
template.txt
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <base target="_parent" /> <link rel="stylesheet" type="text/css" href="response.css"> <title>Спасибо</title> </head> <body> [msg] </body> </html>
captcha.py
#!/usr/bin/python #-*-coding:utf-8-*- path_settings='/var/www/html/mail/settings.txt' import cgitb cgitb.enable() import cgi, os, base64, ast import mail_f path_mail_dir, url_mail_dir, path_tokens, url_captcha_css, code_text_color, code_bg_color, code_dots_color, code_dots_n, path_font = '','','','','','','','','' if os.path.exists(path_settings): f=open(path_settings) s=f.read() f.close() L=s.split('\n') for item in L: if '=' in item: l=item.split('=') var=l[0].strip() val=l[1].strip() if var=='path_mail_dir': path_mail_dir = val elif var=='url_mail_dir': url_mail_dir = val elif var=='path_tokens': path_tokens = val elif var=='url_captcha_css': url_captcha_css = val elif var=='code_text_color': code_text_color = ast.literal_eval(val) elif var=='code_bg_color': code_bg_color = ast.literal_eval(val) elif var=='code_dots_color': code_dots_color = ast.literal_eval(val) elif var=='code_dots_n': code_dots_n = int(val) elif var=='path_font': path_font = val else: print 'Content-type: text/html\n\n' print '<!doctype html>' print 'Not found: settings.txt' sys.exit() T = mail_f.Code(path_mail_dir, url_mail_dir, code_text_color, code_bg_color, code_dots_color, code_dots_n, path_font) path_out=T[0] code_txt=T[1] with open(path_out, "rb") as image_file: s = base64.b64encode(image_file.read()) with open(path_tokens, "a") as f: f.write(code_txt+'\n') if os.path.exists(path_out): os.remove(path_out) img='<img src="data:image/png;base64,'+s+'" height="40" width="120" alt="" title="Enter code">' print 'Content-type: text/html\n\n' print '<!doctype html>' print '<html lang="en">' print '<head>' print '<meta charset="utf-8">' print '<link rel="stylesheet" type="text/css" href="'+url_captcha_css+'">' print '<title>Captcha</title>' print '</head>' print '<body>' print '<form action="/cgi-bin/captcha.py" method="post">' print '<table>' print '<tr><td>' print img print '</td><td>' print '<input type="submit" name="" value="">' print '</td></tr></table>' print '</form>' print '</body>' print '</html>'
compose.py
#!/usr/bin/python #-*-coding:utf-8-*- path_settings='/var/www/html/mail/settings.txt' import cgitb cgitb.enable() import cgi, os, sys from PIL import Image from PIL import ImageDraw from PIL import ImageFont import mail_f url_compose_css, mail_form_width = '','' if os.path.exists(path_settings): f=open(path_settings) s=f.read() f.close() L=s.split('\n') for item in L: if '=' in item: l=item.split('=') var=l[0].strip() val=l[1].strip() if var=='url_compose_css': url_compose_css = val elif var=='mail_form_width': mail_form_width = int(val) else: print 'Content-type: text/html\n\n' print '<!doctype html>' print 'Not found: settings.txt' sys.exit() ################################ print 'Content-type: text/html\n\n' print '<!doctype html>' print '<html lang="en">' print '<head>' print '<meta charset="utf-8">' print '<link rel="stylesheet" type="text/css" href="'+url_compose_css+'">' print "<base target='_parent' />" print '<title>Compose</title>' print '</head>' print '<body>' T=mail_f.mail_form_fields() print '<form style="width: '+str(mail_form_width)+'px;" '+T[6]+'>' print 'Name:<br>' print '<input '+T[0]+' style="width: 100%;" type="text"><br><br>' print 'Email:<br>' print '<input '+T[1]+' style="width: 100%;" type="text" pattern="[^@]+@[^@]+\.[^@]+"><br><br>' print 'Subject:<br>' print '<input '+T[2]+' style="width: 100%;" type="text"><br><br>' print 'Message:<br>' print '<textarea '+T[3]+' style="width: 100%; height: '+str(mail_form_width/2.0)+'px;"></textarea><br>' print '<table width="100%">' print '<tr valign="middle">' print '<td align="right">' print 'Enter code: ' print '</td>' print '<td>' print '<input '+T[4]+' maxlength="6" size="7" type="text" pattern="[A-Z]{6}">' print ' </td>' print '<td align="right">' print ' <table>' print ' <tr>' print ' <td>' print ' <iframe '+T[5]+' marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no" height="45" width="160"></iframe>' print ' </td>' print ' </tr>' print ' </table>' print '</td>' print '</tr>' print '<tr>' print '<td></td>' print '<td></td>' print '<td align="right"><input value="Submit" type="submit"></td>' print '</tr>' print '</table>' print '</form>' print '</body>' print '</html>'
mail_f.py
#!/usr/bin/python #-*-coding:utf-8-*- """ Функции для Мэил""" from PIL import Image from PIL import ImageDraw from PIL import ImageFont import random, string def mail_form_fields(): return ('name="name"', 'name="from"', 'name="subject"', 'name="message"', 'name="code"', 'src="/cgi-bin/captcha.py"', 'action="/cgi-bin/send.py" method="post"') def Code(path_mail_dir, url_mail_dir, code_text_color, code_bg_color, code_dots_color, code_dots_n, path_font): """Random Code Generator""" size=6 chars=string.ascii_uppercase code_txt=''.join(random.choice(chars) for _ in range(size)) # Random string ----------------------- img_width=120 img_height=40 img_font_size = 20 img_padding=20 path_out=path_mail_dir+code_txt+'.png' # Code Text ------------------------- img = Image.new("RGBA", (img_width, img_height), code_bg_color) draw = ImageDraw.Draw(img) i=0 while i< code_dots_n: draw.point((random.randrange(5, img_width-5) , random.randrange(5, img_height-5) ), code_dots_color) i=i+1 font = ImageFont.truetype(path_font, img_font_size) w, h = draw.textsize(code_txt, font) img_padding_hor=(img_width-w)/2.0 img_padding_vert=(img_height-h)/2.0 draw.text((img_padding_hor, img_padding_vert), code_txt, fill=code_text_color, font=font) img.save(path_out) return(path_out, code_txt)
send.py
#!/usr/bin/python #-*-coding:utf-8-*- path_settings='/var/www/html/mail/settings.txt' import cgitb cgitb.enable() import cgi import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText import os, time, re, sys sender_name, email_to , smtp_security_type, smtp_server , smtp_port, smtp_login , smtp_password, path_template, path_response, path_blocks, url_compose_css, url_open , path_tokens, N_tokens = '','','','','','','','','','','','','','' form = cgi.FieldStorage() Errors=[] Name, From, Subject, Message, Code = '','','','', '' a, b, c, d = '','','','' http_user_agent, remote_addr, http_referer = '', '', '' if os.path.exists(path_settings): f=open(path_settings) s=f.read() f.close() L=s.split('\n') for item in L: if '=' in item: l=item.split('=') var=l[0].strip() val=l[1].strip() if var=='sender_name': sender_name = val elif var=='email_to': email_to = val elif var=='smtp_security_type': smtp_security_type = val elif var=='smtp_server': smtp_server = val elif var=='smtp_port': smtp_port = int(val) elif var=='smtp_login': smtp_login = val elif var=='smtp_password': smtp_password = val elif var=='path_template': path_template = val elif var=='path_response': path_response = val elif var=='path_blocks': path_blocks = val elif var=='url_compose_css': url_compose_css = val elif var=='url_open': url_open = val elif var=='path_tokens': path_tokens = val elif var=='N_tokens': N_tokens = int(val) else: print 'Content-type: text/html\n\n' print '<!doctype html>' print 'Not found: settings.txt' sys.exit() try: http_user_agent=cgi.escape(os.environ["HTTP_USER_AGENT"]) except: http_user_agent='none' try: remote_addr=cgi.escape(os.environ["REMOTE_ADDR"]) except: remote_addr='none' try: http_referer=cgi.escape(os.environ["HTTP_REFERER"]) except: http_referer='none' try: Name=form['name'].value.strip() Name=re.sub(r'<[^>]*?>', '', Name) a='Name: '+ Name if len(Name)==0: Errors.append('Name: none') except: Errors.append('Name: none') try: From = form['from'].value.strip() From = re.sub(r'<[^>]*?>', '', From) b='Email: '+ From except: Errors.append('Email: none') try: Subject=form['subject'].value.strip() Subject=re.sub(r'<[^>]*?>', '', Subject) c='Subject: '+ Subject except: Errors.append('Subject: none') try: Message = form['message'].value.strip() #Message = re.sub(r'<[^>]*?>', '', Message) d= Message.strip() except: Errors.append('Message: none') try: Code = form['code'].value.strip() except: Errors.append('Error: code mismatch') if len(Errors) == 0: EMAIL_REGEX = re.compile(r"[^@]+@[^@]+\.[^@]+") if not EMAIL_REGEX.match(From): Errors.append('Email is invalid: '+From) if len(Errors) == 0: if os.path.exists(path_tokens)==False: Errors.append('Error: code mismatch') else: f=open(path_tokens, 'r') s=f.read() f.close() L=s.split() if Code not in L: Errors.append('Error: code mismatch') L.reverse() i=0 l=[] OUT=[] for line in L: if i < N_tokens: if len(line)>0: OUT.append(line) i=i+1 OUT.reverse() if len(OUT) >0: f=open(path_tokens, 'w') for line in OUT: f.write(line+'\n') f.close() html='<h1>Thank you</h1>'+a+'<br>'+b+'<br>'+c+'<br>'*2+d.replace('\n', '<br>') if len(Errors) == 0: try: msg = MIMEMultipart() msg['From'] = sender_name+' <'+smtp_login+'>' msg['Reply-To'] = Name+' <'+From+'>' msg['To'] = email_to msg['Subject'] = Subject msg['Date'] = time.strftime("%c") Message= \ Message+'\n\n'\ +'HTTP_USER_AGENT = '+http_user_agent+'\n'\ +'REMOTE_ADDR = '+remote_addr+'\n'\ +'HTTP_REFERER = '+http_referer+'\n\n'\ msg.attach(MIMEText(Message, 'plain')) # Опции для SMTP сервера --------- if smtp_security_type =='TLS': server = smtplib.SMTP(smtp_server, smtp_port) server.starttls() if smtp_security_type =='SSL': server = smtplib.SMTP_SSL(smtp_server, smtp_port) server.ehlo() server.login(smtp_login, smtp_password) text = msg.as_string() # Checking blocks.txt ---------- block='no' if os.path.exists(path_blocks): f=open(path_blocks, 'r') s=f.read() f.close() H=[http_user_agent, remote_addr, http_referer] # Headers L=s.split('\n') for item in L: h='' v='' if '=' in item: l=item.split('=') h=l[0].strip() v=l[1].strip() if v in H: block='yes' break if block=='no': server.sendmail(From, email_to, text) server.close() #---------------------------------- except Exception as e: i=0 for item in e: item=str(item) if i==0: item='Error: '+item item=item.replace('<', '<') item=item.replace('>', '>') Errors.append(item) i=1+1 if len(Errors)>0: html='<h1>Please correct</h1>' for item in Errors: html=html+item+'<br>' html=html+'<br>Email delivery failed.' f=open(path_template, 'r') s=f.read() f.close() s=s.replace('[msg]', html) f=open(path_response, 'w') f.write(s) f.close() print 'Content-type: text/html\n\n' print '<meta http-equiv="refresh" content="0;url='+url_open+'">' print '<link rel="canonical" href="'+url_open+'"/>'
iframe.html
<html> <head> <meta content="text/html; charset=UTF-8" http-equiv="content-type"> <title>Response</title> </head> <body> <!-- === Копируй отсюда === --> <iframe src="/mail/response.html" width="500" height="300" frameBorder="0"></iframe> <!-- === и досюда ========= --> </body> </html>