从本地机器发送匿名邮件
我在用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()