이번 간단하고 재미있는 라즈베리 파이 프로젝트에서는 지메일(Gmail) 이메일 알림 표시등을 만드는 방법을 알아보겠습니다. 읽지 않은 메일이 도착해 있으면 파이썬 스크립트가 자동으로 LED를 켜주는 원리입니다. 필요한 부품도 거의 없고, 1시간 안에 완성할 수 있을 만큼 부담 없는 프로젝트입니다.
LED를 마인크래프트 레드스톤 블록처럼 꾸미거나, 투명 필라멘트로 3D 프린팅한 오브제 안에 넣는 등 원하는 대로 감성적으로 연출할 수도 있습니다. 완성된 모습은 아래와 같습니다.
준비물
- 라즈베리 파이 1대
- 브레드보드 1개
- 220옴 저항 1개
- 5mm LED 1개
- 지메일 계정 1개
- 암-수 점퍼 와이어(연결선)
이 프로젝트에는 어떤 라즈베리 파이든 사용할 수 있습니다. Pi Zero도 예외가 아닙니다! GPIO 핀 하나만 필요하고 CPU 부하도 거의 없기 때문입니다. 파이 스타터 키트를 갖고 계시다면 이미 충분한 부품을 갖추고 있는 셈입니다.
제작 계획

구조는 아주 단순합니다. LED(발광 다이오드)를 파이의 GPIO(범용 입출력) 핀에 연결하고, 간단한 파이썬 스크립트가 주기적으로 실행되며 읽지 않은 메일을 확인한 뒤, 그 결과에 따라 LED를 켜거나 끄는 방식입니다.
하드웨어 연결

LED의 양극(anode, 긴 다리)을 저항에 연결한 뒤 GPIO 14번 핀에 연결합니다. 어떤 GPIO 핀을 사용해도 무방하지만, 모델마다 핀 배치가 조금씩 다르므로 반드시 먼저 핀아웃(pinout) 다이어그램을 확인하세요. 음극(cathode, 짧은 다리이며 한쪽 면이 평평한 쪽)은 GND(그라운드)에 연결합니다.
라즈베리 파이 설정

파이에 운영체제(OS)가 설치되어 있다면 추가 설정은 많지 않습니다. 파이에서 새 터미널을 엽니다(왼쪽 상단 > 메뉴 > 보조프로그램 > 터미널). 먼저 파이썬 스크립트를 저장할 새 폴더를 만들어야 합니다. 다음 명령어를 입력해 보세요.
pwdpwd는 "Print Working Directory"의 약자로, 현재 위치한 폴더를 보여줍니다(기본값은 "/home/pi"). 이제 Documents 폴더로 이동해 "gmail_python"이라는 새 디렉터리(폴더)를 생성합니다.
cd Documents/
sudo mkdir gmail_pythonmkdir은 "Make Directory"의 줄임말로, 뒤에 입력한 이름으로 폴더를 만들어 줍니다. 폴더가 잘 생성되었는지 확인해 보겠습니다.
ls혹시 실수해서 삭제해야 한다면 아래 명령어로 간단히 제거할 수 있습니다.
sudo rm -r gmail_python이제 새로 만든 디렉터리로 이동합니다.
cd gmail_python/새 파이썬 스크립트 파일을 생성합니다.
sudo nano check_messages.py이 명령은 스크립트를 생성하고 나노(Nano) 편집기로 열어 줍니다. Vim 같은 다른 편집기를 써도 되지만, 편집기 선택을 두고 개발자들이 벌이는 논쟁이 얼마나 뜨거운지는 유명한 이야기죠. 편집기를 종료하고 터미널로 돌아가려면 CTRL + X를 누르면 됩니다.
파이썬 설정

파이 설정이 끝났으니 이제 코드를 작성할 차례입니다. 이 프로젝트에는 Charlie Guo가 만든 Gmail 파이썬 라이브러리가 필요합니다. GitHub에서 라이브러리를 다운로드해 압축을 해제하면 그 안에 "gmail"이라는 폴더가 있습니다. 이 폴더 전체를 "/home/pi/Documents/gmail_python" 경로로 복사합니다.
다시 명령줄로 돌아가 스크립트를 엽니다(위쪽 화살표 키를 누르면 이전에 입력했던 명령어를 불러올 수 있습니다).
sudo nano check_messages.py파일을 생성할 때와 동일한 명령어입니다. 파일이 이미 존재하면 열어 주고, 없으면 새로 생성합니다. 이제 파이썬 코드를 입력합니다.
import gmail, RPi.GPIO as GPIO, time # import modules
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.OUT) # tell the Pi this pin is an output
g = gmail.login('YOUREMAIL@gmail.com', 'YOUR PASSWORD')
unread_messages = g.inbox().mail(unread=True)
total_messages = 0
for message in unread_messages:
total_messages += 1
if total_messages > 0:
# there are unread emails, turn light on
GPIO.output(14, True)
else:
# there are no unread emails, turn light off
GPIO.output(14, False)정상적으로 작동하려면 본인의 지메일 주소와 비밀번호를 입력해야 합니다. 참고로 구글은 보안 정책 강화로 일반 비밀번호 로그인을 제한하고 있으므로, 앱 비밀번호(App Password)를 발급받아 사용하는 것이 좋습니다. 2단계 인증을 사용 중이거나 일반 로그인이 불편하다면 OAuth2 방식으로 Gmail에 연결해야 하는데, 이 글의 범위를 넘어서므로 Google이 제공하는 공식 시작 가이드를 참고하시기 바랍니다.
코드 살펴보기
먼저 몇 가지 모듈을 임포트합니다. 파이썬에서 모듈은 특정 목적을 위해 작성된 작은 코드 묶음입니다(Arduino IDE의 라이브러리와 비슷한 개념). RPi.GPIO는 GPIO에 접근하기 위한 파이 전용 모듈, gmail은 앞서 다운로드한 모듈, time은 타이밍 기능을 제공하는 파이썬 내장 모듈입니다. 이어서 GPIO.setmode와 GPIO.setup로 14번 핀을 출력 핀으로 사용하겠다고 선언하고, "Broadcom 핀 번호 체계(BCM)"를 사용하도록 지정합니다.
다음 줄은 지메일 계정에 로그인하는 부분입니다. "g"라는 객체를 만들고, 임포트한 gmail 모듈의 login 메서드를 호출합니다. 이메일 주소와 비밀번호 입력을 잊지 마세요.
g = gmail.login('YOUREMAIL@gmail.com', 'YOUR PASSWORD')이제 읽지 않은 메시지를 모두 가져와 "unread_messages" 변수에 저장합니다.
unread_messages = g.inbox().mail(unread=True)unread=True가 매개변수로 전달되는 점에 주목하세요. 이 값을 발신자나 제목 등 다른 조건으로 바꾸면 원하는 기준으로 메일을 검색할 수 있습니다. 자세한 내용은 API 문서를 참고하세요.
다음은 for 루프로 모든 메시지를 하나씩 순회합니다.
for message in unread_messages:
total_messages += 1for 루프는 코드 블록을 여러 번 반복 실행할 때 매우 유용합니다. 이 루프는 읽지 않은 메시지 목록을 하나씩 돌면서 "total_messages" 변수의 값을 증가시켜, 결국 읽지 않은 메일의 총 개수를 세는 역할을 합니다.
마지막으로 간단한 if 문으로 처리합니다. 읽지 않은 메일이 있으면 LED를 켜고, 없으면 끕니다.
파이썬은 대소문자를 구분하고 들여쓰기(공백)에 민감하다는 점을 기억하세요. 코드가 실행되지 않는다면 온라인 파이썬 검증 도구에 코드를 붙여넣고 오류를 확인해 보는 것도 좋은 방법입니다.
터미널로 돌아가 스크립트를 실행합니다.
python check_messages.py받은편지함에서 몇 통의 메일을 수동으로 "읽지 않음" 상태로 바꾼 뒤 스크립트를 다시 실행해 보세요. 받은편지함 상태에 따라 LED가 켜지고 꺼지는 것을 확인할 수 있습니다.
크론(Cron)으로 자동화하기
스크립트가 정상 작동하니 이제 자동화할 차례입니다. 가장 손쉬운 방법은 cron 작업을 활용하는 것입니다. Cron은 자동 백업처럼 작업과 스크립트를 주기적으로 예약 실행하는 리눅스 스케줄러입니다. Crontab(예약 작업 목록)을 열어 보겠습니다.
crontab -e예약된 작업이 아직 없다면 파일이 비어 있을 것입니다(#로 시작하는 설명 주석만 있을 수 있습니다). 기존 항목이 있다면 새 줄에 아래 명령어를 추가하기만 하면 됩니다.
* * * * * python ~/pi/Documents/gmail_python/check_messages.py다섯 개의 별표("* * * * *")는 작업 실행 주기를 지정하는 부분으로, 원한다면 "매월 둘째 주 수요일 오후 2시"처럼 정교하게 설정할 수도 있습니다. 위의 다섯 개 별표는 매분 실행하라는 의미로, cron에서 허용되는 가장 짧은 간격입니다. 그다음 "python"은 해당 파일을 파이썬 스크립트로 실행하라고 스케줄러에 알려주고, 마지막 "~/pi/Documents/gmail_python/check_messages.py"는 스크립트의 절대 경로입니다. 상대 경로로는 작동하지 않으니 반드시 절대 경로를 사용하세요.
마무리하며
이제 여러분만의 지메일 알림 표시등이 완성되었습니다! 필터 조건을 바꿔 특정 발신자의 메일만 알림을 받도록 수정하거나, LED 대신 완전히 다른 코드를 실행하도록 확장하는 것도 어렵지 않습니다. 예를 들어 이메일 내용을 기반으로 트윗하는 트위터 봇을 만들어 보는 것도 재미있는 응용이 될 수 있습니다.
알림 상자를 어떻게 완성하셨는지, 댓글로 여러분의 결과물을 들려주세요!