mstmp 설치 및 사용방법 (메일 전송 스크립트)

서버 쉘스크립트 내용을 메일로 쏴봅시다.

 

일단 시작에 앞서 저는 별도 구현해 놓은 smtp 서버가 없고 단발성 메일 전송만 하기 떄문에 msmtp 를 사용합니다.

 

아래와 같이 설치하면됩니다.

# Ubuntu/Debian 계열
sudo apt update
sudo apt install -y msmtp msmtp-mta

# CentOS/RHEL 계열
sudo yum install -y epel-release
sudo yum install -y msmtp

 

설치가 완료되었으면, 여기에 설정을 해주어야합니다

# 파일 생성 및 편집
nano ~/.msmtprc

 

아래와 같이 설정을 진행합니다.

비밀번호는 네이버나 gmail 을 사용할 때 사용하는 1차 비밀번호가 아니라,

STMP 앱 비밀번호입니다.

 

하단에 네이버 기준 앱 비밀번호 설정 및 확인방법 공유드리겠습니다. 

 

우선 임시로 아래와 같이 설정합시다.

# 기본 계정 설정
account default
host smtp.naver.com
port 587
auth on
user 전송할 이메일 계정      # 본인 네이버 메일 계정
password 비밀번호            # 앱 비밀번호(2단계 인증 시 필요)
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

 

그리고 이 파일은 보안때문에

600 권한을 가져갸아합니다. 소유자 (rw) 권한

chmod 600 ~/.msmtprc

 

완료하였으면 이제 네이버 메일로 보낼겁니다

네이버에 로그인을 해주고, 톱니바퀴(설정)으로 들어가줍니다.

네이버로그인
네이버 로그인

 

 

하단에 보안 설정을 눌러주시고

 

보안설정
보안설정

2단계 인증 부분에 '관리' 버튼을 눌러줍니다.

2단계 인증진행
2단계 인증

 

아웃룩을 눌러주고, 비밀번호 생성하기 버튼을 눌러주면 아래 비밀번호가 생성되는데요

이 비밀번호를 아까 msmtprc 파일에 넣어주면 됩니다.

 

그러면 설정은 완료됩니다.

애플리케이션 비밀번호 설정
애플리케이션 비밀번호설정

 

편의상 저는 제가 짠 스크립트 간단한 nginx 로그들에 대해서 메일로 전송되도록 짰고,

 

해당 부분은 crontab 을 이용해서, 지속적으로 오게 설정도 가능하나,

우선 테스트로 전송이 잘 되나 해보면 될듯합니다!

 

#!/usr/bin/env bash
# 최소 버전: Nginx 로그 요약 → 메일(또는 stdout)
# 사용: ./nginx-daily.sh -f /var/log/nginx/access.log -t you@example.com
# 크론: 0 8 * * * /path/nginx-daily.sh -f /var/log/nginx/access.log -t you@example.com

set -euo pipefail

LOG_FILE="/var/log/nginx/access.log"
TO=""
SUBJECT="Nginx Daily Report - $(date +'%Y-%m-%d')"

while [[ $# -gt 0 ]]; do
  case "$1" in
    -f|--file) LOG_FILE="$2"; shift 2;;
    -t|--to)   TO="$2"; shift 2;;
    -s|--subject) SUBJECT="$2"; shift 2;;
    *) echo "[!] unknown arg: $1" >&2; exit 2;;
  esac
done

[[ -r "$LOG_FILE" ]] || { echo "[!] cannot read $LOG_FILE" >&2; exit 1; }

# ---- 보고서 생성 (stdout) ----
{
  echo "=== Nginx Daily Report ==="
  echo "Date      : $(date '+%Y-%m-%d %H:%M:%S %z')"
  echo "Log File  : $LOG_FILE"
  echo

  echo "[총 요청 수]"
  wc -l < "$LOG_FILE"
  echo

  echo "[상위 10 IP]"
  awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr | head
  echo

  echo "[상태코드 분포]"
  awk '{print $9}' "$LOG_FILE" | grep -E '^[0-9]{3}$' | sort | uniq -c | sort -nr
  echo

  echo "[상위 10 URL]"
  awk -F\" '{print $2}' "$LOG_FILE" | awk '{print $2}' | sort | uniq -c | sort -nr | head
  echo

  echo "[404 상위 10 URL]"
  awk '$9=="404"{print $7}' "$LOG_FILE" | sort | uniq -c | sort -nr | head
} > /tmp/nginx_rpt.$$

# ---- 메일러 있으면 전송, 없으면 화면 출력 ----
if [[ -n "${TO}" ]]; then
  {
    echo "From: ${FROM:-sidml123@naver.com}"   # ~/.msmtprc의 from와 동일하게
    echo "To: ${TO}"
    echo "Subject: ${SUBJECT:-Nginx Daily Report}"
    echo "Content-Type: text/plain; charset=UTF-8"
    echo
    cat /tmp/nginx_rpt.$$
  } | /usr/bin/msmtp -t --file=/root/.msmtprc
else
  # 수신자 없으면 그냥 화면 출력
  cat /tmp/nginx_rpt.$$
fi

 

 

./nginx-daily.sh -f /var/log/nginx/access.log -t sidml123@naver.com

 

위와 같이 실행해주면 아래와 같이 메일이 온것을 확인 할 수 있습니다.

메일짠