Advertisement
SquirrelInBox

SMTP_mime

May 16th, 2015
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.70 KB | None | 0 0
  1. import argparse
  2. import datetime
  3. import os
  4. import socket
  5. import base64
  6. import ssl
  7. import sys
  8.  
  9. DEFAULT_SENDER = "seti2seti"
  10. DEFAULT_SUBJECT = "Images"
  11. DEFAULT_PORT = 465
  12. IMAGE_EXPANSION = ['gif', 'pjpeg', 'png', 'jpeg', 'bmp']
  13. SEPARATOR = b"12332145665478987"
  14.  
  15.  
  16. def connect(sock, serv_addr, serv_port):
  17.     try:
  18.         sock.settimeout(2)
  19.         sock.connect((serv_addr, serv_port))
  20.         answer = sock.recv(1024)
  21.         return answer
  22.     except socket.error:
  23.         print("Failed connect to server")
  24.         sys.exit(1)
  25.  
  26.  
  27. def change_data(sock, b_msg):
  28.     send_data(sock, b_msg)
  29.     return get_data(sock)
  30.  
  31.  
  32. def get_data(sock):
  33.     try:
  34.         sock.settimeout(3)
  35.         answer = sock.recv(1024)
  36.         if str(answer)[2] == str(5):
  37.             print(str(answer)[5:-1])
  38.             sys.exit(1)
  39.         return answer
  40.     except socket.error:
  41.         print("Failed get some data")
  42.         sys.exit(1)
  43.  
  44.  
  45. def send_data(sock, b_msg):
  46.     sock.send(b_msg)
  47.  
  48.  
  49. def auth(sock, login, password):
  50.     auther = change_data(sock, b"auth login\r\n")
  51.     print(b"auth login\r\n")
  52.     print(auther)
  53.     login = change_data(sock, base64.b64encode(login) + b'\r\n')
  54.     print(base64.b64encode(login) + b'\r\n')
  55.     print(login)
  56.     pass_ = change_data(sock, base64.b64encode(password) + b'\r\n')
  57.     print(base64.b64encode(password) + b'\r\n')
  58.     print(pass_)
  59.  
  60.  
  61. def header(sock, b_mail_from, b_mail_to):
  62.     hello_data = get_data(sock)
  63.     print(hello_data)
  64.     ehlo_answer = change_data(sock, b"EHLO I\r\n")
  65.     print(b"EHLO I\r\n")
  66.     print(ehlo_answer)
  67.     login = bytes("seti2seti@mail.ru", encoding='windows-1251')
  68.     passwd = bytes("Dnitiufk1995", encoding='windows-1251')
  69.     auth(sock, login, passwd)
  70.     mailfrom_answer = change_data(sock, b"MAIL FROM: <" + b_mail_from + b">\r\n")
  71.     print(b"MAIL FROM: <" + b_mail_from + b">\r\n")
  72.     print(mailfrom_answer)
  73.     rcptto_answer = change_data(sock, b"RCPT TO: <" + b_mail_to + b">\r\n")
  74.     print(b"RCPT TO: <" + b_mail_to + b">\r\n")
  75.     print(rcptto_answer)
  76.     data_answer = change_data(sock, b"DATA\r\n")
  77.     print(b"DATA\r\n")
  78.     print(data_answer)
  79.     # quit_answer = change_data(sock, b"QUIT\r\n")
  80.     # print(quit_answer)
  81.  
  82.  
  83. def create_base64image(name_file):
  84.     with open(name_file, 'rb') as f:
  85.         b_content_file = base64.b64encode(f.read())
  86.         return_str = list(str(b_content_file)[2:-1])
  87.         count = len(return_str) / 70
  88.         for i in range(1, int(count) + 1):
  89.             return_str.insert(i*70, '\n')
  90.         return bytes("".join(return_str), encoding="utf-8")
  91.  
  92.  
  93. def send_image(expansion, file, data_images):
  94.     expansion = bytes(expansion, encoding="utf-8")
  95.     name_file = bytes(file, encoding="utf-8")
  96.     data_images += b"--" + SEPARATOR + b"\r\n" + \
  97.                    b"Content-Type: image/" + expansion + b"\r\n" + \
  98.                    b"Content-Transfer-Encoding: base64\r\n" + \
  99.                    b"Content-Disposition:attachment;filename=" + name_file + b"\n" + \
  100.                    b"Content-Id: attachedImage\r\n\r\n" + \
  101.                    create_base64image(name_file) + b'\r\n\r\n'
  102.     return data_images
  103.  
  104.  
  105. def send_images(directory=None):
  106.     if not directory:
  107.         directory = os.getcwd()
  108.     files = os.listdir(directory)
  109.     for file in files:
  110.         expansion = (file.split('.'))[-1]
  111.         if expansion in IMAGE_EXPANSION:
  112.             data_images += add_image(expansion, file, data_images)
  113.     data_images = b"hello"
  114.  
  115. def body(sock, b_sender, b_receiver, b_subject, b_date, directory=None):
  116.     # data_images = b""
  117.     # path = ""
  118.     # if not directory:
  119.     #     path = os.getcwd()
  120.     # files = os.listdir(path)
  121.     # for file in files:
  122.     #     expansion = (file.split('.'))[-1]
  123.     #     if expansion in IMAGE_EXPANSION:
  124.     #         data_images += add_image(expansion, file, data_images)
  125.     # data_images = b"hello"
  126.     print(b"From: " + b_sender + b"\r\n")
  127.     send_data(sock, b"From: " + b_sender + b"\r\n")
  128.     send_data(sock, b"To: " + b_receiver + b"\r\n")
  129.     send_data(sock, b"Subject: " + b_subject + b"\r\n")
  130.     send_data(sock, b"Date: " + b_date + b"\r\n")
  131.     send_data(sock, b"Content-Type: multipart/mixed; boundary=" + SEPARATOR + b"\r\n")
  132.     send_data(sock, b"\r\n")
  133.  
  134.  
  135.  
  136.     answer = change_data(sock, b".\r\n")
  137.     print(answer)
  138.     # data = b"From: " + b_sender + b"\r\n" +\
  139.     #        b"To: " + b_receiver + b"\r\n" +\
  140.     #        b"Subject: " + b_subject + b"\r\n" +\
  141.     #        b"Date: " + b_date + b"\r\n" +\
  142.     #        b"Content-Type: multipart/mixed; boundary=" + SEPARATOR + b"\r\n\r\n"
  143.     # print(data + data_images + b"--" + SEPARATOR + b"--\r\n\r\n" + b".")
  144.     # body_answer = get_data(sock, data + data_images + b"--" + SEPARATOR + b"--\r\n\r\n" + b".\r\n")
  145.     # print(body_answer)
  146.  
  147.  
  148. def write_letter(serv_addr, serv_port, b_mail_from, b_mail_to, b_sender, b_receiver, b_subject, directory=None):
  149.     date = datetime.datetime.now()
  150.     date = str(date.year) + "-" + str(date.month) + '-' + str(date.day)
  151.     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  152.     # conn_answer = connect(sock, serv_addr, serv_port)
  153.     ssl_sock = ssl.wrap_socket(sock)
  154.     ssl_sock.connect((serv_addr, serv_port))
  155.     header(ssl_sock, b_mail_from, b_mail_to)
  156.     body(ssl_sock, b_sender, b_receiver, b_subject, bytes(date, encoding="utf-8"), directory=None)
  157.  
  158.  
  159. def main(to_mail, addr_serv, name_directory=None):
  160.     from_mail = DEFAULT_SENDER + "@mail.ru"
  161.     sender = '=?utf-8?B?' + str(base64.b64encode(bytes(DEFAULT_SENDER, encoding='windows-1251')))[2:-1] + \
  162.              '?= <' + from_mail + '>'
  163.     subject = '=?utf-8?B?' + str(base64.b64encode(bytes(DEFAULT_SUBJECT, encoding='windows-1251')))[2:-1] + '?='
  164.     receiver = '=?utf-8?B?' + str(base64.b64encode(bytes(to_mail, encoding='windows-1251')))[2:-1] + \
  165.                '?= <' + to_mail + '>'
  166.     write_letter(addr_serv, DEFAULT_PORT,
  167.                  bytes(from_mail, encoding="utf-8"),
  168.                  bytes(to_mail, encoding="utf-8"),
  169.                  bytes(sender, encoding="utf-8"),
  170.                  bytes(receiver, encoding="utf-8"),
  171.                  bytes(subject, encoding="utf-8"),
  172.                  name_directory)
  173.  
  174.  
  175. def get_args():
  176.     parser = argparse.ArgumentParser(description="SMTP-MIME")
  177.     parser.add_argument("email", nargs="?", default="seti2seti@rambler.ru", help="receiver's email")
  178.     parser.add_argument("addr_serv", nargs="?", default="smtp.mail.ru", help="server's address")
  179.     parser.add_argument("user", nargs="?", help="user's name")
  180.     parser.add_argument("pass", nargs="?", help="user's password")
  181.     args = parser.parse_args()
  182.     return args
  183.  
  184.  
  185. if __name__ == "__main__":
  186.     args = get_args()
  187.     main(args.email, args.addr_serv)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement