sendmail 命令

用途

为本地或网络传递路由邮件。

语法

sendmail [ -ba | -bd | -bD | -bh | -bH | -bi | -bm | -bp | -bs | -bv | -bt [ -Ac File] [ -C File ] [ -D Log File ] [ -d Value ] ] [ -B Type ] [ -F FullName ] [ -f Name ] [ -G] [ -h Number ] [ -i ] [ -Mx Value] [ -n ] [ -N Dsn ] [  -O Option=Value ] [ -o OptionValue ] ] [ -pProtocol ] [ -q [Time] ] [ -qGname ] [ -qISubstr ] [ -qRSubstr ] [ -qSSubstr ] [ -R Return ] [ -r  addr ] [ -t ] [ -V Envid ] ] [ -v ] [ -X LogFile ] Address
'请注意: 地址参数与'-bd, '-bi, '-bp, '-bt 和 '-q[时间] 标志是可选的。

描述

注意:
  • 从AIX 7.2 技术等级 5 开始,"sendmail命令使用版本为8.18.1 的 "sendmail命令。 sendmail 命令由新的 smmsp 用户和 smmsp 组运行,而不是由根用户运行,以增强安全性。
  • 在 "sendmail v8.7 及更高版本中,名称解析的顺序是域名系统 (DNS)、网络信息服务 (NIS)、网络接口服务 (NIS),然后是本地。 如果要覆盖默认顺序,请在 "/etc/netsvc.conf文件中指定一个顺序,或指定NSORDER环境变量。

sendmail 命令接收格式化文本消息并将它们发送到一个或更多的用户。 在网络上使用时,"sendmail命令会转换报文头信息格式,以符合目的地系统的要求。 sendmail程序通过地址的语法和内容确定目标系统的网络。

sendmail命令向以下用户发送信息:

  • 本地系统的用户。
  • 用户通过 TCP/IP 协议连接到本地系统。
  • 用户使用基本网络实用程序 (BNU) 命令协议连接到本地系统。

sendmail命令仅用于发送预设格式的信息,而不是用户界面例程。 sendmail 命令从标准输入中读取消息文本。 在读取消息结束符时,sendmail 命令会将消息副本发送到所列出的所有地址。 消息结束符不是文件结束符(Ctrl-D)控制序列,也不是一行的句点。

sendmail 邮件过滤 API(Milter)

sendmail邮件过滤器 API 可在邮件处理过程中访问邮件信息。 这样,第三方程序就可以过滤元信息和内容。 使用 "sendmail邮件过滤器 API 开发的过滤器使用线程,因此可能需要更改过滤器中的每个进程限制。 例如,如果过滤器使用频繁,可使用 "setrlimit子程序来增加打开文件描述符的数量。

在 sendmail 配置中指定过滤器
使用关键字 X(表示外部)来指定过滤器。 以下是几个过滤器的示例:
  • Xfilter1, S=local:/var/run/f1.sock, F=R
  • Xfilter2, S=inet6:999@localhost, F=T, T=C:10m;S:1s;R:1s;E:5m
  • Xfilter3, S=inet:3333@localhost
您可以在 .mc 文件中指定过滤器。 以下过滤器附加于目录 /var/run 中的UNIX域套接字:
INPUT_MAIL_FILTER(`filter1', `S=local:/var/run/f1.sock, F=R')
下面的过滤器使用本地主机 999 端口上的IPv6套接字:
INPUT_MAIL_FILTER(`filter2', `S=inet6:999@localhost, F=T, T=C:10m;S:1s;R:1s;E:5m')
下面的过滤器使用本地主机 3333 端口上的IPv4套接字:
INPUT_MAIL_FILTER(`filter3', `S=inet:3333@localhost')

sendmail 邮件过滤标志

R
如果过滤器不可用,则拒绝连接。
T
如果过滤器不可用,连接会暂时失败。

如果既未指定 F=R 也未指定 F=T ,则 sendmail 命令传递消息,就好像过滤器不存在一样。 分隔符是逗号(,)。

sendmail 邮件过滤器超时

你可以用 "T=x覆盖默认的sendmail超时,其中x可以取以下值::
C
连接到过滤器的超时(如果为 0,那么使用系统超时)。
S
从邮件传输代理 (MTA) 向过滤器发送信息的超时。
R
从过滤器读取回复的超时。
E
从向过滤器发送结束信息到等待最终确认之间的总超时。
每个条目之间的分隔符是分号(;)。

缺省值为: T=C:0m;S:10s;R:10s;E:5m

InputMailFilters选项决定启动的筛选器以及筛选器的排序方式:
InputMailFilters=filter1, filter2, filter3
这将根据 ".mc文件中 "INPUT_MAIL_FILTER命令的顺序自动设置。 您也可以通过在 ".mc文件中设置 "confINPUT_MAIL_FILTERS来重置该值。 该选项按指定的顺序调用三个筛选器。

您可以在 ".mc文件中使用 "MAIL_FILTER()而不是 "INPUT_MAIL_FILTER()来定义过滤器,而无需将其添加到输入过滤器列表中。

注意:如果未定义 "InputMailFilters,则不使用筛选器。

使用 sendmail 配置文件

在AIX 7.2 技术等级 3 及更早版本中,"sendmail命令使用单个配置文件 "/etc/mail/sendmail.cf来设置运行参数并确定命令解析地址的方式。 从AIX 7.2 技术级 4 开始,"sendmail命令通过使用 "/etc/mail/submit.cf配置文件支持邮件提交程序模式(MSP_mode)。 MSP 模式下的 "sendmail命令不需要 root 权限。 因此,与以前的版本相比,MSP 模式下的 "sendmail命令更加安全。 当 sendmail 命令在邮件传输代理(MTA)模式下作为邮件服务器守护进程运行时, sendmail 命令会使用 sendmail.cf 配置文件。 有关sendmail命令安全考虑的更多信息,请参阅http://www.sendmail.org/~ca/email/doc8.12/SECURITY
注意:将操作系统升级到AIX 7.2、技术等级 5 或更高版本后,"/etc/mail目录将包含新的 "/etc/mail/sendmail.cf和 "/etc/mail/submit.cf文件。 先前版本的 AIX 中的现有 /etc/mail/sendmail.cf/etc/mail/submit.cf 文件将复制到 /lpp/save.config/etc/mail 目录。
sendmail 配置文件的说明如下:
/etc/mail/sendmail.cf
sendmail 命令以 MTA 方式作为邮件服务器守护程序运行时,将使用此配置文件。 缺省情况下, sendmail.cf 文件使用 /var/spool/mqueue 目录中的邮件队列。 在系统引导时,缺省情况下会在 /etc/rc.tcpip 目录中启动 sendmail MTA 守护程序。 要手动启动 sendmail MTA 守护程序,请输入以下命令:
# startsrc -s sendmail -a " -bd -q30m"
/etc/mail/submit.cf
此配置文件由 sendmail 命令用于在 MSP 方式下运行。 缺省情况下, submit.cf 文件使用 /var/spool/clientmqueue 目录中的系统邮件队列。 sendmail 命令在以下场景下以 MSP 方式运行:
  • sendmail 命令在命令行运行时或由其他邮件工具 (例如 mail 命令) 调用以发送电子邮件时。
  • 当 "sendmail命令作为客户队列运行程序被调用时。 sendmail 客户机队列运行器在 /var/spool/clientmqueue 目录中标识未传递的消息,并将这些消息提交到 sendmail MTA 守护程序以进行传递。 要在 MSP 模式下作为队列运行程序手动运行 "sendmail命令,请输入以下命令:
    # /usr/lib/sendmail -Ac -q 30m 

您还可以通过编辑 /etc/rc.tcpip 文件将 sendmail MTA 守护程序设置为每当系统引导时自动启动。 有关编辑 /etc/rc.tcpip 文件的指示信息,请参阅 在系统引导期间启动 sendmail 守护程序

重启和刷新sendmail进程

sendmail 命令使用的配置文件是您可以使用任何文本编辑器编辑的文本文件。 在修改任何这些配置文件之后,必须重新启动或刷新 MTA 守护程序和 MSP 以使更改生效。

sendmail命令的当前进程标识存储在 /etc/mail/sendmail.pid 文件中。 要让 "sendmail命令重新读取新编辑的配置文件,请输入以下 "kill命令:

#kill -15 `head -1 /etc/mail/sendmail.pid`

如果 srcmstr 命令正在运行,那么可以运行 refresh 命令以再次构建配置数据库,别名数据库和 NLS 数据库:

#refresh -s sendmail

如果手动启动了 sendmail MSP ,并且如果 sendmail 进程不受 srcmstr 命令控制,那么可以使用以下 kill 命令来停止 sendmail 进程:

# kill <pid of the sendmail: Queue runner >

迁移至AIX 7.2,技术等级 4

如果运行的是AIX 7.2 技术等级 3 或更早版本,并且配置了 "sendmail命令,那么当迁移到AIX 7.2 技术等级 4 时,"sendmail命令将作为 MTA 守护进程运行。 要在开始迁移操作前备份 "sendmail.cf配置文件,请输入以下命令:

# cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.old

完成迁移操作后,会将先前的 sendmail.cf 配置文件传输到新的 sendmail.cf 配置文件。

将AIX®操作系统迁移到AIX版本7.2、技术等级 4 或更高版本后,请完成以下步骤:
  1. 要在迁移后找不到 sendmail.cf 文件时恢复 sendmail.cf 备份文件,请输入以下命令:
    # cp /etc/mail/sendmail.cf.old /etc/mail/sendmail.cf
  2. 要重启和刷新 "sendmail进程,请输入以下命令:
    # startsrc -s sendmail -a " -bd -q30m"
    # refresh -s sendmail

    这些命令以 MTA 身份运行 sendmail 命令。

sendmail 命令将重新读取数据库并使用 sendmail.cf 配置文件继续操作。

定义别名

sendmail 命令处理本地邮件时,sendmail 命令允许您定义使用的别名。 别名是一种替代名称,可以用来代替详细的网络地址。 您也可以使用别名构建分发列表。

/etc/mail/aliases 文件中定义别名。 该文件是一个文本文件,您可以对其进行编辑。 sendmail 命令使用此文件的数据库版本。 在对 "/etc/mail/aliases文件所做的任何更改生效之前,必须通过运行 "sendmail-bi命令或 "newaliases命令建立一个新的别名数据库。

AIX上的Sendmail 8.11.0 支持伯克利数据库 (DB)。 sendmail命令将继续以数据库管理器(DBM)格式读取别名,直到重建别名数据库。 一旦重建,sendmail 将读取 Berkeley DB 格式的别名并将它们存储在 /etc/mail/aliases.db 文件中。

注意:在 "/etc/mail/aliases文件中定义别名时,嵌套别名只能使用小写字母。 别名右侧的大写字符在存储到别名数据库前会转换为小写。 在下面的示例中,发送到 "testalias的邮件发送失败,因为在存储第二行时,"TEST被转换为 "test
TEST: user@machine
testalias: TEST

每个系统都必须有一个指定为 "postmaster别名的用户或用户别名。 postmaster 别名的缺省值为一个 root 文件。 在 /etc/mail/aliases 文件中您可以将此别名指定给不同的用户。 postmaster别名允许系统外的其他用户向已知 ID 发送邮件,并获取向系统内用户发送邮件的信息。 您系统上的用户也可以将问题通知发送到 postmaster 标识。

sendmail 命令首先以散列样式别名文件的格式打开数据库。 如果失败或未编译 NEWDB 支持,该命令将打开一个新的数据库管理器 (NDBM) 数据库。 如果无法打开,那么 sendmail 命令会将别名源文件读入到它的内部符号表。

标志

表 1. 标志
描述
-Ac 文件 指定 sendmail 命令以根据操作方式选择备用配置文件。 如果指定 -bm-bs-t 标志,那么 sendmail 命令将使用 submit.cf 配置文件。 如果指定了任何其他标志,并且为了与较早版本兼容, sendmail 命令将使用 sendmail.cf 配置文件。 如果不指定文件变量,"sendmail命令默认使用 "submit.cf配置文件。
-B类型 将主体类型设置为 type。 当前合法值为 7BI 或 8BITMIME。
注:-b 标志是互斥的。
-ba ARPANET 模式下启动 sendmail 命令。 命令的所有输入行必须以回车符和换行符(CR-LF)结束。 sendmail 命令生成以 CR-LF 结尾的消息,并查看 From:Sender: 字段来查找发送方的名称。 从 sendmail 命令版本 8.17.1 开始,该行为已更新为期望使用标准数据结束序列 (<CR><LF>.<CR><LF>),而不是非标准序列 (<LF>.<CR><LF>) 和 (<LF>.<LF>)。
-bd 启动 sendmail 命令使其像简单电子邮件传输协议(SMTP)邮件路由器一样作为守护程序在后台运行。
-bD 将 "sendmail命令作为守护进程启动,在前台作为 SMTP 邮件路由器运行。
-bh 显示持久主机状态数据库。
-bH 清除持久主机状态数据库。
-bi 根据 "/etc/mail/aliases文件中定义的信息建立别名数据库。 使用该标记运行 "sendmail命令与运行 "newaliases命令相同。
-bm 默认以常规方式发送邮件。
-bp 显示邮件队列列表。 使用该标记运行 "sendmail命令与运行 "mailq命令相同。
-bs 使用RFC821中描述的 SMTP 从标准输入中收集邮件。 此标志也包含所有与 SMTP 兼容的 -ba 标志的操作。
-bt 以地址测试方式启动 sendmail 命令。 此方式允许您输入交互式地址并在 sendmail 命令显示其分析地址所执行的步骤时进行监视。 在测试方式提示符下,输入一个规则集或用逗号分割的多个规则集并输入地址。 使用此方式来调试新配置文件中的地址分析规则。
-bv 启动 "sendmail命令,请求验证命令的地址参数字段中提供的用户 ID。 sendmail 命令返回一条消息作为响应,告诉哪些标识可由邮件程序解析。 它并不尝试收集或传递消息。 使用此模式验证用户标识、别名或邮递列表的格式。
-C文件 使用File变量指定的其他配置文件启动 "sendmail命令。 在安装用作运行的配置文件的新配置文件之前,和 -bt 一起使用此标志来测试该文件。
-D 日志文件 将调试输出发送至所指定的日志文件。 -D 选项必须在 -d 选项前面。
-d 将调试值设置为 Value 变量所指定的值。 唯一有效的值是 "21.n,其中n是任何非零整数。 它产生有关地址分析的信息并且通常和 -bt 标志一起使用。 n 的更高值生成更多的详细信息。 使用此标志需要引导许可权。
-F FullName 将发送方的全名设置为 FullName 变量所提供的字符串。
-f名称 设置发件人(邮件信封发件人)的名称。 如果在初始提交过程中 From: 头丢失,那么在该头中仍可以使用这个地址。 信封发件人地址被用作投递状态通知的收件人,也可能出现在 "Return-path:标头中。 只有受信任的用户(通常是 root、daemon 和 uucp)或您试图成为的用户与您本人相同时,才能使用此标记。 否则,将在报文中添加 "X-Authentication-Warning标头。
-G 消息的中继(网关)提交。 例如,当 rmail 命令调用 sendmail 命令时。
-h 编号 将跳计数设置为 Number 变量所指定的值。 跳计数是 SMTP 路由器(不仅仅是 sendmail 命令的本地副本)所处理消息的次数。 邮件路由器每次处理邮件时都会递增跳数。 当它到达限制时,就会返回一条错误消息以在防止邮件系统中的无限循环。
-i 忽略入局消息的行中单独的点。 如果从文件中读取数据,则必须设置此项。
-L 将 "syslog信息中使用的标识符设置为所提供的标记。
-M 将宏 x 设置为指定的 Value
代码-N 将交付状态通知条件设置为数据源名称 (DSN)。 以下是交货状态通知条件:
  • never:无通知或以逗号分隔的值列表。
  • failure:用于在发送失败时发出通知。
  • delay:用于延迟交货的通知。
  • success:用于成功发送信息时的通知。
-n 阻止 sendmail 命令解释别名。
-O 选项= Option 设置为指定的 Value。 使用长格式选项名称。
-o选项[] 设置 Option 变量。 如果选项是一个有值的选项,您也必须为 Value 变量指定一个值。
注:有关有效值,请参阅《性能工具指南和参考》中 "sendmail.cf文件中的 sendmail 命令选项
-p协议 设置发送协议。 建议您设置此项。 可以 "Protocol:Host的形式设置协议,以同时设置发送协议和发送主机。 例如,"-pUUCP:uunet将发送协议设置为 UUCP,将发送主机设置为 "uunet。 一些现有的程序使用 -oM 标志设置 rs 宏,它和使用 -p 标志是等效的。
-qI子字符串 将进程作业限制为那些包含作为队列标识的 Substr
-qG 名称 队列中的处理工作只按名称分组。
-qR子字符串 将进程作业限制为那些包含作为接收方之一的子串的 Substr
-qS子字符串 将进程作业限制为那些包含作为发送方的子串的 Substr
-q[时间] 按照时间变量指定的时间间隔处理队列中保存的报文。 如果没有指定 Time 变量,那么该标志立即处理队列。
-R返回 设置如果消息弹回要返回的消息的量。 Return 参数可以为 full 以表示返回整个信息或者为 hdrs 以表示仅能返回头部分。
-r地址 -f 的废弃格式。
-t 将消息发送到消息头的 To:Cc: 以及 Bcc: 字段中指定的接收方,也可以发送到命令行中指定的任何用户。
-V 恩维 设置原始包络标识。 它可以通过 SMTP 传播到支持 DSN 的服务器上,并且以 DSN 兼容的错误消息返回。
-v 以详细的方式启动 sendmail 命令。 sendmail 命令显示有关传输状态和别名扩展的消息。
-XLogFile LogFile中记录所有进出 "sendmail的流量,以便调试邮件程序问题。 请慎用此标记,因为它会迅速产生大量数据。

您也可以设置或除去 sendmail 配置处理选项。 负责邮件系统的人使用这些选项。 要设置这些选项,请使用命令行上的 "-o标志或配置文件 "/etc/mail/sendmail.cf中的 "O控制行。

退出状态

sendmail 命令返回退出状态值。 这些退出值在 /usr/include/sysexits.h 文件中定义。 下列表总结了这些返回值的含义:

表 2. 退出值
描述
EX_无法创建 sendmail 命令不能创建用户指定的文件。
EX_CONFIG 在配置文件的格式中发现错误。
EX_DATAERR 某种方式下输入的数据不正确。
EX_IOERR 在 I/O 过程中产生错误。
EX_NOHOST sendmail命令可能无法识别指定的主机名。
EX_无输入 输入文件(非系统文件)不存在或者不可读。
EX_NOPERM 用户没有执行所请求的操作的许可权。
EX_无用户 sendmail命令可能无法识别指定的用户 ID。
EX_OK sendmail 命令已成功完成。
EX_OSERR 出现一个临时操作系统错误。 这种错误的一个示例是创建一个新的进程失败。
EX_OSFILE 出现系统文件错误。 例如,"/etc/passwd等系统文件不存在、无法打开或有其他类型的错误导致无法使用。
EX_PROTOCOL 在协议交换过程中,远程系统返回一些不正确的东西。
EX_软件 出现一个内部软件错误(包含错误的自变量)。
EX_TEMPFAIL sendmail命令可能无法创建与远程系统的连接。 稍后重新尝试请求。
EX_不可用 sendmail 命令所需的服务或资源不可用。
EX_USAGE 命令语法不正确。

安全性

RBAC 用户和可信AIX用户请注意:此命令可执行特权操作。 只有特权用户才能执行特权限定的操作。 有关授权和权限的更多信息,请参阅安全中的特权命令数据库。 要获取与此命令相关联的特权和权限的列表,请参阅 lssecattr 命令或 getcmdattr 子命令。

审计活动

表 3. 审计事件
事件 信息
SENDMAIL_Config 配置事件
SENDMAIL_ToFile 创建文件事件

示例

要显示 sendmail 版本,请输入以下命令:

echo \$Z | sendmail -d0

显示与以下信息类似的信息:

Version AIX5.2/8.11.6p2
 Compiled with: LDAPMAP MAP_REGEX LOG MATCHGECOS MIME7TO8 MIME8TO7
             NAMED_BIND NDBM NETINET NETINET6 NETUNIX NEWDB NIS NISPLUS
                QUEUE SCANF SMTP USERDB XDEBUG

============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = dodgers
  (canonical domain name) $j = dodgers.usca.ibm.com
         (subdomain name) $m = usca.ibm.com
              (node name) $k = dodgers
========================================================

Recipient names must be specified
# oslevel -r
5200-02
#

文件

表 4. 文件
描述
/usr/sbin/sendmail 包含 "sendmail命令。
/usr/sbinmailq/ 包含邮件队列。
/usr/sbin/newaliases 包含别名数据库。
/usr/sbin/mailstats 包含 "/usr/lib/sendmail.st文件中的统计数据。
/etc/mail/aliases 包含 sendmail 命令别名的文字版。
/etc/mail/aliases.db 包含一个 Berkeley DB 格式的别名数据库。
/etc/mail/aliases.dir 包含一个 DBM 格式的别名数据库。
/etc/mail/aliases.pag 包含一个 DBM 格式的别名数据库。
/etc/mail/sendmail.cf 包含 sendmail 配置文件的文字版。
/etc/mail/submit.cf 包含 sendmail 配置文件的文字版。 如果此文件存在,那么会将此文件视为缺省配置文件。
/etc/sendmail.st 包含邮件路由的统计信息。
/usr/lib/smdemon.cleanu 维护 "/var/spool/mqueue目录下日志文件的老化副本。
/var/spool/mqueue 包含与邮件队列中的邮件相关联的临时文件和日志文件。
/usr/bin/uux 包含用于传递基本联网实用程序(BNU)的邮件程序命令。
/usr/bin/bellmail 包含用于传递本地邮件的邮件程序命令。