【问题标题】:Automate SMTP Using Python使用 Python 自动化 SMTP
【发布时间】:2013-05-06 19:33:17
【问题描述】:

我刚刚开始使用 python 通过 gmail 自动发送电子邮件。我已经完成了整个过程,只需直接在命令行中输入,但现在我想自动化这个过程(即定期发送电子邮件)。我已经完成了第一部分的工作,在那里我与 SMTP 服务器建立了连接。

os.system("openssl s_client -starttls smtp -connect smtp.gmail.com:587 -crlf -ign_eof")

现在我想获取它,以便它在该连接中键入并运行以下命令:

os.write("HELO", os.linesep)
os.write("AUTH LOGIN", os.linesep) ... And so on

我已经尝试过使用 write 命令以及 os.system 命令,但似乎都没有将文本实际插入此窗口。可能具有更多 linux 和终端技能的人可以提供帮助吗?此外,当所有这些系统进程都在运行时,似乎 time.sleep 不起作用。我该如何解决?

【问题讨论】:

  • Python 确实有一个 smtplib 模块来提供一个 SMTP 客户端。如果您的目标是使用 Python,那么直接使用 openssl 是没有意义的。
  • 我已经尝试过 smtplib,但它不适用于与 gmail 的连接。如果您可以提供将建立连接的工作代码,请发布它,我会检查它。但是,我发现 openssl 是我什至设法建立连接的唯一方法。

标签: python unix automation terminal


【解决方案1】:

我会使用标准库中的 SMTP 客户端实现:http://docs.python.org/3/library/smtplib

import smtplib
smtp_client = smtplib.SMTP('smtp.gmail.com', 587)
smtp_client.starttls()
smtp_client.login(username, password)

如果您使用 2 因素身份验证,则需要创建应用程序特定密码才能使用。

【讨论】:

  • 我认为 gmail 与大多数 SMTP 服务器的不同之处在于您不能只遵循常规的登录步骤。我认为它是经过特殊编码的,所以 smtplib 不起作用。该代码对您有用吗?
  • 是的,代码对我有用。如果您进行 2 因素身份验证,则无法使用标准密码,但仅此而已。
  • 您能否发布使用 smtplib 时遇到的任何堆栈跟踪或错误?
  • 当然!这是我正在运行的代码(但已修改为排除编码的密码和电子邮件地址) import smtplib smtp_client = smtplib.SMTP('smtp.gmail.com', 587) smtp_client.starttls() smtp_client.login("encoded email here" , "这里的编码密码") smtp_client.sendmail("email address","to"," message")
  • 报错如下: Traceback (most recent call last): File "smtplibtest.py", line 1, in import smtplib File "/System/Library/Frameworks/Python.framework /Versions/2.7/lib/python2.7/smtplib.py”,第 46 行,在 中 import email.utils 文件“/Users/Connor/Documents/BuildTech/email.py”,第 15 行,在 server = smtplib.SMTP(HOST) AttributeError: 'module' object has no attribute 'SMTP'
【解决方案2】:

您应该查看子流程模块以执行您想要的操作。你不能只是“os.write”,你需要“写”到进程的标准输入和输出。

command = ['openssl', 's_client', '-starttls smtp', '-connect smtp.gmail.com:587', '-crlf', '-ign_eof']
p = subprocess.Popen(command, stdin=PIPE) # Success!
p.write("HELO", "MYNAME")

等等

【讨论】:

  • 出于某种原因,我遇到了 stdin=PIPE 的问题。除了这个,还有更多吗?
  • 尝试 subprocess.PIPE 而不是 PIPE
  • 似乎解决了这个问题。但是 write 函数返回此错误: Traceback (most recent call last): File "TestGmailConnection.py", line 9, in p.write("HELO", "MYNAME") AttributeError: 'Popen' object has no属性“写入”未知选项 -starttls smtp 用法:s_client args
  • 啊对不起,我又犯了一个错误:P 你需要使用 p.communicate("HELO MYNAME") docs.python.org/2/library/subprocess.html 你的命令似乎也有问题。
猜你喜欢
  • 2021-10-31
  • 2017-07-19
  • 2022-01-10
  • 1970-01-01
  • 2018-03-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多