使用Python脚本发送邮件

9 投票
4 回答
13095 浏览
提问于 2025-04-15 20:37

今天我需要通过一个Python脚本发送邮件。像往常一样,我在谷歌上搜索,找到了一个符合我需求的脚本。

import smtplib

SERVER = "localhost"

FROM = "sender@example.com"
TO = ["user@example.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, message)
server.quit()

但是当我尝试运行这个程序时,出现了以下错误信息:

Traceback (most recent call last):
  File "C:/Python26/email.py", line 1, in <module>
    import smtplib
  File "C:\Python26\lib\smtplib.py", line 46, in <module>
    import email.utils
  File "C:/Python26/email.py", line 24, in <module>
    server = smtplib.SMTP(SERVER)
AttributeError: 'module' object has no attribute 'SMTP'

我该如何解决这个问题呢?有没有人可以帮我?

提前谢谢你们,
Nimmy。


我把文件名改成了emailsendin.py,但我又遇到了以下错误:

Traceback (most recent call last):
  File "C:\Python26\emailsending.py", line 24, in <module>
    server = smtplib.SMTP(SERVER)
  File "C:\Python26\lib\smtplib.py", line 239, in __init__
    (code, msg) = self.connect(host, port)
  File "C:\Python26\lib\smtplib.py", line 295, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "C:\Python26\lib\smtplib.py", line 273, in _get_socket
    return socket.create_connection((port, host), timeout)
  File "C:\Python26\lib\socket.py", line 512, in create_connection
    raise error, msg
error: [Errno 10061] No connection could be made because the target machine actively refused it

4 个回答

3

你把自己的脚本命名为 email.py,这样就覆盖了标准库里的 email 模块。换个名字,确保它不是标准库里的名字,然后再试试。

5

你是不是把你的脚本命名为 email.py 呢?

如果是的话,换个名字就可以了,这样你遇到的命名冲突问题就能解决了。

14

你给自己的模块起了一个和Python内部模块一样的名字。当你导入 smtplib 时,它会尝试导入 email,结果找到了你自己的模块,而不是Python内部的那个模块。当两个模块互相导入时,只有在两个导入语句之前可见的变量才能互相访问。换个名字给你的模块就能解决这个问题。

虽然有点复杂,但你可以在错误追踪信息中看到这一点。来自 smtplib.pyimport email.utils 这一行实际上是在调用你自己的模块,也就是在 "c:/Python26/email.py" 这个位置。

还有一点需要注意:把你的Python安装目录当作Python代码的工作目录并不是个好主意。

撰写回答