使用Python的smtplib发送邮件不起作用,对“from”字段感到困惑。

7
我正在尝试在Python中发送电子邮件,以下是我的代码。
import smtplib

if __name__ == '__main__':
SERVER = "localhost"

FROM = "sender@example.com"
TO = ["wmh1993@gmail.com"] # must be a list

SUBJECT = "Hello!"

TEXT = "This message was sent with Python's smtplib."

# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail

server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO[0], message)
server.quit()
print "Message sent!"

这个代码能够正常运行,但是没有发送邮件到 wmh1993@gmail.com

问题

有一件事情我不太明白——设置 FROM 字段时有哪些限制?

我是否需要说明这封邮件是来自我的计算机?

系统有什么措施可以防止我冒充别人的邮箱吗?

还是说我可以随便冒充别人的邮箱?


我原以为可能不应该传入一个列表,但我猜那不是问题。(我尝试了两种方式,没有区别) - WillHaack
它对我有效,打印sendmail函数的结果应该是一个空字典,还要尝试server.set_debuglevel(1)。 - sherpya
3个回答

8
这段代码运行没有错误,但是没有发送邮件到wmh1993@gmail.com。通常这意味着信息被传输到了您在“localhost”上的MTA(邮件服务器),但该服务器无法将其中继到gmail。它可能试图向“sender@example.com”发送退信邮件,但是也失败了。或者成功发送了邮件,但落入了gmail的垃圾邮件文件夹中(该邮件可能会触发垃圾邮件规则,因为缺少日期头)。
我对此代码有一点不理解---设置发件人字段时有什么限制吗?必须是符合语法规则的电子邮件地址。
不需要特别说明是从哪台计算机发送的。但这可能是未能成功发送的原因所在。您的计算机是否使用家庭/动态/拨号IP地址?像gmail(和许多其他提供商)这样的提供商不接受来自这种IP地址的邮件。您的邮件服务器的HELO可能是错误的,DNS设置可能不正确等。需要检查服务器日志。您可能需要配置本地邮件服务器通过智能主机中继邮件,而不是直接尝试联系目标服务器。
有什么措施可以防止我伪造别人的电子邮件地址吗?实际上没有什么,这就是为什么我们会有那么多来自伪造地址的垃圾邮件。类似SPF / DKIM这样的技术可以有所帮助,但SMTP协议本身并不提供防止伪造的保护。
我是否有权这样做?从技术上讲是的。

1

好的,由于您没有明确指定您使用的电子邮件服务器及其设置,这里可能有几个问题。 首先,您需要指定服务器的主机和端口并连接它。 示例:

HOST = "smtp.gmail.com"
PORT = "587"
SERVER = smtplib.SMTP()
SERVER.connect(HOST, PORT)

然后您需要指定一个用户和他的密码到这个主机。 例如:

USER = "myuser@gmail.com"
PASSWD = "123456"

一些服务器需要TLS协议。 示例:
SERVER.starttls()

然后您需要登录。 示例:

SERVER.login(USER,PASSWD)

只有这样,您才能使用sendmail发送电子邮件。 这个例子在大多数常见的服务器上都可以很好地工作。 如果您正在使用自己的服务器,那么您需要应用的更改并不多。但是您需要知道此服务器具有哪些要求。


0

电子邮件头中的“from”字段指定了发件人的电子邮件地址。在使用Python中的smtplib发送电子邮件时,“from”字段可以使用smtplib.SMTP函数中的“from_address”参数进行设置。以下是一个示例:

import smtplib

sender_email = "sender@example.com"
recipient_email = "recipient@example.com"

message = "Subject: Example Email\n\nThis is an example email."

with smtplib.SMTP("smtp.example.com", 587) as smtp:
    smtp.ehlo()
    smtp.starttls()
    smtp.login("sender@example.com", "password")
    smtp.sendmail(sender_email, recipient_email, message)
    

请注意,许多电子邮件服务器可能会拒绝那些“发件人”地址与登录凭据不匹配的电子邮件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接