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

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

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

答案1

真的没有人费心去写这样的应用程序吗?

现在他们做到了!

作为我另一个建议编写 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您的路径中有可用的命令 - 通常情况下确实如此。

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

用法:直接邮件发送者.py[电子邮件保护] [电子邮件保护]“消息主题” “消息正文”

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

#!/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 [email protected] [email protected] "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()

答案2

您希望有一个普通的邮件用户代理,同时又想知道邮件传输代理的用途。两者都有自己的用处。

有些应用程序通过 SMTP 连接发送邮件,有些则使用mailxsendmail 兼容命令。有些客户端 (MUA) 真正需要的只是一个可以为您中继的 SMTP 服务器,但值得了解 MTA 的存在。

指定一个 MTA 来转发邮件有一些好处。将 smtp.example.com 更改为其他内容比更新每个应用程序配置更容易。当并非每个主机都发送 Internet 邮件并且您可能集中扫描外发邮件时,它可以提供更好的安全态势。当邮件可以排队并自动再次发送时,邮件更有可能被送达。

通常使用流行的 MTA 或第三方服务,因为通用 MTA 很复杂。邮件发送到许多不同的目的地很常见,需要别名和其他功能。简单的发送到目的地是可能的,但中间的基础设施是原因所在。

答案3

我不确定是否有人费心编写这样的应用程序。但绝对是可能的,而且相当容易。我相信一个 python 脚本可以做到这一点。应用程序需要使用 DNS 来查找收件人域的 MX 记录。因此对于[电子邮件保护]需要获取 domain.com 的 MX 记录。然后只需连接到 DNS 结果中指定的具有最高 MX 优先级(数字最低!)的服务器并尝试交付。如果失败,则尝试交付到下一个优先级,依此类推。

为什么不通过编写脚本来自学 Python 来完成这项工作呢!我会从接受单个收件人、主题和单行正文的命令行参数开始,以使其保持简单。然后通过添加多个收件人、抄送、密送、多行正文、附件等功能使其变得更加复杂。

起点:

http://www.dnspython.org/examples.html https://www.tutorialspoint.com/python/python_sending_email.htm

相关内容