라즈베리 파이가 부팅할 때 사용자에게 G메일로 IP 주소 보내기 (rc.local + smtplib + Gmail)

라즈베리 파이를 부팅하면 자동으로 프로그램을 시작하거나 IP 주소 등을 알려 준다면 편할 것이다. 이 포스트에서는 라즈베리 파이의 rc.local 파일을 수정하여 자동으로 IP 주소를 사용자에게 이메일 해주는 방법을 살펴 본다. 이 예제를 사용하려면 구글 계정이 있어야 한다.

1. 이메일 보내는 파이썬 스크립트 작성하기

먼저, 이메일을 보내는 파이썬 스크립트를 작성하고 실험해 본다. 이메일을 보내기 위해서는 파이썬 2.7 이상에 기본으로 설치되어 있는 smtplib를 사용한다.

# -*- coding: utf-8 -*-

import subprocess

def sendAutostartMail():
    import smtplib
    import string
    USER = '구글 계정 id'              #사용자의 계정으로 수정한다. 가령, 'someone@gmail.com'
    PASS = '구글 계정 pw'              #사용자의 계정으로 수정한다. 가령, '12341234'                       
    TO = '메일 수신자의 이메일 계정'    #수신자의 이메일을 기입한다. 가령, 'someone@daum.net'
    SUBJECT = '[RPi2] Autostart Mail' #메일 제목. 필요하다면 수정한다.
    # 메일 본문. 필요하다면 수정한다.
    ip = subprocess.check_output("hostname -I", shell = True)
    TEXT = 'Autostart 메일입니다.\nRPi2의 IP 주소는 다음과 같습니다.\n%s' %ip
    print TEXT
    FROM = USER
    HOST = 'smtp.gmail.com:587'       
    BODY = string.join((
        'From: %s' %FROM,
        'To: %s' %TO,
        'Subject: %s' %SUBJECT ,
        '\r\n',
        TEXT,
        ), '\r\n')
    
    server = smtplib.SMTP(HOST)
    server.starttls()
    server.login(USER, PASS)
    server.sendmail(FROM, TO, BODY)
    server.quit()
    
    print '%s에게 메일을 발송하였습니다.' %TO
  
if __name__ == "__main__": 
    sendAutostartMail()

스크립트를 /home/pi/startmail.py로 저장한다. 단, 인코딩은 utf-8로 설정하거나 모든 한글 주석을 지운다.

아래와 같이 스크립트를 실행하고 이메일이 수신되는지 확인한다.

$ python /home/pi/startmail.py

2. 부팅할 때 자동 실행되도록 rc.local 수정하기

나노 편집기로 rc.local 파일을 연다.

$ sudo nano /etc/rc.local

rc.local 파일을 다음과 같이 수정한다.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

# 실행하고자 하는 프로그램, 프로그램의 파일, 매개변수 입력
python /home/pi/startmail.py &

exit 0

맨 뒤의 &는 백그라운드에서 프로그램을 실행하라는 의미이다.

이제 스크립트 작성은 끝났다. 재부팅하기 전에 다음과 같이 rc.local을 실행하고 이전과 마찬가지로 이메일이 수신되는지 확인한다.
비밀번호를 입력하라고 나오면 사용자 pi의 비밀번호를 입력한다.

$ /etc/rc.local

정상적으로 이메일 수신을 확인했다면 재부팅한다. 라즈베리 파이로부터 IP 주소를 이메일로 받아 볼 수 있을 것이다.

라즈베리 파이가 부팅할 때 사용자에게 G메일로 IP 주소 보내기 (rc.local + smtplib + Gmail)”에 대한 9개의 생각

  1. 휴빅

    위의 1번을 똑같이 따라해봤는데요…
    실행시키면 에러는 나지 않는데 메일이 오질 않네요.. 뭐가 문제일까요
    로그가 따로 남는것도 없어서 알 수가 없네요;ㅁ;

    좋아요

    응답
    1. HWANG Joosun 글의 글쓴이

      만약 “모든 것이 똑같다”면 정상적으로 작동을 해야 겠지만
      현재 작동을 하지 않는다고 하시니
      아마도 어디엔가, 어떤 차이가 있지 않을까…라고 추측할 수 있겠습니다.

      안타깝게도 말씀해주신 내용에는 제가 참고 할 수 있는 정보가 충분하지 않아
      저도 그 차이가 무엇인지 파악하기 어렵네요.
      어떤 차이가 있는지 하나하나 직접 확인해 보실 수 밖에 없을 것 같습니다.

      참고로, 제 라즈베리 파이는 여전히 위의 설정으로 잘 작동하고 있습니다.

      좋아요

      응답
  2. 휴빅

    안녕하세요 이글을 보실진 모르겠지만…
    1번까지 셋팅하고 메일을 보내보는데 메일이 안오네요;
    한참을 기다려봐도 안오는데 뭐가 문제일까요;?

    좋아요

    응답
  3. park

    지금 댓글을 달아도 보실지 모르겠지만 질문 드려도 괜찮을까요?
    메일이 처음에 오긴왔는데 로그인시도가 차단되었다고 메일이 오네요…
    이럴땐 어찌해야하는지 알 수 있을까요..?

    좋아요

    응답
    1. HWANG Joosun 글의 글쓴이

      에러 메시지의 내용을 알 수 없어서 답이 될지 모르겠습니다.
      만약 g메일이 오기는 오되, g메일의 내용이 로그인 시도가 차단되었다는 내용이라면 메일을 보내는 g메일 계정으로 로그인 해보세요. 경우에 따라서는 라즈베리 파이가 발송하는 메일을 g메일 서비스가 차단하는 경우도 있으니, 만약 그렇다면 메일 계정에 로그인해서 문제를 해결할 수 있을 겁니다.

      좋아요

      응답
  4. 전원 분리 후 다시 켜면 메일이 제대로 오네요.. 근데 sudo reboot명령으로 재부팅하면 위와 같이 오류가 나는 현상은 왜일까요^^;; 너무나 친절한 포스트에 감사합니다. subprocess에 불러올 수 있는 다양한 것들이 있을 것 같은데 찾아봐야겠습니당.

    Liked by 1명

    응답
  5. $ /etc/rc.local 까지 완료해서, 이메일 수신 했는데.. 재부팅하면 이메일 수신이 안되네요, 혹시 어떤 문제일까요? 에러는 다 적진 못하겠고, Traceback: 하고 나와있는걸 보면
    smtplib.py에서
    (code,msg) = self.connect(host, port),
    self.sock = self._get_socket(host, port, self.timeout),
    return socket.create_connection((port, host),timeout),
    for res in getaddrinfo(host, port, 0, SOCK_STREAM): socket.gaierror: [Errno -2] Name or service not known 으로 나오네요..
    그냥 python ~~~.py 실행하거나 rc.local 실행하면 이메일 수신은 다 되는데 말이죠.. ㅠㅠ
    도움 부탁드립니다.

    좋아요

    응답
    1. HWANG Joosun 글의 글쓴이

      홍 님의 파이는 위의 1단계(/home/pi/startmail.py 파일을 실행하여 이메일 보내기)에서는 정상적으로 메일을 전송할 수 있고, 2단계에서 /etc/rc.local을 편집-저장한 후에 터미널에서 $ /etc/rc.local을 실행했을 때도, 그리고 파이의 전원을 껐다가 다시 인가를 했을 때도 정상적으로 이메일을 전송할 수 있는 상황으로 이해했습니다. 하지만 유독 reboot 했을 경우에는 에러가 발생하여 이메일을 전송하지 못하는 상황으로 이해했습니다.

      결론적으로 말씀드리면, 제가 유사한 문제를 경험하지 못했기 때문에 올려주신 정보 만으로는 관련된 문제에 대한 해결 방법 제시해 드리기 어려운 상황입니다. 다만, 다음 사항은 확인해 보시기 바랍니다.

      1. 부팅/재부팅 했을 때 모두 rc.local 파일이 실행되고 ip 주소가 부여되는지 확인

      먼저, 부팅했을 때와 재부팅 했을 때 rc.local 파일이 각각 정상적으로 실행되는지, 그리고 ip 주소도 잘 받고 있는지 확인할 필요가 있습니다. 이를 확인하기 위해서는 라즈베리 파이를 모니터와 연결하고 파이를 부팅/재부팅 하기 바랍니다.
      rc.local 파일이 정상적으로 실행되고 ip 주소가 정상적으로 부여된다면, ‘…login’ 프롬프트 위(약 3줄)에 “My IP address is…”라는 문구가 모니터에 출력될 겁니다. 이 문구가 출력되지 않는다면 rc.local 파일이 실행되지 않거나 ip 주소를 할당받지 못한다고 볼 수 있습니다. 이는 rc.local 파일의 마지막 주석 다음 행에 sleep 30이라는 표현을 추가하여 해결할 수도 있습니다.

      2. 인터넷 접속 상태 확인

      제가 사용하는 라즈베리 파이(구형 및 신형 모델 B, 유선랜 사용)의 경우 재부팅 및 시스템 종료 후 부팅 할 때 모두 정상적으로 이메일을 전송하기에, 보드나 라즈비안의 버전, 파이썬 스크립트 또는 rc.local 파일의 문제는 아닌 것 같습니다. 또한 강의실(WiFi 사용)에서도 지금의 문제는 발생하지 않았었기에 유무선 인터넷의 영향을 직접적으로 받는 것 같지도 않습니다.
      다만, 몇몇 자료를 검색해보니 인터넷 접속 상태의 불안정성 문제를 언급하는 게시글들이 보이기도 하니 확인해 보시면 좋을 것 같습니다.

      3. 호스트네임을 raspberrypi로 수정

      이 게시물과는 직접적인 관계가 없습니다만, 호스트네임을 raspberrypi로 수정하고 다시 테스트해 보시기 바랍니다. 호스트네임은 sudo raspi-config에서 수정할 수 있습니다.

      문제 해결에 도움이 되어드리지 못해 유감입니다.

      좋아요

      응답
      1. 친절한 댓글 감사합니다.

        1, 2, 3번을 참조하여 본 결과,
        무선인터넷 설정 전에 부팅이 끝나는 것 때문에, IP주소 할당이 안되거나 인터넷 연결이 안되어 생기는 현상이 아닐까 혼자 결론을 내려보았고…(My IP address is .. 이후 아이피가 나오지 않고 error발생)
        1번에 말씀해주신 대로, sleep 30 을 추가하니, 재부팅 혹은 부팅 등에 모두 이메일 전송 성공합니다. 감사합니다!

        좋아요

댓글 남기기