[Python] 파이썬으로 IP주소 확인해서 메일 보내기

서울로 이사오고 나서 인터넷을 새로 가입했다.
일주일 동안 한쪽에 치워두었던 라즈베리 파이를 연결했는데, 회사에 유선 마우스, 키보드를 가져다 놓은 바람에 접속을 못하는 불상사가 발생했다.

SSH포트가 열려있어서 IP만 알면 ssh key로 로그인할 수 있게 설정해두었는데, 모뎀에 연결된 라즈베리파이의 아이피를 키보드없이 도저히 확인할 방법이 없었다.

그래서 결국 오늘 퇴근할때 키보드를 들고와서 연결을 하고, 라즈베리파이 부팅시 자동으로 내 메일로 현재 IP주소를 보내는 코드를 작성했다.

인터넷에서 검색을 해봤는데 socket.gethostname 등의 메소드를 이용하면 현재 환경에 따라서 외부 아이피가 나올 수도 있고 안나올 수도 있었다.
그래서 찾아낸 방법이 소켓을 이용해 8.8.8.8(구글)로 연결하고 소켓이름을 가져오는 것이다.

import socket
import smtplib
import socket
from email.mime.text import MIMEText
from config import *

def send_email(who, msg):
	msg = MIMEText(msg)
	msg['Subject'] = MAIL_SUBJECT
	msg['To'] = who
	s.sendmail(MAIL_SENDER, who, msg.as_string())

if __name__ == '__main__':
  	#소켓을 이용해 IP를 찾는 코드
	s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	s.connect(("8.8.8.8", 80))
	ip = s.getsockname()[0]
	print(s.getsockname()[0])
	s.close()
    # 찾은 정보로 메일을 보내는 코드
	s = smtplib.SMTP_SSL('smtp.gmail.com', 465)
	s.login(MAIL_SENDER, MAIL_PASSWORD)
	send_email('메일을받을주소@mail.com', ip)
	s.quit()

위 코드는 비밀번호 정보가 분리된 코드이다.
config.py에서 MAIL_SENDER, MAIL_PASSWORD, MAIL_SUBJECT를 설정해주어야 한다.

또 한가지 구글 계정으로 smtp 를 이용하려면 앱 비밀번호를 따로 만들어서 사용해야한다.
앱 비밀번호는 16자리 문자로 구성된 비밀번호이며 이를 이용해서 구글 계정의 원래 비밀번호를 이용하지 않고 인증(로그인)할 수 있다.
2단계 인증을 필수로 해야 앱 비밀번호를 만들 수 있다.

MAIL_SENDER = " 메일 보내는 계정 주소 "
MAIL_PASSWORD = " 메일 보내는 계정의 앱 비밀번호 "
MAIL_SUBJECT = " 보내는 메일 제목 "

그리고 Five Ways to Run a Program On Your Raspberry Pi At Startup (dexterindustries.com) 를 참고해서 부팅시마다 해당 코드가 실행되도록 설정해주었다.

sudo nano /etc/rc.local 명령어를 이용해 rc.local 파일을 수정해주었다.
exit 0 코드 윗부분에
python 파일이있는 위치/send_ip.py
이렇게 설정해 주었더니 아주 잘 동작한다.