无需 MTA、GMail 等即可发送邮件

Sha*_*gor 6 email email-server smtp

为什么在没有任何 SMTP 服务器的情况下似乎无法从命令行发送邮件?我发现的所有解决方案要么使用 sendmail、postfix 等(据我所知,这些是 SMTP 服务器),要么通过 GMail 或其他一些提供商(需要身份验证)发送。为什么应用程序不能直接连接到目标邮件服务器?例如,如果我想向 user@test.com 发送邮件,为什么应用程序不能直接连接到 test.com 并直接发送邮件而不涉及任何其他服务器?当然,它会被标记为垃圾邮件,但我不在乎。我是否误解了 SMTP 协议,是否只是没有找到合适的应用程序,或者真的没有人费心编写这样的应用程序?

bao*_*7uo 3

难道真的没有人费心编写这样一个应用程序吗?

现在他们做到了!

作为我建议编写 Python 脚本的其他答案的后续内容,我现在编写了一个非常基本的 python 3 脚本,可以为您执行此操作。我已经在 Linux(2 个不同的发行版)和 Windows 上测试了它,它确实将邮件从两者发送到我的 gmail 帐户,是的,最终确实进入了垃圾邮件文件夹!

nslookup -type=mx <recipient_domain_name> 8.8.8.8它通过使用 nslookup(Google 的公共 DNS 服务器)进行了一点欺骗8.8.8.8,但该脚本仍然可以在 Windows 和 Linux 上运行 - 只是解析结果略有不同。这个“作弊”的原因是为了让你避免安装第三方 python 库,尽管它确实假设你nslookup的路径中有可用的命令 - 通常是这样。

为附件、To: From: 邮件标头中的友好名称等添加额外功能将相当容易。此外,DNS 找到的所有 mx 服务器都按优先级顺序存储在列表中,但该脚本仅尝试发送给第一个。改进脚本相当容易,以便它按优先顺序检查其他脚本,以防无法到达第一个脚本。

用法: direct_mail_sender.pyrecipient@domain.com from@originator.com“消息主题”“消息正文”

将主题和正文括在“双引号”中可确保您可以在单词之间包含空格。

#!/usr/bin/python3
import subprocess, sys, smtplib

mx_records = []
mx_values = {'pref' : 0, 'serv' : ''}

if len(sys.argv) < 5:
    print('\nUsage:\ndirect_mail_sender.py recipient@domain.com from@originator.com "msg subject" "msg body"\n')
    exit()

recipient = sys.argv[1]
domain = recipient.split("@")[1]
originator = sys.argv[2]
subject = sys.argv[3]
body = sys.argv[4]

print("From:   " + originator)
print("To:     " + recipient)
print("Subject " + subject)
print("Body    " + body)

p = subprocess.Popen('nslookup -type=mx ' + domain + ' 8.8.8.8', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    line = line.decode().lower()
    if line.find("mail exchanger") !=-1 :
        for char in line:
            if str(char) in "\r\n\t":
                line = line.replace(char, '')
        if line.find("mx preference") !=-1 :
            mx_parse = line.replace(' ', '').split(",")
            mx_values['pref'] = int(mx_parse[0].split("=")[1])
            mx_values['serv'] = mx_parse[1].split("=")[1]
        else:
            mx_parse = line.split(" = ")[1].split(" ")
            mx_values['pref'] = int(mx_parse[0])
            mx_values['serv'] = mx_parse[1]
        mx_records.append(mx_values.copy())

retval = p.wait()

def mx_pref_sortvalue(record):
    return record['pref']
mx_records=sorted(mx_records, key=mx_pref_sortvalue)

server = mx_records[0]['serv']

print("\nSending mail to: " + recipient + " via first priority MX server: " + server)

smtp_send = smtplib.SMTP(server, 25)
smtp_send.sendmail(originator, recipient, "From: " + originator + "\nTo: " + recipient + "\nSubject:" + subject + "\n\n" + body)
smtp_send.quit()
Run Code Online (Sandbox Code Playgroud)