从本地机器发送匿名邮件

17 投票
2 回答
40182 浏览
提问于 2025-04-18 10:07

我在用Python发送邮件,使用的是一个外部的SMTP服务器。在下面的代码中,我尝试用smtp.gmail.com从一个Gmail账号发送邮件到另一个账号。用下面的代码我成功发送了邮件。

import smtplib
from email.MIMEText import MIMEText
import socket


socket.setdefaulttimeout(None)
HOST = "smtp.gmail.com"
PORT = "587"
sender= "somemail@gmail.com"
password = "pass"
receiver= "receiver@somedomain.com"

msg = MIMEText("Hello World")

msg['Subject'] = 'Subject - Hello World'
msg['From'] = sender
msg['To'] = receiver

server = smtplib.SMTP()
server.connect(HOST, PORT)
server.starttls()
server.login(sender,password)
server.sendmail(sender,receiver, msg.as_string())
server.close()

但是我需要在没有外部SMTP服务器的情况下做到这一点。请问我该如何用Python实现呢?
请帮帮我。

2 个回答

1

很可能,你在使用的主机上已经有一个SMTP服务器在运行。如果你输入 ls -l /usr/sbin/sendmail,看看这个位置是否有一个可执行文件(或者指向其他文件的链接)?如果有的话,你就可以用它来发送邮件。试试输入 /usr/sbin/sendmail recipient@recipientdomain.com < /path/to/file.txt,这样可以把 /path/to/file.txt 文件里的内容发送到 recipient@recipientdomain.com(/path/to/file.txt 应该是符合RFC标准的邮件格式)。如果这样能成功,那你就可以在你的Python脚本中使用 /usr/sbin/sendmail 来发送邮件——要么是打开一个连接到 /usr/sbin/sendmail 并把邮件内容写进去,要么就是在Python脚本中通过系统调用直接执行上面的命令。

3

要实现这个功能,最好的办法是了解一下这个假SMTP的代码,它使用了非常棒的smtpd模块

#!/usr/bin/env python
"""A noddy fake smtp server."""

import smtpd
import asyncore

class FakeSMTPServer(smtpd.SMTPServer):
    """A Fake smtp server"""

    def __init__(*args, **kwargs):
        print "Running fake smtp server on port 25"
        smtpd.SMTPServer.__init__(*args, **kwargs)

    def process_message(*args, **kwargs):
        pass

if __name__ == "__main__":
    smtp_server = FakeSMTPServer(('localhost', 25), None)
    try:
        asyncore.loop()
    except KeyboardInterrupt:
        smtp_server.close()

要使用这个代码,把上面的内容保存为fake_stmp.py,然后:

chmod +x fake_smtp.py
sudo ./fake_smtp.py

如果你真的想深入了解更多细节,我建议你去看看那个模块的源代码。

如果这样还不行,可以试试smtplib:

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()

撰写回答