· 8 years ago · Mar 14, 2018, 07:58 AM
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4import socket
5import ssl
6import sys
7import base64
8
9
10class ConnectionException(Exception):
11 pass
12
13
14class SMTPSession:
15 def __init__(self, login, passw, server):
16 self.is_connected = False
17 self.is_auth = False
18 self.recv_status = False
19
20 self.sender = login
21 self.password = passw
22 self.mail_server = (server, 465)
23
24 self.client_socket = socket.socket(socket.AF_INET,
25 socket.SOCK_STREAM)
26 self.ssl_socket = ssl.wrap_socket(self.client_socket)
27
28 # Поправить
29 def connect_to_mail_server(self):
30 self.ssl_socket.connect(self.mail_server)
31 recv = self.ssl_socket.recv(1024)
32 if recv[:3] != b'220':
33 raise ConnectionException()
34 else:
35 self.is_connected = True
36
37 # провер ÑоÑтоÑние ÑоелинениÑ,
38 def check_recv(self, recv):
39 if recv[:1] == b'2':
40 return "OK"
41 elif recv[:3] == b'354':
42 return 'OK. Server is ready for data'
43 elif recv[:3] == b'334':
44 return 'OK. Server is ready for auth'
45 # elif recv[:1] == b'4':
46 # return "Fail"
47 else:
48 return "Error"
49
50 def send_command(self, msg):
51 """ ОтправлÑет команды Ñерверу"""
52 try:
53 self.ssl_socket.send(msg)
54 recv = self.ssl_socket.recv(1024)
55 except Exception:
56 return "ERR"
57
58 return self.check_recv(recv)
59
60 def ehlo(self):
61 """ Ðачало диалога Ñ Ñервером"""
62 msg = b'EHLO ' + bytes(socket.gethostname(), 'utf-8') + b'\r\n'
63 return self.send_command(msg)
64
65 def auth_login(self):
66 """ ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° Ñервере"""
67 return self.send_command(b'AUTH LOGIN\r\n')
68
69 # to do
70 def send_login(self):
71 """ ОтправлÑет логин Ñерверу """
72 if self.sender.split("@")[1] == "gmail.com":
73 msg = base64.b64encode(bytes(self.sender, "utf-8")) + b'\r\n'
74 else:
75 msg = base64.b64encode(bytes(self.sender.split("@")[0], "utf-8")) + b'\r\n'
76 return self.send_command(msg)
77
78 def send_pass(self):
79 """ ОтправлÑет пароль Ñерверу """
80 msg = base64.b64encode(bytes(self.password.split("@")[0], "utf-8")) + b'\r\n'
81 return self.send_command(msg)
82 # !!!!!self.is_auth = True
83
84 def mail_from(self):
85 """ Указывает обратный адреÑ"""
86 msg = b'MAIL FROM: <' + bytes(self.sender, 'utf-8') + b'>\r\n'
87 return self.send_command(msg)
88
89 def rcpt_to(self, to):
90 """ Указывает Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¸Ñьма"""
91 msg = b'RCPT TO: <' + bytes(to, 'utf-8') + b'>\r\n'
92 return self.send_command(msg)
93
94 def data(self):
95 """ Спрашивает готовноÑть к приему ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ """
96 return self.send_command(b'DATA\r\n')
97
98 def send_text(self, msg):
99 """ Шлет текÑÑ‚ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ """
100 #self.ssl_socket.send(msg)
101 self.ssl_socket.send(bytes(msg, 'utf-8'))
102 return self.send_command(b'.\r\n')
103
104 def close_socket(self):
105 """ Закрывает Ñокет"""
106 self.is_connected = False
107 return self.ssl_socket.close()
108
109 def quit(self):
110 """ Завершение ÑеÑÑии"""
111 self.close_socket()
112 self.is_connected = False
113 self.is_auth = False
114 return self.send_command(b'quit\r\n')