swaks:瑞士军刀 SMTP,通用 SMTP 传输测试器!全参数详解!Kali Linux教程!黑客入门教程!

简介

swaks(瑞士军刀 SMTP)是一个用 Perl 编写的命令行工具 用于测试 SMTP 设置;它支持 STARTTLS 和 SMTP AUTH(PLAIN、 登录、CRAM-MD5、SPA 和 DIGEST-MD5)。 swaks 允许人们停止 任何阶段的 SMTP 对话框,例如检查 RCPT TO:实际上没有 发送邮件。

Swaks 是一个功能强大、灵活、可编写脚本、面向事务的 SMTP 测试工具并由 John Jetmore 维护。根据 GNU GPLv2 它可以免费使用并获得许可。

特点

  • SMTP 扩展,包括 TLS、身份验证、管道、PROXY、PRDR 和 XCLIENT
  • 协议包括 SMTP、ESMTP 和 LMTP
  • 传输包括 UNIX 域套接字、互联网域套接字(IPv4 和 IPv6)以及到生成进程的管道
  • 完全可编写脚本的配置,通过环境变量、配置文件和命令行进行选项规范

下载

安装包

此方法只是下载脚本本身。不包括文档。

bash 复制代码
curl -O https://jetmore.org/john/code/swaks/files/swaks-20240103.0/swaks

添加权限

bash 复制代码
chmod 755 ./swaks

输入以下命令,如果出现这个页面说明安装成功了。

bash 复制代码
./swaks --help

tar 包

此方法下载发布包,其中包括文档。

bash 复制代码
curl -O https://jetmore.org/john/code/swaks/files/swaks-20240103.0.tar.gz

解压压缩包

bash 复制代码
tar -xvzf swaks-20240103.0.tar.gz

进入目录,并修改权限

bash 复制代码
cd swaks-20240103.0/
ls
chmod 755 ./swaks

输入以下命令,如果出现这样的提示就说明安装成功了。

bash 复制代码
./swaks --help

源码安装

通过以下命令进行克隆项目源码,克隆前建议请先挂好代理。

bash 复制代码
git clone https://github.com/jetmore/swaks.git

进入目录并查看

bash 复制代码
cd swaks/
ls

输入以下命令,出现这个界面就说明安装成功了。

bash 复制代码
./swaks --help

APT包管理器

Kali Linux 默认安装好 swaks 工具了。也可以通过以下命令进行安装

bash 复制代码
sudo apt install swaks

使用

1. 在 test-server.example.net 的 25 端口上向 user@example.com 发送标准测试电子邮件

bash 复制代码
swaks --to user@example.com --server test-server.example.net

2. 发送标准测试电子邮件,要求以 user me@example.com 的身份进行 CRAM-MD5 身份验证。电子邮件正文中将添加"X-Test"标头。如果无法从 .netrc 文件中获取身份验证密码,系统将提示输入该密码。

bash 复制代码
swaks --to user@example.com --from me@example.com --auth CRAM-MD5 --auth-user me@example.com --header-X-Test "test email"

3. 在附件中使用 EICAR 测试病毒扫描程序。不显示消息数据部分。

bash 复制代码
swaks -t user@example.com --attach --server test-server.example.com --suppress-data </path/to/eicar.txt

4. 使用 GTUBE 在电子邮件正文中测试垃圾邮件扫描程序,通过 example.com 的 MX 记录进行路由

bash 复制代码
swaks --to user@example.com --body /path/to/gtube/file

5. 使用 LMTP 协议通过 UNIX 域套接字文件向 user@example.com 发送标准测试电子邮件

bash 复制代码
swaks --to user@example.com --socket /var/lda.sock --protocol LMTP

6. 在文本文件中报告测试服务器上无法验证的所有收件人

这个命令要用bash去运行。所以写在后缀为sh的文件。

bash 复制代码
for E in `cat /path/to/email/file`
do
    swaks --to $E --server test-server.example.com --quit-after RCPT --hide-all
    [ $? -ne 0 ] && echo $E
done

术语和惯例

在使用以下术语时保持一致和具体,以减少混淆。

Target

交易的目标是 Swaks 所连接的对象。整个文档都使用此通用术语,因为大多数其他术语不恰当地暗示了正在使用的传输。

Transport

传输是用于连接到目标的底层方法。

Transaction

交易是通过传输打开到目标的连接并使用消息传递协议尝试传递消息。

Protocol

协议是用于与目标通信的应用程序语言。本文档使用 SMTP 来泛指所有三种受支持的协议,除非它声明它指的是特定的"SMTP"协议并排除其他协议。

Message

SMTP 协议用于传输消息,即一组具有发送者和接收者的约定格式的字节。

Envelope

消息的信封包含消息的"真正"发送者和接收者。它也可以称为其组成部分,信封发件人和信封收件人。需要注意的是,邮件信封不必与其"To: (收件人: )"和"From: (发件人:)"标头相匹配。

DATA

SMTP 事务的数据部分是正在传输的实际邮件。它由邮件的标头和正文组成。数据和正文有时同义使用,但在本文档中它们始终是两个不同的东西。

Headers

邮件的标头定义为邮件数据部分中第一个空白行之前的所有行。它们包含将显示给收件人的电子邮件信息,例如"To: (收件人: )"、"From: (发件人: )"、"Subject: (主题:)"等。在本文档中,标头将始终以大写首字母和尾随冒号的形式书写。

Body

邮件的正文是其数据部分中第一个空白行之后的部分。

Option

选项是改变 Swaks 行为的标志。无论如何提供,始终称为选项。例如,"--no-data-fixup"是一个选项。

Argument

当选项除了选项本身之外还接受其他数据时,这些其他数据称为参数。在"--quit-after <stop-point>"中,"<stop-point>"是"--quit-after"选项的参数。

<literal-string>

当在选项定义中使用时,尖括号("<>")内的文本表示用户应提供的值的描述性标签。例如,"--quit-after <stop-point>"表示应将"<stop-point>"替换为有效的停止点值。

\

当在选项定义中使用时,方括号(\[\])内的文本表示该值是可选的,可以省略。例如,"--to \"表示"--to"选项可以在指定或不指定"<recipient>"的情况下使用。

选项处理

为了避免本文档中可能出现的混淆,Swaks 的标志始终称为"选项"。如果选项需要额外的数据,则该额外的数据称为选项的参数。例如,可以在命令行上向 Swaks 提供"--from fred@example.com",其中"--from"是选项,"fred@example.com"是"--from"的参数。

选项和参数是向 Swaks 提供信息的唯一方式。如果 Swaks 在选项处理过程中发现既不是选项也不是选项参数的数据,它将出错并退出。例如,如果在命令行上发现"--no-data-fixup 1",这将导致错误,因为"--no-data-fixup"不带参数,因此 Swaks 不知道如何处理 1。

可以通过三种方式向 Swaks 提供选项。它们可以在配置文件、环境变量和命令行中指定。根据特定选项以及是否为其指定了参数,Swaks 可能会提示用户输入参数。

当 Swaks 评估其选项时,它首先查找配置文件(在默认位置或使用"--config"指定)。然后,它会评估环境变量中的任何选项。最后,它会评估命令行选项。在每一轮处理中,任何先前设置的选项都将被覆盖。此外,任何选项都可以以"no-"为前缀,以使 Swaks 忘记该变量先前已被设置(在较早的轮次中或在同一轮次的较早时间)。此功能是必要的,因为许多选项对已定义但没有参数的情况的处理方式与未定义的不同。

一般而言,如果多次给出相同的选项,则将使用最后一次给出的选项。这适用于方法内(如果给出了"--from user1@example.com --from user2@example.com",则将使用"user2@example.com")和方法间(如果在配置文件中给出了"from user1@example.com",而在命令行中给出了"--from user2@example.com",则将使用"user2@example.com")

每个选项定义都以括号中的选项行为概要结尾。可以使用以下代码

Arg-None、Arg-Optional、Arg-Required

这三个代码是互斥的,描述选项是否接受参数。请注意,这并不一定描述是否需要直接指定参数,而是最终是否需要参数。例如,"--to"被标记为 Arg-Required,但在命令行上指定不带参数的"--to"是合法的。这是因为 Swaks 可以提示输入必需的参数(如果未直接提供)。

From-Prompt

如果未提供任何参数,则标有 From-Prompt 的选项将以交互方式提示用户输入参数。

From-File

在某些情况下,标有 From-File 的选项将把参数作为文件处理。如果初始参数为"-",则最终参数是"STDIN"的内容。多个选项都可以指定"STDIN",但每个选项将使用相同的内容。如果初始参数以"@"为前缀,则该参数将被视为文件的路径。文件将被打开,内容将用作最终参数。如果无法读取文件的内容,Swaks 将退出。要指定以"@"开头的文字值,请使用两个"@"符号。第一个将被剥离。

Sensitive

如果标记为敏感的选项尝试提示用户输入参数,并且设置了"--protect-prompt"选项,Swaks 将尝试屏蔽用户输入,使其不显示在终端上。Swaks 会尝试以多种方式屏蔽输入,但如果没有一种方法工作,程序流程将继续使用未屏蔽的输入。

Deprecated

标记为已弃用的选项已正式弃用,并将在将来的版本中删除。有关弃用的详细信息,请参阅本文档的"弃用"部分。

下面列出了使用每种类型的确切机制和格式。

配置文件

配置文件可用于设置常用或异常详细的选项。默认情况下,Swaks 按顺序查找

SWAKS_HOME/.swaksrc、HOME/.swaksrc 和 $LOGDIR/.swaksrc。如果发现其中一个存在(并且未使用"--config"),则该文件将用作配置文件。

此外,可以使用"--config"指定非默认位置的配置文件。如果设置了此选项但未提供参数,Swaks 将不使用任何配置文件,包括任何默认文件。如果"--config"指向可读文件,则将其用作配置文件,覆盖可能存在的任何默认值。如果它指向不可读文件,则会显示错误,并且 Swaks 将退出。

还可以通过在 Swaks 程序文件末尾添加选项来创建一组"可移植"默认值。在分发时,Swaks 的最后一行应为"END"。在"END"之后添加的任何行都将被视为配置文件的内容。这样,可以将一组用户首选项自动复制到单个文件中的服务器。

如果未明确关闭配置文件,则始终读取"END"配置。每次调用 Swaks 时,只会使用一个其他配置文件,即使指定了多个配置文件也是如此。如果要读取"END"配置和另一个配置,则将首先处理"END"配置。指定不带参数的"--config"选项将关闭"END"配置和任何实际配置文件的处理。

在配置文件中,以井号("#")开头的行将被忽略。所有其他行都被视为 Swaks 的选项,前导破折号或破折号是可选的。选项行第一个空格之后的所有内容都被视为选项的参数,并且不会被 shell 处理。因此,通常不需要引用,并且将直接包含在参数中。

提供不带参数的选项和提供带有空参数的选项之间存在细微差别。如果选项行没有空格,则整行将被视为选项,并且没有参数。如果行以单个空格结尾,它将被视为带有空参数的选项。

因此,"apt"将被视为"--apt",但"apt "将被视为"--apt ''"。

以下是配置文件内容的示例:

bash 复制代码
# 始终使用此发件人,无论是服务器还是登录用户
--from fred@example.com
# 我更喜欢我的测试电子邮件有一个漂亮的发件人标题。注意
# 选项上没有破折号,整个参数周围也没有引号。
h-From: "Fred Example" <fred@example.com>

配置文件专用选项

--config \

此选项提供要使用的特定配置文件的路径。如果未指定任何参数,则不会处理任何自动找到的配置文件(通过 $HOME 等或"END")。如果参数是有效文件,则该文件将用作配置文件(在"END"配置之后)。如果参数不是有效、可读的文件,Swaks 将出错并退出。可以多次指定此选项,但只会使用第一次指定时(在环境变量和命令行搜索顺序中)。(可选参数)

配置环境变量

可以通过环境变量提供选项。变量的形式为 $SWAKS_OPT_name,其中"name"是将在命令行上指定的选项的名称。由于大多数 UNIX-ish shell 中的环境变量名称不允许使用破折号,因此不应使用前导破折号,并且选项名称中的任何破折号都应替换为下划线。以下将创建配置文件示例中显示的相同选项:

bash 复制代码
SWAKS_OPT_from='fred@example.com'
SWAKS_OPT_h_From='"Fred Example" <fred@example.com>'

将变量设置为空值与在命令行上不带参数指定它相同。例如,设置 <SWAKS_OPT_server=""> 将导致 Swaks 在每次调用时提示用户要连接的服务器。

由于设置环境变量所提供的选项没有固有顺序,因此选项在处理之前会进行排序。这不是一个很好的解决方案,但它至少定义了行为,否则行为将无法定义。例如,如果同时设置了 SWAKS_OPT_from 和 SWAKS_OPT_f,则将使用来自 SWAKS_OPT_from 的值,因为它排在 SWAKS_OPT_f 之后。此外,由于环境处理没有固有顺序,使用"no-"前缀取消设置选项是不可靠的。如果关闭的选项排在"no-"之前,它会起作用,但如果排在之后,它会失败。因为"no-"主要用于在配置类型之间操作(例如,从命令行取消设置在配置文件中设置的选项),所以这不太可能成为问题。除了设置命令行选项的等效项外,

$S​​WAKS_HOME 还可以设置为包含要使用的默认 .swaksrc 的目录。

命令行选项

向 Swaks 提供选项的最后方法是通过命令行。选项的行为方式与大多数 UNIX-ish 命令行程序一致。许多选项都有短格式和长格式(例如"-s"和"--server")。按照惯例,短选项用单破折号指定,长选项用双破折号指定。这只是一种惯例,任何前缀都可以与任何类型一起使用。

以下演示了配置文件和环境变量部分中显示的示例:

bash 复制代码
swaks --from fred@example.com --h-From: '"Fred Example" <fred@example.com>'

传输

Swaks 可以通过 UNIX pipes("pipes")、UNIX 域sockets("UNIX sockets")或 Internet 域sockets("网络sockets")连接到目标。通过网络套接字连接是默认行为。

由于所用传输的单一性质,以下部分中的每组选项都是互斥的。指定多个"--server"、"--pipe"或"--socket"将导致错误。在传输类型之间混合其他选项只会导致不相关的选项被忽略。以下是每种传输类型以及特定于该传输类型的选项的简要说明。

NETWORK SOCKETS

此传输尝试通过 TCP/IP(传送 SMTP 的标准方法)传送消息。这是 Swaks 的默认传输。如果没有指定"--server"、"--pipe"或"--socket",则使用此传输,并从接收者的域中确定目标服务器(有关更多详细信息,请参阅下面的"--server")。

此传输需要 IO::Socket 模块,它是标准 Perl 发行版的一部分。如果此模块不可加载,则尝试使用此传输将导致错误和程序终止。

当存在 IO::Socket::INET6 模块时,支持 IPv6。

1. -s, --server \\[:\]

明确告知 Swaks 使用网络套接字并指定要连接的主机名或 IP 地址,如果没有给出参数,则提示。如果没有给出此选项且没有给出其他传输选项,则使用 Net::DNS 模块根据收件人电子邮件地址域的相应 DNS 记录确定目标邮件服务器。如果 Net::DNS 不可用,Swaks 将尝试连接到本地主机进行投递。可以选择在此处设置目标端口。支持的格式包括 SERVER:PORT(支持名称和 IPv4 地址);SERVER:PORT 和 SERVER/PORT(支持名称、IPv4 和 IPv6 地址)。另请参阅"--copy-routing"。(Arg-Required、From-Prompt)

2. -p, --port \

指定要使用目标上的哪个 TCP 端口,如果没有列出参数,则提示。参数可以是服务名称(由 getservbyname(3) 检索)或端口号。除非受到"--protocol"或"--tls-on-connect"选项的影响,否则默认端口为 smtp/25。(Arg-Required,From-Prompt)

3. -li,--local-interface \\[:\]

使用参数作为传出 SMTP 连接的本地接口,如果未提供参数,则提示用户。参数可以是 IP 地址或主机名。默认操作是让操作系统选择本地接口。有关 :<port> 格式的其他注释,请参阅"--server"。(Arg-Required,From-Prompt)

4. -lp,--local-port,--lport \

指定发起事务的传出端口。参数可以是服务名称(由 getservbyname(3) 检索)或端口号。如果未指定此选项,系统将选择一个临时端口。请注意,普通用户无法指定某些端口。(Arg-Required,From-Prompt)

5. --copy-routing <domain>

该参数被解释为电子邮件的域部分,并使用与查找收件人电子邮件地址的目标服务器相同的逻辑来查找目标服务器。有关如何根据电子邮件域确定目标的更多详细信息,请参阅"--to"选项。(Arg-Required)

6. -4,-6

强制 IPv4 或 IPv6。(Arg-None)

UNIX SOCKETS

此传输方法尝试通过 UNIX 域sockets 文件传递消息。这对于测试监听sockets文件的 MTA/MDA(例如,测试 LMTP 传递到 Cyrus)非常有用。此传输需要 IO::Socket 模块,它是标准 Perl 发行版的一部分。如果此模块不可加载,则尝试使用此传输将导致错误和程序终止。

--socket \

此选项将 UNIX 域套接字文件作为其参数。

如果 Swaks 无法打开此套接字,它将显示错误并退出。(Arg-Required、From-Prompt)

PIPES

此传输尝试生成一个进程并通过管道与其通信。生成的程序必须准备好通过"STDIN"/"STDOUT"充当邮件服务器。任何设计为从 inet/xinet 运行的 MTA 都应支持此功能。此外,一些 MTA 提供可通过"STDIN"/"STDOUT"进行通信的测试模式。此传输可用于自动化该测试。例如,如果您使用 Exim 实施了 DNSBL 检查,并且想要确保它正常工作,则可以运行"swaks --pipe "exim -bh 127.0.0.2""。理想情况下,您正在与之交谈的进程应该在"STDIN"和"STDOUT"上表现得与 SMTP 服务器完全一样。任何调试都应发送到"STDERR",它将被定向到您的终端。实际上,Swaks 通常可以处理子进程"STDOUT"上的一些调试,但不能保证它能处理多少。

此传输需要 IPC::Open2 模块,它是标准 Perl 发行版的一部分。如果此模块不可加载,尝试使用此传输将导致错误和程序终止。

--pipe \

为进程提供进程名称和参数。Swaks将尝试生成进程并通过管道与其通信。如果参数不是可执行文件,Swaks 将显示错误并退出。(Arg-Required、From-Prompt)

协议选项

这些选项与协议层相关。

1. -t, --to \\[,\\[,...]]

告诉 Swaks 使用参数作为电子邮件的信封收件人,如果未提供参数,则提示收件人。如果提供了多个收件人,并且需要收件人域来确定路由,则使用最后提供的收件人的域。

此选项没有默认值。如果没有通过任何方式提供收件人,系统将提示用户以交互方式提供一个收件人。唯一的例外是如果提供了"--quit-after"值,这将导致在需要收件人之前终止 SMTP 事务。(Arg-Required,From-Prompt)

2. -f, --from \

使用参数作为电子邮件的信封发件人,如果未指定参数,则提示用户。可以提供字符串"<>"来表示空发件人。如果用户未指定发件人地址,则使用默认值。默认发件人的域部分是对本地主机的完全合格域名的最佳猜测。确定本地部分的方法各不相同。在 Windows 上,使用

"Win32::LoginName()"。在 UNIX-ish 平台上,如果设置了 $LOGNAME 环境变量,则使用它。否则使用 getpwuid(3)。另请参阅"--force-getpwuid"。如果 Swaks 无法确定本地主机名,并且交易需要发件人地址,Swaks 将出错并退出。在这种情况下,必须通过此选项提供有效的字符串。(Arg-Required、From-Prompt)

3. --ehlo、--lhlo、-h、--helo \

用作 HELO/EHLO/LHLO 命令的参数的字符串,或提示用户(如果未指定参数)。如果未使用此选项,则使用对本地主机的完全限定域名的最佳猜测。

如果 Swaks 无法确定本地主机名并且 helo 字符串是交易所需的,则 Swaks 将出错并退出。在这种情况下,必须通过此选项提供有效字符串。(Arg-Required,From-Prompt)

4. -q, --quit, --quit-after <stop-point>

事务应停止的点。当事务中达到请求的停止点时,并且假设 Swaks 在达到该点之前没有出错,Swaks将发送"QUIT"并尝试干净地关闭连接。这些是有效参数及其含义的注释。(Arg-Required)

收到目标的问候横幅后终止会话。

FIRST-HELO, FIRST-EHLO, FIRST-LHLO

在 STARTTLS(但不是 tls-on-connect)会话中,在两个 HELO 中的第一个之后终止事务。在非 STARTTLS 事务中,行为与 HELO 相同(见下文)。

XCLIENT

发送 XCLIENT 后退出。

STARTTLS, TLS

在 TLS 协商后立即退出事务。请注意,根据使用的是 STARTTLS 还是 tls-on-connect,这种情况会发生在不同的地方。无论是否尝试过,这始终会在协商 TLS 的位置之后退出。

HELO、EHLO、LHLO

在 STARTTLS 或 XCLIENT 会话中,在第二个 HELO 之后退出。否则,在第一个也是唯一的 HELO 之后退出。

AUTH

身份验证后退出。无论是否尝试过,这始终会在协商身份验证的位置之后退出。

MAIL, FROM

在发送 MAIL FROM: 之后退出。

RCPT, TO

在发送 RCPT TO: 之后退出。

5. --da, --drop-after <stop-point>

该选项类似于"--quit-after",但不是试图彻底关闭会话,而是直接终止会话。

此选项接受与"--quit-after"相同的停止点,并且另外接受 DATA 和 DOT,详情如下。(Arg-Required)

DATA发送 DATA 后退出。

DOT 发送消息的最后一个"。"后退出。

6. --das, --drop-after-send <stop-point>

此选项类似于"--drop-after",但不是在读取对停止点的响应后断开连接,而是在发送停止点后立即断开连接。它接受与"--drop-after"相同的停止点。(Arg-Required)

7. --timeout \

使用参数作为 SMTP 事务超时,如果没有给出参数,则提示用户。参数可以是纯数字,将被解释为秒,也可以有说明符 s、m 或 h(5s = 5 秒,3m = 180 秒,1h = 3600 秒)。特殊情况下,0 表示不使事务超时。默认值为 30 秒。(Arg-Required、From-Prompt)

8. --protocol <protocol>

指定在交易中使用的协议。有效选项显示在下表中。当前"核心"协议为 SMTP、ESMTP 和 LMTP。通过使用这些协议类型的变体可以简洁地指定默认端口、是否应尝试身份验证以及应尝试的 TLS 连接类型。默认协议是 ESMTP。下表演示了"--protocol"的可用参数以及每个选项作为副作用设置的参数。 (Arg-Required)

SMTP HELO,"-p 25"

SSMTP EHLO->HELO,"-tlsc -p 465"

SSMTPA EHLO->HELO,"-a -tlsc -p 465"

SMTPS HELO,"-tlsc -p 465"

ESMTP EHLO->HELO,"-p 25"

ESMTPA EHLO->HELO,"-a -p 25"

ESMTPS EHLO->HELO,"-tls -p 25"

ESMTPSA EHLO->HELO,"-a -tls -p 25"

LMTP LHLO,"-p 24"

LMTPA LHLO,"-a -p 24"

LMTPS LHLO,"-tls -p 24"

LMTPSA LHLO,"-a -tls -p 24"

9. --pipeline

如果远程服务器支持,则尝试 SMTP PIPELINING (RFC2920)。(Arg-None)

10. --prdr

如果服务器支持,则尝试每个收件人的数据响应(PRDR) (<https://tools.ietf.org/html/draft-hall-prdr-00.txt\>)。PRDR 尚未标准化,但 MTA 已开始实施该提案。(Arg-None)

11. --force-getpwuid

告诉 Swaks 使用 getpwuid 方法查找默认发件人本地部分,而不是先尝试 $LOGNAME。(Arg-None)

TLS / 加密

这些是与加密交易相关的选项。这些选项已经过测试,并确认可与所有三种传输方法配合使用。

Net::SSLeay 模块用于在请求时执行加密。如果此模块不可加载,Swaks 将忽略 TLS 请求或出错,具体取决于请求是否为可选。STARTTLS 被定义为 ESMTP 协议中的扩展,如果将"--protocol"设置为 SMTP 的变体,则将不可用。

由于它未在协议本身中定义,因此如果目标支持,则"--tls-on-connect"可用于任何协议类型。

协商 TLS 连接不需要本地证书。但是,某些服务器使用客户端证书检查来验证客户端是否被允许连接。可以使用"--tls-cert"和"--tls-key"选项指示 Swaks 使用特定的本地证书。

1. -tls

要求连接使用 STARTTLS。如果由于任何原因(未公布、协商失败等)TLS 不可用,则退出。(Arg-None)

2. -tlso, --tls-optional

如果可用,则尝试使用 STARTTLS;如果由于任何原因无法协商 TLS,则继续正常交易。请注意,这是当前实现的半无用选项,因为协商失败后,连接状态未知。在某些情况下,例如版本不匹配,连接应保留为纯文本。在其他情况下,例如验证失败,服务器端可能认为它应该继续使用 TLS,而客户端认为它是纯文本。将来可能会尝试添加更细粒度的状态检测,但现在请注意,如果尝试 TLS 协商并失败,则使用此选项可能会发生奇怪的事情。(Arg-None)

3. -tlsos, --tls-optional-strict

如果可用,则尝试使用 STARTTLS。如果 TLS 协商成功或未公布 STARTTLS,则继续进行交易。如果 STARTTLS 已公布但 TLS 协商失败,则视为错误并中止交易。由于上述注意事项,这是一个比"--tls-optional"更明智的选项。(Arg-None)

4. -tlsc, --tls-on-connect

在连接时立即启动 TLS 连接。按照通用惯例,如果指定此选项,则默认端口将从 25 更改为 465,但仍可使用 --port 选项覆盖。(Arg-None)

5. -tlsp, --tls-protocol <tls-version-specification>

指定协商 TLS 时要使用(或不使用)的协议。在撰写本文时,可用的协议有 sslv2、sslv3、tlsv1、tlsv1_1、tlsv1_2 和 tlsv1_3。这些协议的可用性取决于您的底层 OpenSSL 库,因此并非所有协议都可用。可用协议列表显示在"--dump"的输出中(假设 TLS 完全可用)。

规范字符串是一个逗号分隔的协议列表,可以使用或不使用。例如,"tlsv1,tlsv1_1"只有在客户端和服务器上都提供这两种协议之一时才会成功。相反,"no_sslv2,no_sslv3"将尝试协商除 sslv2 和 sslv3 之外的任何协议。这两种形式的规范不能混合使用。(Arg-Required)

6. --tls-cipher <cipher-string>

此选项的参数将传递给底层 OpenSSL 库,以设置用于连接的可接受密码列表。此字符串的格式对 Swaks 不透明,并在<http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT\> 中定义。一个简短的示例是"--tls-cipher '3DES:+RSA'"。(Arg-Required)

7. --tls-verify

告诉 Swaks 尝试验证服务器的证书。如果设置了此选项并且服务器的证书不可验证(使用系统默认 CA 信息或自定义 CA 信息(请参阅"--tls-ca-path")),则 TLS 协商将不会成功。默认情况下,Swaks 不会尝试证书验证。 (Arg-None)

8. --tls-ca-path <ca-location>

指定用于验证服务器证书的 CA 信息的备用位置。该参数可以指向文件或目录。默认行为是使用底层 OpenSSL 库的默认信息。 (Arg-Required)

9. --tls-cert <cert-file>

提供包含 Swaks 应使用的本地证书的文件路径(如果协商了 TLS)。文件路径参数是必需的。按照当前实施,文件中的证书必须采用 PEM 格式。如果有迫切需要 ASN1,请联系作者。如果设置了此选项,则还需要"--tls-key"。 (Arg-Required)

10. --tls-key <key-file>

提供包含 Swaks 应使用的本地私钥的文件路径(如果协商了 TLS)。文件路径参数是必需的。按照当前实施,文件中的证书必须采用 PEM 格式。如果有迫切需要 ASN1,请联系作者。如果设置了此选项,则还需要"--tls-cert"。(Arg-Required)

11. --tls-get-peer-cert \

获取 TLS 对等证书的副本。如果没有给出参数,它将显示到"STDOUT"。如果给出了参数,则假定它是指定证书应写入位置的文件系统路径。然后可以使用标准工具(例如 openssl 命令)检查保存的证书。如果指定了文件,则其内容将被覆盖。(Arg-Optional)

12. --tls-sni <sni-string>

指定在启动 TLS 连接时要发送的服务器名称指示字段。(Arg-Required)

身份验证

如果收到指示,Swaks 将尝试向目标邮件服务器进行身份验证。本节详细介绍了可用的身份验证类型、要求、选项及其交互,以及身份验证使用中的其他细节。由于身份验证被定义为 ESMTP 协议中的扩展,因此如果将"--protocol"设置为 SMTP 的变体,则身份验证将不可用。

所有身份验证方法都需要 base64 编码。如果 MIME::Base64 Perl 模块可加载,Swaks 将尝试使用它来执行这些编码。如果 MIME::Base64 不可用,Swaks 将使用其自己的板载 base64 例程。这些例程比 MIME::Base64 例程慢,审查较少,尽管它们已经过彻底测试。鼓励使用 MIME::Base64 模块。

如果需要身份验证(请参阅下面的选项以了解何时需要和不需要身份验证),并且不满足可用身份验证类型的要求,Swaks 将显示错误并退出。发生这种情况的两种方式包括强制 Swaks 使用由于缺少要求而无法使用的特定身份验证类型,或允许 Swaks 使用任何身份验证类型,但服务器仅公布 Swaks 无法支持的类型。在前一种情况下,Swaks 在选项处理时出错,因为它事先知道它无法进行身份验证。在后一种情况下,Swaks 将在 SMTP 事务的身份验证阶段出错,因为 Swaks 直到那时才意识到它无法进行身份验证。以下是受支持的身份验证类型,包括任何个人注释和要求。以下选项会影响 Swaks 对身份验证的使用。这些选项都是相互关联的。例如,指定"--auth-user"意味着"--auth"和"--auth-password"。指定"--auth-optional"意味着"--auth-user"和"--auth-password"等。

1. -a, --auth \\[,\\[,...]]

要求 Swaks 进行身份验证。如果未提供任何参数,则将尝试服务器所宣传的任何支持的身份验证类型,直到一种成功或全部失败。如果将一种或多种身份验证类型指定为参数,则将按顺序尝试服务器所支持的每个身份验证类型,直到一种成功或全部失败。此选项要求 Swaks 进行身份验证,因此如果未找到通用的身份验证类型或凭据均未成功,则 Swaks 将显示错误并退出。(Arg-Optional)

下表列出了有效的身份验证类型

LOGIN、PLAIN

这些基本身份验证类型完全受支持和测试,并且没有其他要求

CRAM-MD5

CRAM-MD5 身份验证器需要 Digest::MD5 模块。它经过全面测试,并且被认为可以与实现它的任何服务器一起使用。

DIGEST-MD5

DIGEST-MD5 身份验证器 (RFC2831) 需要Authen::SASL 模块。版本 20100211.0 及更早版本使用

Authen::DigestMD5,它存在一些协议级错误,导致无法与某些服务器配合使用。Authen::SASL 的

DIGEST-MD5 处理更加可靠。

Swaks 中的 DIGEST-MD5 实现相当不成熟。例如,它目前仅支持"auth"qop 类型。如果您有 DIGEST-MD5 经验并希望帮助 Swaks 更好地支持 DIGEST-MD5,请与我联系。

可以使用"--auth-extra" "realm"关键字设置 DIGEST-MD5 协议的"realm"值。如果没有给出域,将使用合理的默认值。

可以使用"--auth-extra"选项设置 DIGEST-MD5 协议的"digest-uri"值。例如,您可以使用选项"--auth-extra dmd5-serv-type=lmtp,dmd5-host=mail.example.com,dmd5-serv-name=example.com"创建"lmtp/mail.example.com/example.com"的 digest-uri-value。"digest-uri-value"字符串及其组件在 RFC2831 中定义。如果未提供这些值,则将使用合理的默认值。

CRAM-SHA1

CRAM-SHA1 身份验证器需要 Digest::SHA 模块。此类型仅针对 Exim 服务器上的非标准实现进行了测试,因此可能存在一些实现缺陷。

NTLM/SPA/MSN

这些身份验证器需要 Authen::NTLM 模块。请注意,CPAN 上有两个模块使用 Authen::NTLM 命名空间。Mark Bush 实现 (Authen/NTLM-1.03.tar.gz) 是 Swaks 所需的版本。此类型已针对 Exim、Communigate 和 Exchange 2007 进行了测试。

除了标准用户名和密码之外,此身份验证类型还可以识别"域"。可以使用"--auth-extra" "domain"关键字设置域。请注意,此身份验证类型从未在不忽略 DOMAIN 的邮件服务器上进行过测试,因此可能实现不正确。

2. -ao, --auth-optional \\[,\\[,...]]

此选项的行为与"--auth"相同,不同之处在于它请求身份验证而不是强制身份验证。如果未找到通用身份验证类型或凭据未成功,Swaks 会继续进行,就像未请求身份验证一样。(Arg-Optional)

3. -aos, --auth-optional-strict \\[,\\[,...]]

此选项是"--auth"和"--auth-optional"之间的折衷。如果未找到通用身份验证类型,Swaks 会继续进行,就像指定了"--auth-optional"一样,并继续进行交易。如果 Swaks 无法支持请求的身份验证类型,服务器不会公布任何常见的身份验证类型,或者如果没有凭据成功,Swaks 的行为就像使用了"--auth"一样并退出并显示错误。(Arg-Optional)

4. -au, --auth-user \

提供用于身份验证的用户名。如果没有提供用户名,则表示 Swaks 应尝试通过 .netrc 查找用户名(需要 Net::Netrc 模块)。如果没有提供用户名,并且无法通过 .netrc 找到,则将提示用户提供用户名。可以提供字符串"<>"来表示空用户名。(Arg-Required、From-Prompt)

5. -ap, --auth-password \

提供用于身份验证的密码。如果没有提供密码,则表明 Swaks 应尝试通过 .netrc 查找密码(需要 Net::Netrc 模块)。如果没有提供密码,并且无法通过 .netrc 找到密码,则将提示用户提供密码。可以提供字符串"<>"来表示空密码。(Arg-Required、From-Prompt、Sensitive)

6. -ae, --auth-extra <key-value-pair>,\\[,...]

某些身份验证类型允许在身份验证过程中包含额外信息。无需为每个身份验证器的每个角落添加新选项,"--auth-extra" 选项允许提供此信息。<key-value-pair> 的格式为 KEYWORD=VALUE。(Arg-Required)

下表列出了当前可识别的关键字以及使用它们的身份验证器

realm, domain

realm 和 domain 关键字是同义词。使用其中任一选项都将设置 NTLM/MSN/SPA 中的"domain"选项和 DIGEST-MD5 中的"realm"选项

dmd5-serv-type

dmd5-serv-type 关键字由 DIGEST-MD5 身份验证器使用,部分用于构建 digest-uri- 值字符串(请参阅 RFC2831)

dmd5-host

dmd5-host 关键字由 DIGEST-MD5 身份验证器使用,部分用于构建 digest-uri- 值字符串(请参阅 RFC2831)

dmd5-serv-name

dmd5-serv-name 关键字由 DIGEST-MD5 身份验证器使用,部分用于构建 digest-uri- 值字符串(请参阅 RFC2831)

7. -am, --auth-map <key-value-pair>,\\[,...]

提供一种将备用名称映射到基本身份验证类型的方法。对于使用常用类型的备用名称的任何站点都很有用。<key-value-pair> 的格式为 AUTH-ALIAS=AUTH-TYPE。

此功能实际上在内部用于将类型 SPA 和MSN 映射到基本类型 NTLM。模拟的命令行参数将是"--auth-map SPA=NTLM,MSN=NTLM"。除 SPA 和MSN 外,上面列出的所有身份验证类型都是有效的映射目标。(Arg-Required)

8. -apt, --auth-plaintext

不要在传输时显示 base64 编码的 AUTH 字符串,而是在屏幕上打印之前将其转换为纯文本。(Arg-None)

9. -ahp, --auth-hide-password \

如果指定了此选项,则任何时候将可读密码打印到终端(特别是 AUTH PLAIN 和 AUTH LOGIN)时,密码将被替换为字符串"PROVIDED_BUT_REMOVED"(或如果提供了 <replacement-string> 的内容)。虚拟字符串可能是也可能不是 base64 编码的,取决于"--auth-plaintext" 选项。

请注意,"--auth-hide-password"与"--protect-prompt"选项类似,但不完全相同。前者保护密码不显示在 SMTP 事务中,无论它们如何输入。后者在用户在终端上输入敏感字符串时保护它们,无论字符串如何使用。(Arg-Optional)

XCLIENT 选项

XCLIENT 是 Postfix 项目引入的 SMTP 扩展。XCLIENT 允许(经过适当授权的)客户端告诉服务器使用客户端的备用信息,例如 IP 地址或主机名。这样可以更轻松地测试邮件服务器配置。有关该协议的完整详细信息,请访问<http://www.postfix.org/XCLIENT_README.html\>。

XCLIENT 动词可以多次传递给每个 SMTP 会话的服务器,并带有不同的属性。例如,HELO 和 PROTO 可以在一次调用中传递,NAME 和 ADDR 可以在第二次调用中传递。由于 Swaks 可能对测试有用,因此它公开了一些控制,可以控制属性的分组方式以及它们传递给服务器的顺序。

不同的选项试图为使用 Swaks 作为客户端的用户提供简单性,并为使用 Swaks 测试安装的用户提供复杂性。

1. --xclient-addr \

2. --xclient-name \

3. --xclient-port \

4. --xclient-proto \

5. --xclient-destaddr \

6. --xclient-destport \

7. --xclient-helo \

8. --xclient-login \

9. --xclient-reverse-name \

这些选项指定应发送到目标服务器的 XCLIENT 属性。如果未提供 <string>,Swaks 将提示并读取"STDIN"上的值。请参阅 <http://www.postfix.org/XCLIENT_README.html\> 以获取官方文档,了解属性的含义及其可能的值,包括特殊的"UNAVAILABLE"和"TEMPUNAVAIL"值。

举个简单的例子,设置"--xclient-name foo.example.com --xclient-addr 192.168.1.1"将导致 Swaks 发送 SMTP 命令"XCLIENT NAME=foo.example.com ADDR=192.168.1.1"。

请注意,"REVERSE_NAME"属性似乎没有出现在官方文档中。有一个邮件列表线程记录了它,可在 <http://comments.gmane.org/gmane.mail.postfix.user/192623\> 中查看。

这些选项都可以相互混合,并且可以与"--xclient"选项混合使用(见下文)。默认情况下,所有属性都将合并到一个 XCLIENT 调用中,但请参阅"--xclient-delim"。(Arg-Required、From-Prompt)

10. --xclient-delim

指定此选项时,表示要发送的 XCLIENT 属性中断。例如,设置"--xclient-helo 'helo string' --xclient-delim --xclient-name foo.example.com --xclient-addr 192.168.1.1"将导致 Swaks 发送两个 XCLIENT 调用,"XCLIENT HELO=helo+20string"和"XCLIENT NAME=foo.example.com ADDR=192.168.1.1"。此选项在没有意义的地方被忽略(在 XCLIENT 选项的开头或结尾、单独出现、连续出现等)。(Arg-None)

11. --xclient \

这是"自由格式"XCLIENT 选项。为 <string> 提供的任何值都将作为 XCLIENT SMTP 命令的参数逐字发送。例如,如果使用"--xclient 'NAME= ADDR=192.168.1.1 FOO=bar'",Swaks 将发送 SMTP 命令"XCLIENT NAME= ADDR=192.168.1.1 FOO=bar"。如果命令行上未传递任何参数,Swaks 将提示并读取 STDIN 上的值。

与上述更具体的选项相比,此方法的主要优势在于这里没有 XCLIENT 语法验证。这允许您将无效的 XCLIENT 发送到目标服务器进行测试。

此外,至少有一个 MTA(Message Systems 的 Momentum,以前称为 ecelerity)实现了 XCLIENT,但没有公布支持的属性。在与此类 MTA 通信时,"--xclient"选项允许您跳过"支持的属性"检查(但另请参阅"--xclient-no-verify")。

"--xclient"选项可以与上面的"--xclient-*"选项自由混合使用。"--xclient"的参数将在其自己的命令组中发送。例如,如果将"--xclient-addr 192.168.0.1 --xclient-port 26 --xclient 'FOO=bar NAME=wind'"提供给 Swaks,则"XCLIENT ADDR=192.168.0.1 PORT=26"和"XCLIENT FOO=bar NAME=wind"都将发送到目标服务器。(Arg-Required、From-Prompt)

12. --xclient-no-verify

不强制要求服务器必须公布 XCLIENT 属性,以便 Swaks 在 XCLIENT 命令中发送它。这是为了支持不公布属性但仍支持它们的服务器。 (Arg-None)

13. --xclient-before-starttls

如果 Swaks 配置为尝试 XCLIENT 和 STARTTLS,它将首先执行 STARTTLS。如果指定此选项,它将首先尝试 XCLIENT。(Arg-None)

14. --xclient-optional

15. --xclient-optional-strict

在正常操作中,设置其中一个"--xclient*"选项将需要成功进行 XCLIENT 事务才能继续(即,需要公布 XCLIENT,需要公布所有用户请求的属性,并且服务器需要接受 Swaks 的 XCLIENT 请求)。这些选项会改变这种行为。"--xclient-optional"指示 Swaks 无条件地继续进行 SMTP 事务的XCLIENT 阶段,无论它是否成功。"--xclient-optional-strict"类似,但更细化。严格版本将继续进行 XCLIENT 未公布,但如果尝试 XCLIENT 但未成功,则会失败。(Arg-None)

代理选项

Swaks 实现了代理协议,定义在 <http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt\> 中。代理允许在 MTA 前面使用应用程序负载平衡器(如 HAProxy),同时仍允许 MTA 访问原始主机信息。Swaks 中的代理支持允许直接测试配置为接收来自代理的请求的 MTA,在测试期间绕过代理本身。

Swaks 不会努力确保使用的代理选项在内部一致。例如,"--proxy-family"(在版本 1 中)应为"TCP4"或"TCP6"之一。虽然它可能对目标服务器没有意义,但 Swaks 不会尝试确保"--proxy-source"和"--proxy-dest"与"--proxy-family"或彼此属于同一协议系列。

"--proxy"选项与除"--proxy-version"之外的所有其他"--proxy-*"选项互斥。

当不使用"--proxy"时,所有"--proxy-family"、"--proxy-source"、"--proxy-source-port"、"--proxy-dest"和"--proxy-dest-port"都是必需的。此外,当"--proxy-version"为 2 时,"--proxy-protocol"和"--proxy-command"是可选的。

1. --proxy-version 1 \| 2

是否使用代理协议的版本 1(人类可读)或版本 2(二进制)。版本 1 是默认值。版本 2 仅通过"地址块"实现,与版本 1 中提供的信息大致相同。

2. --proxy \

如果使用此选项,则其参数在代理交换的"PROXY"部分(或版本 2 的 12 字节协议标头)之后不加改变地传递。此选项允许将不完整或格式错误的代理字符串发送到目标服务器进行测试。不会尝试翻译或修改此字符串,因此如果与"--proxy-version 2"一起使用,则参数应采用适当的二进制格式。此选项与所有其他提供细粒度代理信息的"--proxy-*"选项互斥。 (Arg-Required,From-Prompt)

3. --proxy-family \

对于版本 1,指定地址系列和传输协议。协议定义 TCP4 和 TCP6。

对于版本 2,仅指定地址系列。协议定义 AF_UNSPEC、AF_INET、AF_INET6 和 AF_UNIX。 (Arg-Required,From-Prompt)

4. --proxy-protocol \

对于版本 2,指定传输协议。协议定义 UNSPEC、STREAM 和 DGRAM。默认值为 STREAM。此选项在版本 1 中未使用。 (Arg-Required,From-Prompt)

5. --proxy-command \

对于版本 2,指定传输协议。协议定义 LOCAL 和 PROXY。默认值为 PROXY。此选项在版本 1 中未使用。(Arg-Required,From-Prompt)

6. --proxy-source \

指定代理连接的源地址。(Arg-Required,From-Prompt)

7. --proxy-source-port \

指定代理连接的源端口。(Arg-Required,From-Prompt)

8. --proxy-dest \

指定代理连接的目标地址。(Arg-Required,From-Prompt)

9. --proxy-dest-port \

指定代理连接的目标端口。(Arg-Required,From-Prompt)

数据选项

这些选项与 SMTP 事务的数据部分的内容有关。默认情况下,会发送一条非常简单的消息。如果使用"--attach"或"--attach-body"选项,Swaks 会尝试升级到 MIME 消息。

1. -d, --data \

使用参数作为 DATA 的全部内容。

如果未提供参数,系统将提示用户提供值。

如果提供了参数"-",则数据将从"STDIN"读取,而无需提示。

如果参数以"@"开头,则将被视为文件名。如果您想要传递以"@"开头且不是文件名的参数,请在参数前添加一个"@"。例如,"@file.txt"将强制处理 file.txt。@@data 将使用字符串"@data"。

如果参数不包含任何文字(0x0a)或代表(0x5c、0x6e 或 %NEWLINE%)换行符,则将被视为文件名。如果文件可打开,则文件的内容将用作数据部分。如果文件无法打开,Swaks 将出错并退出。本段中描述的全部行为已弃用,并将在将来的版本中删除。请使用前导"@"明确设置该参数是文件名。

任何其他参数都将用作数据内容。

该值可以位于一行上,其中"\n"(ASCII 0x5c、0x6e)表示应放置换行符的位置。前导点将被引号引起来。结束点不是必需的,但允许使用。此选项的默认值为"Date: %DATE%\nTo:%TO_ADDRESS%\nFrom: %FROM_ADDRESS%\nSubject: test

%DATE%\nMessage-Id: <%MESSAGEID%"\nX-Mailer: swaks v%SWAKS_VERSION%

jetmore.org/john/code/swaks/\n%NEW_HEADERS%\n%BODY%\n>.

在 DATA 部分执行非常基本的标记解析。下表显示了已识别的标记及其替换值。(Arg-Required、From-Prompt、From-File)

%FROM_ADDRESS%

替换为信封发件人。

%TO_ADDRESS%

替换为信封收件人。

%DATE%

替换为当前时间,格式适合包含在 Date: 标头中。请注意,这会尝试使用标准模块 POSIX 进行时区计算。如果此模块不可用,日期字符串将采用 GMT 格式。

%MESSAGEID%

替换为适合在 Message-Id 标头中使用的消息 ID 字符串。此标记的值将在整个过程的生命周期内保持一致。

%SWAKS_VERSION%

替换为当前正在运行的 Swaks 进程的版本。

%NEW_HEADERS%

替换为"--add-header"选项的内容。如果未指定"--add-header",则此标记将被删除。

%BODY%

替换为"--body"选项指定的值。请参阅默认值"--body"。

%NEWLINE%

替换为回车符、换行符 (0x0d, 0x0a)。这与使用"\n"(0x5c, 0x6e) 相同,但不存在反斜杠在换行符上可能引起的转义问题。

2. -dab, --dump-as-body \\[,\\[,...]]

如果使用了"--dump-as-body",并且没有使用其他选项来更改消息的默认正文,则正文将被替换为类似于"--dump"提供的输出的输出。"--dump"的初始程序功能节不会显示,并且"数据"部分不会包括在内。此外,"--dump"始终包含密码。默认情况下,"--dump-as-body"不包含密码,但可以使用"--dump-as-body-shows-password"进行更改。"--dump-as-body"采用与"--dump"相同的参数,但不支持SUPPORT 和 DATA 参数。(Arg-Optional)

3. -dabsp, --dump-as-body-shows-password

使"--dump-as-body"包含纯文本密码。不推荐使用此选项。此选项隐含"--dump-as-body"。(Arg-None)

4. --body \

指定电子邮件正文。默认值为"这是一封测试邮件"。如果未提供"--body"的参数,则提示以交互方式提供参数。如果提供了"-",则正文将从标准输入中读取。以"@"开头的参数将被视为包含要使用的正文数据的文件名(有关更多详细信息,请参阅"--data")。

如果经过上述处理后,参数表示可打开的文件,则该文件的内容将用作正文。这是已弃用的行为,将在未来的版本中删除。而是使用前导"@"明确设置参数是文件名。

如果消息被强制为 MIME 格式(请参阅"--attach"),"--body'body text'"与"--attach-type text/plain --attach-body'body text'"相同。有关创建多部分/替代正文的详细信息,请参阅"--attach-body"。(Arg-Required、From-Prompt、From-File)

5. --attach \

当提供一个或多个"--attach"选项时,消息将更改为多部分/混合 MIME 消息。对于"STDIN"、文件内容等,"--attach"的参数处理方式与"--body"相同。可以多次提供"--attach"以创建多个附件。默认情况下,每个附件都作为应用程序/八位字节流文件附加。有关更改此行为,请参阅"--attach-type"。

如果附件的内容是通过文件名提供的,则MIME 编码将包含该文件名。有关文件命名的更多详细信息,请参阅"--attach-name"。

将"-"("STDIN")多次指定为参数是合法的(一次用于"--body",多次用于"--attach")。在这种情况下,每次指定时都会附加相同的内容。这对于使用多种 MIME 类型附加相同的内容非常有用。(Arg-Required、From-File)

6. --attach-body \

这是"--attach"的变体,专门用于电子邮件的正文部分。它的行为与"--attach"相同,因为它采用相同的参数并强制创建 MIME 消息。

但是,它的不同之处在于,无论在选项处理顺序中遇到参数的位置如何,该参数始终是消息中的第一个 MIME 部分。此外,"--attach-body"选项堆栈允许创建多部分/替代正文。

例如,"--attach-type text/plain --attach-body 'plain text body' --attach-type text/html --attach-body 'html body'"将创建一个多部分/替代消息正文。 (Arg-Required,From-File)

7. --attach-type <mime-type>

默认情况下,使用"--attach"选项附加到邮件的 MIME 内容被编码为 application/octet-stream(除了主体,默认情况下为 text/plain)。"--attach-type"会更改其后的每个"--attach"选项的 MIME 类型。可以多次指定。在处理主体部分和其他部分之间,当前 MIME 类型会重置为 application/octet-stream。(Arg-Required)

8. --attach-name \

此选项设置将包含在为下一个"--attach"选项创建的 MIME 部分中的文件名。如果未为此选项设置参数,则不会为下一个 MIME 部分包含任何文件名信息,即使 Swaks 可以从本地文件名生成它。 (Arg-Required)

9. -ah, --add-header <header>

此选项允许将标头添加到 DATA。如果 DATA 中存在"%NEW_HEADERS%",则将其替换为此选项的参数。如果不存在"%NEW_HEADERS%",则参数将插入 DATA 中前两个连续换行符之间(即,将其插入现有标头的末尾)。

可以多次指定此选项,也可以一次指定多个标头,多个标头之间用文字"\n"字符串分隔。因此,"--add-header 'Foo: bar' --add-header 'Baz: foo'"和"--add-header 'Foo: bar\nBaz: foo'"最终会添加相同的两个标头。 (Arg-Required)

10. --header <header-and-data>, --h-<header> <data>

这些选项允许更改数据中已存在的标头。"--header 'Subject: foo'"和"--h-Subject foo"是等效的。如果标头在数据中尚不存在,则此参数的行为与"--add-header"相同。但是,如果标头已存在,则将其替换为指定的标头。

使用选项中的标头名称否定此选项的版本(例如"--no-header-Subject")将删除所有先前处理的"--header"选项,而不仅仅是用于"Subject"的选项。(Arg-Required)

11. -g

此选项是"--data -"(从"STDIN"读取数据)的直接别名。它完全是"--data"的次要选项。任何"--data"的出现都会导致"-g"被忽略。此选项不能用"no-"前缀否定。此选项已弃用,并将在 Swaks 的未来版本中删除。(Arg-None,已弃用)

12. --no-data-fixup,-ndf

此选项强制 Swaks 不对电子邮件的 DATA 部分进行任何处理。这包括令牌替换、From_ 剥离、尾随点添加、"--body"/附件包含和任何标题添加。此选项仅在与"--data"一起使用时有用,因为内部默认 DATA 部分使用令牌。(Arg-None)

13. --no-strip-from,-nsf

如果存在,请不要从 DATA 部分剥离 From_ 行。 (Arg-None)

输出选项

Swaks 默认向其调用者提供其交易的记录("STDOUT"/"STDERR")。此记录旨在尽可能忠实地表示交易,尽管它确实会通过在行中添加信息前缀并提供 TLS 交易的纯文本版本来修改此输出

"信息前缀"称为交易提示。这些提示最初由标记行组成,这些行是 Swaks 本身的输出,无论是信息还是错误消息,以及指示在交易中实际发送或接收的数据行。下表显示了提示及其含义:

"==="

表示 Swaks 生成的信息行。

"***"

表示 Swaks 内部生成的错误。

" ->"

表示 Swaks 向目标服务器发送的预期行。

" ~>"

表示 Swaks 向目标服务器发送的 TLS 加密预期行。

"**>"

表示 Swaks 向目标服务器发送的意外行。

"*~>"

表示 Swaks 向目标服务器发送的 TLS 加密意外行。

" >"

表示 Swaks 向目标服务器发送的原始文本块(请参阅"--show-raw-text")。在此级别没有"预期"或"意外"的概念。

"<-"

表示目标服务器向 Swaks 发送的预期行。

"<~ "

表示目标服务器向 Swaks 发送的 TLS 加密的预期行。

"<**"

表示目标服务器向 Swaks 发送的意外行。

"<~*"

表示目标服务器向 Swaks 发送的 TLS 加密的意外行。

"< "

表示 Swaks 从目标服务器收到的原始文本块(请参阅"--show-raw-text")。在此级别没有"预期"或"意外"的概念。

以下选项控制向调用者显示什么输出以及如何显示输出。

1. -n, --suppress-data

总结 SMTP 事务的 DATA 部分,而不是打印每一行。当使用 Swaks 发送某些测试电子邮件时,此选项非常有用,几乎是必需的。例如,如果不抑制 DATA,带有附件的电子邮件将很快淹没终端。(Arg-None)

2. -stl, --show-time-lapse i

显示发送/接收对之间的时间间隔。此选项在 Time::HiRes 可用时最有用,在这种情况下,时间间隔将以千分之一秒为单位显示。如果 Time::HiRes 不可用或给出"i"作为参数,则时间间隔将仅以整数秒为单位显示。(Arg-Optional)

3. -nih, --no-info-hints

不显示信息性交易的交易提示。这在需要复制部分信息行时非常有用,例如来自"--tls-get-peer-cert"的证书输出。(Arg-None)

4. -nsh,--no-send-hints

5. -nrh,--no-receive-hints

6. -nth,--no-hints

"--no-send-hints"和"--no-receive-hints"分别抑制发送和接收行中的交易提示。这通常在复制交易的某些部分以供其他地方使用时很有用(例如,"--no-send-hints --hide-receive --hide-informational"是一种仅获取给定交易的客户端命令的有用方法)。"--no-hints"与同时指定"--no-send-hints"和"--no-receive-hints"相同。 (Arg-None)

7. -raw, --show-raw-text

此选项将打印 Swaks 发送和接收的原始数据的十六进制转储。每个十六进制转储都是网络上单个读取或写入的内容。这应该与已经显示的内容相同(除了删除了"\r"字符)。当服务器在单个数据包中发送大量数据或将单个行拆分为多个数据包时,此选项可用于查看详细信息。如果您真的需要深入研究该领域,使用数据包嗅探器可能更好,但此选项是查看奇怪连接问题的良好第一步。(Arg-None)

8. --output, --output-file <file-path>

9. --output-file-stdout <file-path>

10. --output-file-stderr <file-path>

这些选项允许用户将输出发送到文件而不是"STDOUT"/"STDERR"。第一个选项将两者发送到同一个文件。&STDOUT 和 &STDERR 的参数被特殊处理,引用"正常"文件句柄,因此"--output-file-stderr'&STDOUT'"会将"STDERR"重定向到"STDOUT"。除了"--help"和"--version"之外,这些选项适用于所有输出。(Arg-Required)

11. -pp, --protect-prompt

不要在可能敏感的提示上回显用户输入(目前只有身份验证密码)。非常具体地说,任何标记为"敏感"并最终提示参数的选项都会尽力屏蔽该参数以免被回显。另请参阅"--auth-hide-password"。(Arg-None)

12. -hr, --hide-receive

不显示 Swaks 接收的从远程服务器发送的行。(Arg-None)

13. -hs, --hide-send

不显示 Swaks 发送到远程服务器的行。(Arg-None)

14. -hi, --hide-informational

不显示来自 Swaks 本身的非错误信息行。(Arg-None)

15. -ha, --hide-all

不向终端显示任何内容。(Arg-None)

16. -S, --silent 1 \| 2 \| 3

使 Swaks 保持静默。如果没有给出参数或给出了参数"1",则不打印任何输出,除非/直到发生错误,之后显示所有输出。如果给出了参数"2",则只打印错误。如果指定了"3",则永远不显示任何输出。

"--silent"会影响大多数输出​​,但不是全部。例如,"--help"、"--version"、"--dump"和"--dump-mail"不受影响。(Arg-Optional)

17. --support

打印功能并退出。某些功能需要非标准 Perl 模块。此选项评估这些模块是否存在,并显示哪些功能可用,哪些功能不可用,以及需要添加哪些模块才能获得缺少的功能。(Arg-None)

18. --dump-mail

使 Swaks 处理所有选项以生成要发送的消息,然后将该消息打印到"STDOUT"而不是发送它。

此输出与"--dump"的"数据"部分相同,只是没有尾随点。(Arg-None)

19. --dump \\[,\\[,...]]

此选项使 Swaks 在邮件发送之前立即打印选项处理的结果。使用"--dump"时不会发送任何邮件。请注意,"--dump"是一个纯粹的自我诊断工具,不会也永远不会在"--dump"输出中掩盖密码。如果将某个部分作为参数提供给此选项,则只会显示请求的部分。当前支持的参数包括 SUPPORT、APP、OUTPUT、TRANSPORT、PROTOCOL、XCLIENT、PROXY、TLS、AUTH、DATA 和 ALL。如果未提供任何参数,则显示所有部分(Arg-Optional)

20. --help

显示此帮助信息并退出。(Arg-None)

21. --version

显示版本信息并退出。(Arg-None)

弃用

以下功能已弃用,并将在 Swaks 的未来版本中删除

1. -g option

最迟将在 2021 年 11 月 1 日之前删除。

-g 选项目前是"--data -"的不太好的别名。任何"-g"的使用都应该能够直接迁移到"--data -"。

2. auto-filename detection

最迟将在 2021 年 11 月 1 日之前删除。

"--data"、"--body"、"--attach"和"--attach-body"选项

目前将尝试区分实际要使用的参数和表示包含要使用的数据的文件的参数。此行为已被取代,方法是在这些选项的参数前加上"@",以明确

表明该参数表示文件。任何向这些选项之一提供文件名的用途都应改为使用"@"来表示正在使用文件名。

总结

Swaks是一款功能强大的SMTP测试工具,支持各种邮件协议操作。通过灵活的命令选项,它能帮助测试邮件服务器的功能和安全性,是邮件管理和渗透测试中的得力助手。

在此特别强调,本教程仅在合法授权的情况下进行测试和研究,请勿用于其他用途。未经授权使用此类工具可能会侵犯他人隐私,触犯相关法律,任何因此引发的法律或利益纠纷与本人无关。

欢迎各位大佬,小白来找我交流。

相关推荐
泛联新安33 分钟前
软件定义汽车时代,如何让AI研发“可信”?——泛联新安构建汽车企业级可信AI体系的落地路径
大数据·人工智能·安全·网络安全·汽车·漏洞挖掘·代码安全
杨云龙UP38 分钟前
TDengine 3.4.2.8 Community 三节点三副本生产集群部署实战(DNode/MNode/taosAdapter/Explorer)
大数据·linux·运维·数据库·tdengine·时序库
向成科技1 小时前
XC3576H工控主板|深度适配Ubuntu 26.04 LTS,释放边缘AI与工业开发新潜能
linux·人工智能·ubuntu·机器人·硬件·主板·边缘ai
Fcy6482 小时前
Linux下 进程间关系与守护进程
linux·运维·服务器·守护进程
码农小韩2 小时前
Linux驱动理论(二)——Linux字符设备驱动
linux·嵌入式软件开发·linux操作系统·linux应用开发·linux驱动理论
well06123 小时前
Linux粘滞位与Makefile机制深度解析
linux·运维·服务器
再写一行代码就下班3 小时前
linux sh脚本在windows修改导致无法使用解决方式
java·linux·centos
额额额对了3 小时前
SPI通信
linux·c语言·汇编·单片机·嵌入式硬件·arm
子木HAPPY阳VIP3 小时前
Ubuntu 关闭防火墙操作步骤
linux·运维·ubuntu
王振超wzc4 小时前
嵌入式开发环境搭建--WM软件安装,Ubuntu操作系统安装
linux·运维·ubuntu