Advertisement
Guest User

Untitled

a guest
Jun 7th, 2017
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.68 KB | None | 0 0
  1. #!/usr/bin/env python
  2. """Google SMTP Client.
  3.  
  4. Usage:
  5. gsmtpc (-l=<email>|--login=<email>)
  6. gsmtpc (-l=<email>|--login=<email>) [-p=<plain> | --password=<plain>] [-r=<email> | --recipient=<email>] [-s=<text> | --subject=<text>] [-m=<text> | --message=<text>]
  7. gsmtpc (-h | --help)
  8.  
  9. Options:
  10. -h --help Show this screen.
  11. -l --login=<email> User's account used to login in smtp server.
  12. -p --password=<plain> User's account plain password to login in gmail smtp server.
  13. -r --recipient=<email> Recipient e-mail account.
  14. -s --subject=<text> Subject of the message.
  15. -m --message=<text> Message.
  16.  
  17.  
  18. """
  19. from docopt import docopt
  20. from types import *
  21. import base64
  22. import socket
  23. import ssl
  24. import re
  25. import sys
  26.  
  27. DEBUGGING = True
  28.  
  29. from getpass import getpass
  30. import readline
  31.  
  32. def rlinput(prompt, prefill=''):
  33.  
  34. try:
  35. return raw_input(prompt)
  36. finally:
  37. readline.set_startup_hook()
  38.  
  39. # Classe que, por interface em linha de comando oferece toda a autenticação e
  40. # arcabouço facilitado para envio de e-mails pelo gmail.
  41. class GoogleSMTPClient(object):
  42.  
  43. # Cada propriedade, quando chamada, mas não definida é interativamente
  44. # solicitada ao usuário.
  45. @property
  46. def args(self):
  47. return self._args
  48.  
  49. @args.setter
  50. def args(self, value):
  51. self._args = value
  52. self.user = self._args.get("--login")
  53. self.password = self._args.get("--password")
  54. self.recipient = self._args.get("--recipient")
  55. self.subject = self._args.get("--subject")
  56. self.message = self._args.get("--message")
  57.  
  58. @property
  59. def user(self):
  60. try:
  61. if not self._user:
  62. self._user = raw_input("type your username (ex. login@gmail.com): ")
  63. return self._user
  64. else:
  65. return self._user
  66. except AttributeError:
  67. self._user = None
  68. return self.user
  69.  
  70. @user.setter
  71. def user(self, value):
  72. self._user = value
  73.  
  74. @property
  75. def password(self):
  76. try:
  77. if not self._password:
  78. self._password = getpass("Type your password: ")
  79. return self._password
  80. else:
  81. return self._password
  82. except AttributeError:
  83. self._password = None
  84. return self.password
  85.  
  86. @password.setter
  87. def password(self, value):
  88. self._password = value
  89.  
  90. @property
  91. def recipient(self):
  92. try:
  93. if not self._recipient:
  94. self._recipient = raw_input("type the recipient (ex. example@outlook.com): ")
  95. return self._recipient
  96. else:
  97. return self._recipient
  98.  
  99. except AttributeError:
  100. self._recipient = None
  101. return self.recipient
  102.  
  103. @recipient.setter
  104. def recipient(self, value):
  105. self._recipient = value
  106.  
  107. @property
  108. def subject(self):
  109. try:
  110. if not self._subject:
  111. self._subject = raw_input("type the subject of the message: ")
  112. return self._subject
  113. else:
  114. return self._subject
  115.  
  116. except AttributeError:
  117. self._subject = None
  118. return self.subject
  119.  
  120. @subject.setter
  121. def subject(self, value):
  122. self._subject = value
  123.  
  124. @property
  125. def message(self):
  126.  
  127. try:
  128.  
  129. if not self._message:
  130. print("type the message (exit: cntrl + c): ")
  131.  
  132. self._message = ""
  133.  
  134. while True:
  135. try:
  136. input_str = raw_input("> ")
  137. self._message += input_str + "\r\n"
  138. except KeyboardInterrupt:
  139.  
  140. print ("Is message correct?")
  141. print ("\n===text===")
  142. print (self.message)
  143. print ("===text===\n")
  144. while True:
  145. confirm = raw_input("Discard? (y/n):")
  146. if ( (confirm == "Y") | (confirm == "y") ):
  147. self.message = ""
  148. break
  149. elif( (confirm == "N") | (confirm == "n") ):
  150. return self._message
  151. else:
  152. print("Invalid Input")
  153.  
  154. else:
  155. return self._message
  156.  
  157. except AttributeError:
  158. self._message = None
  159. return self.message
  160.  
  161.  
  162. @message.setter
  163. def message(self, value):
  164. self._message = value
  165.  
  166. @property
  167. def authcode(self):
  168. return base64.b64encode("\000" + self.user + "\000" + self.password )
  169.  
  170. def gsmtp_create_context(self):
  171. # Inicia um contexto SSL
  172. self.ssl_context = ssl.create_default_context()
  173. # Cria-se uma conexxão SSL
  174. self.ssl_connection = self.ssl_context.wrap_socket(socket.socket( socket.AF_INET, socket.SOCK_STREAM ), server_hostname="smtp.gmail.com")
  175. pass
  176.  
  177. def gsmtp_send_command(self, command):
  178. if DEBUGGING:
  179. print command
  180. self.ssl_connection.sendall(command + "\r\n")
  181.  
  182. def gsmtp_connect(self):
  183. # Tenta-se Criar um Contexto SMTP com o GOOGLE
  184. self.gsmtp_create_context()
  185.  
  186. # Tenta-se conectar ao servidor SMTP do gmail através da conexão recém
  187. # criada.
  188. self.ssl_connection.connect(("smtp.gmail.com", 465))
  189. self.gsmtp_get_response()
  190.  
  191. # Inicia-se a seção de funcionamento do servidor
  192. self.gsmtp_send_command("HELO .")
  193. self.gsmtp_get_response()
  194.  
  195. # Parser em expressão regular das respostas às requisições SMTP
  196. def gsmtp_get_response(self):
  197. buff = self.ssl_connection.recv(8192)
  198. buff_parsed = re.search("([0-9]{0,1})[0-9]{0,1}[0-9]{0,1}\-{0,1}[0-9]{0,1}\.{0,1}[0-9]{0,1}\.{0,1}[0-9]{0,1} (.*)\r\n(([0-9]{0,1})[0-9]{0,1}[0-9]{0,1} {0,1}[0-9]{0,1}\.{0,1}[0-9]{0,1}\.{0,1}[0-9]{0,1} (.*)\r\n){0,1}", buff)
  199. response = ( buff_parsed.group(1), buff_parsed.group(2) + str(buff_parsed.group(5)) )
  200. if DEBUGGING:
  201. print buff
  202. print response
  203. return response
  204.  
  205. def gsmtp_auth(self):
  206. while True:
  207. # Tenta-se enviar o comando de autenticação ao servidor SMTP
  208. self.gsmtp_send_command("AUTH PLAIN "+ self.authcode)
  209. # Recebe-se a resposta
  210. response = self.gsmtp_get_response()
  211.  
  212. # Se o código da resposta é diferente de 5, encerra-se a
  213. # autenticação com sucesso.
  214. if response[0] != '5':
  215. break
  216. # Se o código da resposta é 5, encerra-se a autenticação com erro
  217. else:
  218. raise Exception("Could not authenticate at GMAIL.")
  219. self.user = None
  220. self.password = None
  221.  
  222. def gsmtp_send_message(self):
  223. # Configuração da Mensagem de E-Mail
  224. self.gsmtp_send_command("MAIL FROM: <"+ self.user +">")
  225. self.gsmtp_get_response()
  226. self.gsmtp_send_command("rcpt to: <"+ self.recipient +">")
  227. self.gsmtp_get_response()
  228. self.gsmtp_send_command("DATA")
  229. self.gsmtp_get_response()
  230. self.gsmtp_send_command("From: "+ self.user +"")
  231. self.gsmtp_send_command("To: "+ self.recipient +"")
  232. self.gsmtp_send_command("Subject: "+ self.subject +"")
  233. self.gsmtp_send_command(""+ self.message +"")
  234. # Sinal de término da Mensagem de E-Mail
  235. self.gsmtp_send_command(".")
  236. self.gsmtp_get_response()
  237.  
  238. def __init__(self):
  239.  
  240. try:
  241.  
  242. # Document Options
  243. self.args = docopt(__doc__, version="Google's SMTP Client v0.2")
  244.  
  245. # Chama o método de inicialização da conexão
  246. self.gsmtp_connect()
  247.  
  248. # Tenta realizar a autenticação. Note que cada parâmetro não
  249. # definido e necessário será definido interativamente quando
  250. # invocado o getter do atributo referente ao parâmetro.
  251. self.gsmtp_auth()
  252.  
  253. # Tenta enviar a mensagem
  254. self.gsmtp_send_message()
  255.  
  256. except KeyboardInterrupt, SystemExit:
  257. # Se há interrupção pelo teclado ou o sistema operacional tenta
  258. # enviar algum sinal de interrupção ao processo, invoca-se a saída
  259. # do script.
  260. sys.exit()
  261.  
  262. except Exception as e:
  263. # Qualquer outra exceção que ocorra, ela será impressa na saída
  264. # e o processo será encerrado com sucesso
  265. print "Error: " + e.message
  266.  
  267. # Inicializa a classe quando solicitado o nome padrão "__name__" é definido como
  268. # '__main__'.
  269. if __name__ == '__main__':
  270. GoogleSMTPClient()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement