使用Python smtplib发送邮件不成功,"发件人"字段困扰我
我正在尝试用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
字段时,我有什么限制吗?
我是否需要以某种方式说明这封邮件是从我的电脑发出的?
有什么机制可以防止我冒充其他人的邮箱吗?
还是说我可以随意这样做?
2 个回答
好吧,因为你没有具体说明你使用的是什么类型的邮件服务器以及它的设置,所以这里可能有几个问题。
首先,你需要指定你服务器的主机(HOST)和端口(PORT),然后连接到它。
例如:
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
发送邮件。这个例子在大多数常见的服务器上都能很好地工作。如果你使用的是你自己的服务器,通常不需要做太多更改。但你需要了解这个服务器的具体要求。
这个代码运行没有错误,但没有邮件发送到wmh1993@gmail.com。
这通常意味着,邮件已经传送到了你的邮件服务器(MTA)上,也就是本地的邮件服务器,但这个服务器无法把邮件转发到gmail。可能它试图给“sender@example.com”发送一条退信,但也失败了。或者邮件成功发送了,但却进了gmail的垃圾邮件文件夹(因为邮件缺少日期头,可能触发了垃圾邮件规则)。
我不太明白这个代码——在设置发件人(FROM)字段时有什么限制吗?
发件人地址必须是一个语法上有效的邮箱地址。
我需要以某种方式说明这封邮件是从我的电脑发出的吗?
不需要。但这可能是邮件未送达的原因。你的电脑是使用家庭网络/动态IP/拨号上网吗?gmail(还有很多其他提供商)不接受来自这种IP的邮件。你的邮件服务器的HELO可能不正确,DNS设置可能也有问题等等。你需要检查服务器日志。你可能需要配置本地邮件服务器,通过智能主机转发邮件,而不是直接联系目标服务器。
有什么措施可以防止我伪造别人的邮件吗?
措施不多,这也是为什么我们会收到这么多伪造地址的垃圾邮件。像SPF/DKIM这样的技术可以稍微帮助一下,但SMTP协议本身并没有提供防止伪造的保护。
那么我可以随意这样做吗?
从技术上讲,是的。