12

With sendmail, how would you send all outgoing mail to /dev/null or just prevent email from being queued up or sent at all?

On a development nagios box I want prevent sending of mail so that notifications don't go out. Stopping outbound mail will allow me to test the nagios config as is and prevent spurious notifications.

Steve Schnepp
  • 2,222
  • 3
  • 21
  • 27
cwebber
  • 491
  • 3
  • 7

4 Answers4

8

I did this on my development box by disabling sendmail completely and then having a simple perl script listen on the SMTP port and dump the emails into a directory. I'm sure it's possible to do with the sendmail configuration, but the perl script was much easier. Here's it stripped down to the essentials:

#!/usr/bin/perl -w 
use Net::SMTP::Server; 
use Net::SMTP::Server::Client; 

$server = new Net::SMTP::Server || die("$!\n"); 

while($conn = $server->accept()) { 
  my $client = new Net::SMTP::Server::Client($conn) || 
    die("Unable to handle client connection: $!\n"); 
  $client->process || next; 

  # Here's where you can write it out or just dump it. Set $filename to 
  # where you want to write it
  open(MAIL,"> $filename") || die "$filename: $1"; 
  print(MAIL "$client->{MSG}\n"); 
  close(MAIL); 
} 
JOTN
  • 1,727
  • 1
  • 10
  • 12
7

The following sends everything to /dev/null:

LOCAL_RULE_0
R$* < @ $* > $*       $#local $: bit-bucket

This assumes that in your /etc/aliases:

bit-bucket: /dev/null
adamo
  • 6,867
  • 3
  • 29
  • 58
  • 1
    Be careful not to just type this in -- there is a TAB between the two sides of the rule. – Erica Kane Apr 15 '16 at 13:32
  • What email system are you using and where do you add that rule? – teknopaul Jan 10 '17 at 16:53
  • Standard sendmail from sendmail.org. The rule gets added to sendmail.mc and then sendmail.cf is produced according to your OS / distribution's specifics. – adamo Jan 11 '17 at 08:49
0

On a development vm running Joomla, I configured it to send emails to /some/path/sendmail.bash instead of the Sendmail default path /usr/sbin/sendmail. This was an easy way to log mails to a file for later debugging (including decoding base64 parts) using a bash/awk script while also preventing any emails being send by the CMS.

/some/path/sendmail.bash:

#!/bin/bash
read -d '' awkScript << 'EOF'
BEGIN {
    p=1 #print 
    multipart=0
    boundary=0
    part=0
    text=0
    encoded=0
    debug=0
}
!multipart && tolower($0) ~ /^content-type:[ \t]*multipart/ {
#works!multipart && /^Content-Type: multipart/ {
    multipart=$2
    if (debug) { print "Multipart Email: " multipart }
}
multipart && !boundary && /boundary=/ {
    split($1,s,"=")
    boundary = s[2]
    gsub(/"/, "", boundary) #remove the surrounding quote
    if (debug) { print "With boundary: " boundary }
}
#start of new part or end of all parts
multipart && ($0 ~ ("^--" boundary "$") || $0 ~ ("^--" boundary "--") ) {
    part=1
    text=0
    encoded=0
    p=1
}
part && !text && tolower($0) ~ /^content-type: text/ {
    text=$2
    if (debug) { print "Text: " text }
}
part && encoded {
    #https://stackoverflow.com/questions/66228621/base64-decode-command-linux-cli-command
    if (/^\s*$/) { #skip decoding blank lines 
        print $0
    } else {
        system("echo '" $0 "' | base64 -d")
    }
}
p #if p then print current line

part && text && !encoded && tolower($0) ~ /^content-transfer-encoding: base64/ {
    encoded=$2
    if (debug) { print "Encoded: " encoded }
    p=0 #make sure this line prints so test after it has printed
}

END {
   #print "END" 
}
EOF
#echo $awkScript
awk "$awkScript" >> /tmp/sendmail.log
#awk "$awkScript"

site
  • 101
  • 1
0

Try smtp-sink, which is available on Linux. For example:

$ smtp-sink -u postfix -c nynode.com:25 1000
Cody Gray
  • 135
  • 8