maddy/docs/reference/checks/command.md
2025-09-05 16:54:41 +02:00

3.5 KiB
Raw Permalink Blame History

System command filter

This module executes an arbitrary system command during a specified stage of checks execution.

command executable_name arg0 arg1 ... {
	run_on body

	code 1 reject
	code 2 quarantine
}

Arguments

The module arguments specify the command to run. If the first argument is not an absolute path, it is looked up in the Libexec Directory (/usr/lib/maddy on Linux) and in $PATH (in that ordering). Note that no additional handling of arguments is done, especially, the command is executed directly, not via the system shell.

There is a set of special strings that are replaced with the corresponding message-specific values:

  • {source_ip} IPv4/IPv6 address of the sending MTA.
  • {source_host} Hostname of the sending MTA, from the HELO/EHLO command.
  • {source_rdns} PTR record of the sending MTA IP address.
  • {msg_id} Internal message identifier. Unique for each delivery.
  • {auth_user} Client username, if authenticated using SASL PLAIN
  • {sender} Message sender address, as specified in the MAIL FROM SMTP command.
  • {rcpts} List of accepted recipient addresses, including the currently handled one.
  • {address} Currently handled address. This is a recipient address if the command is called during RCPT TO command handling (run_on rcpt) or a sender address if the command is called during MAIL FROM command handling (run_on sender).

If value is undefined (e.g. {source_ip} for a message accepted over a Unix socket) or unavailable (the command is executed too early), the placeholder is replaced with an empty string. Note that it can not remove the argument. E.g. -i {source_ip} will not become just -i, it will be -i ""

Undefined placeholders are not replaced.

Command stdout

The command stdout must be either empty or contain a valid RFC 5322 header. If it contains a byte stream that does not look a valid header, the message will be rejected with a temporary error.

The header from stdout will be prepended to the message header.

Configuration directives

run_on conn | sender | rcpt | body

Default: body

When to run the command. This directive also affects the information visible for the message.

  • conn
    Run before the sender address (MAIL FROM) is handled.
    Stdin: Empty
    Available placeholders: {source_ip}, {source_host}, {msg_id}, {auth_user}.

  • sender
    Run during sender address (MAIL FROM) handling.
    Stdin: Empty
    Available placeholders: conn placeholders + {sender}, {address}. The {address} placeholder contains the MAIL FROM address.

  • rcpt
    Run during recipient address (RCPT TO) handling. The command is executed once for each RCPT TO command, even if the same recipient is specified multiple times.
    Stdin: Empty
    Available placeholders: sender placeholders + {rcpts}. The {address} placeholder contains the recipient address.

  • body
    Run during message body handling.
    Stdin: The message header + body
    Available placeholders: all except for {address}.


code integer ignore
code integer quarantine
code integer reject smtp-code smtp-enhanced-code smtp-message

This directive specifies the mapping from the command exit code integer to the message pipeline action.

Two codes are defined implicitly, exit code 1 causes the message to be rejected with a permanent error, exit code 2 causes the message to be quarantined. Both actions can be overridden using the 'code' directive.