Sending mail from a Bash shell script

前端 未结 12 1525
梦毁少年i
梦毁少年i 2021-01-29 22:54

I am writing a Bash shell script for Mac that sends an email notification by opening an automator application that sends email out with the default mail account in Mail.app. The

12条回答
  •  猫巷女王i
    2021-01-29 23:26

    I whipped this up for the challenge. If you remove the call to 'dig' to obtain the mail relay, it is a 100% native Bash script.

    #!/bin/bash
    MAIL_FROM="sfinktah@bash.spamtrak.org"
    RCPT_TO="sfinktah@bash.spamtrak.org"
    MESSAGE=message.txt
    SMTP_PORT=25
    SMTP_DOMAIN=${RCPT_TO##*@}
    
    index=1
    while read PRIORITY RELAY
    do
        RELAY[$index]=$RELAY
        ((index++))
    done < <( dig +short MX $SMTP_DOMAIN )
    
    RELAY_COUNT=${#RELAY[@]}
    SMTP_COMMANDS=( "HELO $HOSTNAME" "MAIL FROM: <$MAIL_FROM>" "RCPT TO: <$RCPT_TO>" "DATA" "." "QUIT" )
    SMTP_REPLY=([25]=OK [50]=FAIL [51]=FAIL [52]=FAIL [53]=FAIL [54]=FAIL [55]=FAIL [45]=WAIT [35]=DATA [22]=SENT)
    
    for (( i = 1 ; i < RELAY_COUNT ; i++ ))
    do
        SMTP_HOST="${RELAY[$i]}"
        echo "Trying relay [$i]: $SMTP_HOST..."
        exec 5<>/dev/tcp/$SMTP_HOST/$SMTP_PORT
        read HELO <&5
        echo GOT: $HELO
        for COMMAND_ORDER in 0 1 2 3 4 5 6 7
        do
                OUT=${SMTP_COMMANDS[COMMAND_ORDER]}
                echo SENDING: $OUT
                echo -e "$OUT\r" >&5
    
                read -r REPLY <&5
                echo REPLY: $REPLY
                # CODE=($REPLY)
                CODE=${REPLY:0:2}
                ACTION=${SMTP_REPLY[CODE]}
                case $ACTION in
                        WAIT )          echo Temporarily Fail
                                                        break
                                                        ;;
                        FAIL )          echo Failed
                                                        break
                                                        ;;
                        OK )                            ;;
                        SENT )          exit 0
                                                        ;;
                        DATA )          echo Sending Message: $MESSAGE
                                                        cat $MESSAGE >&5
                                                        echo -e "\r" >&5
                                                        ;;
                        * )         echo Unknown SMTP code $CODE
                                                        exit 2
                esac
        done
    done
    

提交回复
热议问题