我正在编写一段代码,定期从 4 个不同的帐户发送电子邮件,其中 2 个是 gmail 帐户,另外 2 个是 yahoo 帐户。当我开始编写代码时,我能够使用以下代码从两个 Gmail 帐户发送所有电子邮件:
def sendGmail(self, fromaddr, toaddr, username, password,
email_body, email_subject
):
# Build the email
msg = MIMEText(email_body)
msg['Subject'] = email_subject
msg['From'] = fromaddr
msg['To'] = toaddr
try:
# The actual mail send
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddr, msg.as_string())
server.quit()
print "email sent: %s" % fromaddr
except Exception as e:
print "Something went wrong when sending the email %s" % fromaddr
print e
正如我所说,这段代码工作得很好,现在我添加了 sendYahoomail(),这是一种不同的方法,我总是得到 (530, '访问被拒绝') 作为使用 sendGmail() 的异常。我很确定这与我的 Yahoo 方法无关,我可以使用 gmail 凭据从浏览器正确登录。
可能出了什么问题,或者只是 Gmail 不希望我通过代码发送?
最佳答案
我用我的 Gmail 帐户(实际上是 Google Apps 帐户,但应该是相同的)尝试了上面的代码,它对我来说效果很好。我什至尝试了错误的“发件人” header ,并在 SMTP 级别使用了错误的源地址 - 两次 Gmail 都允许我发送电子邮件,但似乎悄悄修复了导出 header 。不过,您可能想仔细检查您的发件人地址是否与您的用户名匹配。如果您当前只使用@之前的部分,也可以尝试使用完整的电子邮件地址作为用户名。
我还尝试了错误的密码并收到错误 535,这与您看到的不同。由于我启用了两步身份验证,我还尝试了我的真实密码,而不是特定于应用程序的密码,但仍然给出 535 错误(但带有消息“需要特定于应用程序的密码”)。
您的 ISP 是否可能设置了拦截 Gmail 的 SMTP 连接的功能?似乎不太可能,尽管我的 ISP 曾经阻止在端口 587 上访问 Gmail,但端口 465 仍然有效。也许您可以尝试在端口 465 上使用 smtplib.SMTP_SSL
以防万一,看看这是否会给您带来更多乐趣。
您还可以尝试发送到不同提供商的地址,以防 Gmail 因该原因拒绝发送(例如,如果其他提供商已列入垃圾邮件黑名单)。另外,如果您的电子邮件可能看起来像垃圾邮件,请尝试使用接近真实电子邮件的邮件主题和正文进行编码,看看是否有帮助。
关于python - 在Python中发送电子邮件奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16203071/