파이썬으로 메일 보내기 프로그램 만들기
목차
- 사전준비
- SMTP로 메일 보내기
- MIME 형태로 메시지 만들기
이메일 보내는 프로그램 만들기
파이썬으로 이메일을 보내는 프로그램을 만들어보겠다.
사전 준비
1. gmail 계정이 필요하다.
gmail에서 IMAP 사용 설정: 사용을 '허가' 해줘야 한다.
우측 상단 톱니바퀴 -> 모든 설정 -> 전달 및 POP/IMAP : IMAP 액세스 허용
2. 메일 계정의 외부 접속에 대한 보안 설정
구글 계정 관리 -> 보안 -> 보안 수준이 낮은 앱의 액세스 허용
SMTP로 메일 보내기
SMTP: 간단하게 메일을 보내기 위한 약속
▷SMTP 서버를 이용해서 우리가 원하는 곳으로 메일을 보낼 수 있다.
SMTP 서버도 주소를 가지고 있다. 메일을 보낼 서버의 주소와 포트를 지정해야 한다.
Address: smtp.gmail.com
Port: 465
▷ smtp.gmail.com이라는 주소의 465번 문을 통해 접근한다.
[SMTP 서버로 메일 보내기]
1. SMTP 메일 서버를 연결한다.
2. SMTP 메일 서버에 로그인한다.
3. SMTP 메일 서버로 메일을 보낸다.
1. SMTP 메일 서버를 연결한다.
smtplib라는 라이브러리를 사용해야 한다.
import smtplib # 파이썬에 내장되어 있는 라이브러리
메일 서버를 변경하는 작업
- SMTP()함수: 서버에 연결해주는 함수
- smtplib.SMTP_SSL(서버주소, 서버포트)
SMTP는 보안문제 때문에 SSL이라는 암호화 방식을 요구한다.
그러나 그냥 SMTP함수는 SSL 암호화 방식을 포함하지 않기 때문에 에러가 발생한다.
따라서 SSL 암호화 방식이 포함된 SMTP_SSL() 함수를 이용해야 한다.
import smtplib
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465
smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
print(smtp)
2. SMTP 메일 서버에 로그인한다.
smtp.login("###@gmail.com", "비밀번호")
3. SMTP 메일 서버로 메일을 보낸다.
- smtp.send_message(): 메일을 보내주는 함수
- smtp.quit()
MIME 형태로 이메일 메시지 만들기
MIME 형태를 띄어야 SMTP가 메시지 내용을 이해할 수 있다.
1. 이메일을 만든다. (MIME형태를 통해 보낼 메시지를 만들어야 한다.)
그러기 위해서는 먼저 email.message 모듈에 있는 EmailMessage를 임포트해와야 한다.
2. 이메일에 내용을 담는다.
set_content("이메일에 들어갈 내용")
import smtplib
from email.message import EmailMessage
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465
message = EmailMessage()
message.set_content("코드라이언 수업중입니다.")
smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
smtp.login("###@gmail.com","######")
smtp.send_message()
smtp.quit()
3. 발신자, 수신자를 설정한다.
MIME 형식에는 Header가 있는데,
Header에는 Subject, From, To 항목이 있는데, 다음과 같이 제목, 발신자, 수신자를 설정해야 한다.
message["Subject"] = "이것은 제목입니다."
message["From"] = "###@gmail.com"
message["To"] = "###@gmail.com"
이메일 보내기
이메일을 보내려면 send_message(보낼메시지) 함수를 쓰면 된다.
smtp에 있는 send_message에 보낼 메시지를 담아서 다음과 같이 쓰면 된다.
smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
smtp.login("###@gmail.com","######")
smtp.send_message(message)
smtp.quit()
이메일에 사진 첨부하기
open() 함수 이용 → 이미지 파일 열기. 옵션: rb, wb, ab 중 하나
이름 | 설명 |
rb | read binary |
wb | write binary |
ab | append binary |
다음 코드는 안전하게 파일을 열고 닫는 방법으로, close를 해주지 않아도 자동으로 닫아준다.
with open("codelion.png","rb") as image:
image_file = image.read()
attachment() 함수의 매개변수로 다음의 3가지를 넣어줘야 한다.
1. image
2. maintype
3. subtype: 확장자
- add.attachment(읽어온 이미지파일, maintype='image', subtype='png')
- imghdr: 이미지 확장자를 판단해주는 역할을 하는 모듈
import smtplib
from email.message import EmailMessage
import imghdr
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465
message = EmailMessage()
message.set_content("코드라이언 수업중입니다.")
message["Subject"] = "이것은 제목입니다."
message["From"] = "###@gmail.com"
message["To"] = "###@gmail.com"
with open("codelion.png","rb") as image:
image_file = image.read()
image_type = imghdr.what('codelion',image_file)
message.add_attachment(image_file,maintype='image',subtype=image_type)
# smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
# smtp.login("###@gmail.com","######")
# smtp.send_message(message)
# smtp.quit()
유효성 검사하기
정규표현식: 유효성을 체크하기 위한 조건식
^: 정규표현식의 시작
$: 정규표현식의 끝
^[a-zA-Z0-0.+_0]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$
a부터 z까지, A부터 Z까지, 0부터 9까지, ., +, _, -
가 1회 이상 반복된다.
[a-zA-Z0-9]: a부터 z까지, A부터 Z까지, 0부터 9까지
가 1회 이상 반복된다.
\.: 그 뒤에 .이 붙는다. (일반 .을 의미)
[a-zA-Z]: a부터 z까지, A부터 Z까지
가 최소 2회, 최대 3번 반복된다.
파이썬에서 정규표현식을 사용하기 위해서는 re 라는 모듈을 임포트해줘야 한다.
import re
re.match(정규표현식, 검사할 문자열)을 통해 유효성을 검사한다.
마무리
sendEmail(addr) 함수 정의
: 입력한 이메일 형식이 유효한지 정규표현식을 통해 유효성 검사를 한 후, 이메일을 제대로 입력했으면 이메일을 보내고, 그렇지 않으면 유효한 이메일 주소가 아니라는 메시지를 출력하고 이메일을 보내지 않는다.
import smtplib
from email.message import EmailMessage
import imghdr
import re
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465
def sendEmail(addr):
reg = "^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$"
if bool(re.match(reg,addr)):
smtp.send_message(message)
print("정상적으로 메일이 발송되었습니다.")
else:
print("유효한 이메일 주소가 아닙니다.")
message = EmailMessage()
message.set_content("코드라이언 수업중입니다.")
message["Subject"] = "이것은 제목입니다."
message["From"] = "###@gmail.com"
message["To"] = "###@gmail.com"
with open("codelion.png","rb") as image:
image_file = image.read()
image_type = imghdr.what('codelion',image_file)
message.add_attachment(image_file,maintype='image',subtype=image_type)
smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
smtp.login("###@gmail.com","######")
# 메일을 보내는 sendEmail 함수를 호출해서 실행해보기
sendEmail("###gmailcom")
smtp.quit()
참고)
코드라이언: '[심화] 같이 푸는 PYTHON'
코드라이언 | 멋쟁이사자처럼
멋쟁이사자처럼이 만든 온라인 코딩 교육 서비스 코드라이언!
www.codelion.net