서버 부팅 시 메일 보내기

Prometheus와 Grafana로 서버를 모니터링하고 있는데
서버가 죽을 때마다 따로 알림을 못 받는 게 계속 마음에 걸렸다.
이참에 서버들을 쭉 설정하면서 글을 남겨본다.

처음엔 sendmail같은 걸 생각해봤는데 sendmail을 막는 곳이 생각보다 많아서 어쩔 수 없이 gmail을 이용하기로 했다.
python과 gmail을 통해 메일을 보낼 것이다.

먼저 google 계정에 2단계 인증(2FA)을 받은 후 앱 비밀번호를 발급해야 한다. [구글]
앱 비밀번호를 발급한 후에는 다음과 같이 파이썬 스크립트를 작성한다.
google 계정과 앱 비밀번호, 메일 제목과 내용을 알아서 바꿔주자.

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


class BootSMTP:
    SENDER_ADDRESS = "DUMMY@MAIL.COM"
    RECEIVER_ADDRESS = "YOUR@MAIL.COM"
    MAIL_PASSWORD = "GOOGLEaPPpASSWORD"
    SMTP_SERVER = "smtp.gmail.com"
    SMTP_PORT = 465

    @classmethod
    def send_mail(cls, subject, text):
        message = MIMEMultipart("alternative")
        message["Subject"] = subject
        message["From"] = cls.SENDER_ADDRESS
        message["To"] = cls.RECEIVER_ADDRESS

        part1 = MIMEText(text, "plain")
        part2 = MIMEText(f"<html><body><p>{text}</p></body></html>", "html")

        message.attach(part1)
        message.attach(part2)

        with smtplib.SMTP_SSL(cls.SMTP_SERVER, cls.SMTP_PORT) as server:
            server.login(cls.RECEIVER_ADDRESS, cls.MAIL_PASSWORD)
            server.sendmail(cls.SENDER_ADDRESS, cls.RECEIVER_ADDRESS, message.as_string())


subject = "MAIL SUBJECT"
text = "MAIL TEXT"

BootSMTP.send_mail(subject, text)

위 코드를 파이썬으로 실행하면 메일이 잘 전송된다.
(참고로 SMTP 특성 상 잘 전송됐는지 확인할 수 있는 방법은 없다)

이제 OS에 맞게 부팅 시 스크립트를 실행하도록 해주면 된다.
crontab이 안 깔려있는 리눅스 배포판은 없을 테니 가장 간편한 방법은 crontab일 듯 하다.
crontab -e를 통해 crontab을 연 후 다음과 같이 수정한다.
물론 파이썬과 스크립트 경로를 적절히 수정해주면 된다.

@reboot /usr/bin/python3 /home/hooni/bootmail/bootmail.sh

참고로 gmail에서 SMTP로 gmail에 메일을 보내면 메일 포워딩이 되지 않는다.
불편하지만 필자는 메일 포워딩 없이 바로 메일을 받아 사용하고 있다.
언젠가 포워딩이 필요하게 된다면 글을 더 달아두려 한다.

댓글 남기기