Project

General

Profile

SMTPコマンドでメール送信

  • 次のシェルスクリプトを作成
    vi mail.sh
    --------------------
    #!/bin/bash
    
    HOST="接続先ホスト名" 
    PORT="接続先ポート番号" 
    EHLO="`hostname`" 
    SUBJECT="`date '+%Y-%m-%d_%H-%M-%S-%N'`" 
    MSG_ID="`date '+%Y-%m-%d_%H-%M-%S-%N'`@`hostname`" 
    FROM="FROMに設定するメールアドレス" 
    TO=$1
    CC=$2
    ####################################
    
    if [ -z ${TO} ]; then
      echo 'mail.sh <to mail@example.com>'
      exit
    fi
    
    exec 3<>/dev/tcp/$HOST/$PORT
    
    wait(){
        while true
        do
            read line <&3
            echo "$line" 
            if [[ "$line" == $1 ]]
            then break
            fi
        done
    }
    
    wait "[1-9]*" 
    echo EHLO ${EHLO} >&3
    wait "[1-9]*" 
    echo MAIL FROM: ${FROM} >&3
    wait "[1-9]*" 
    echo RCPT TO: ${TO} >&3
    wait "[1-9]*" 
    echo DATA >&3
    echo FROM: ${FROM} >&3
    echo TO: ${TO} >&3
    if [ -n "${CC}" ]; then
      echo CC: ${CC} >&3
    fi
    echo Message-ID: \<${MSG_ID}\> >&3
    echo Subject: ${SUBJECT} >&3
    echo Message-ID is >&3
    echo \<${MSG_ID}\> >&3
    echo . >&3
    wait "[1-9]*" 
    echo QUIT >&3
    
    echo Message Sent : ${SUBJECT}
    
  • 次の書式でコマンドを実行
    sh mail.sh 宛先のメールアドレス (CC先のメールアドレス)
    

補足

  • 次のメッセージでメールが送信できない場合
    501 Syntax: EHLO hostname
    250 2.1.0 Ok
    250 2.1.5 Ok
    354 End data with <CR><LF>.<CR
    
  • 名前解決ができるか確認する
    dig `hostname`
    
  • できない場合、DNS正引き登録を行うか、hostsにhostnameを記載する
    vi /etc/hosts
    --------------------
    192.168.0.xx  mail mail.example.com
    
    • または、EHLOの変数内容を空白にすることで送信できることもある
      EHLO="" 
      
  • 自分自身に向けては以下のエラーで実行ができないので注意。
    warning: Illegal address syntax from localhost[127.0.0.1] in MAIL command: user@example.com
    warning: non-SMTP command from localhost[127.0.0.1]: FROM: user@example.com
    
  • 実行時、最後に表示される『Message Sent : ……』に基づいた件名のメールが送信される。