[파이썬(Python)]파이썬으로 메일 보내기 프로그램 만들기

728x90
반응형

파이썬으로 메일 보내기 프로그램 만들기

 

목차

    • 사전준비
    • 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'

    https://www.codelion.net/

     

    코드라이언 | 멋쟁이사자처럼

    멋쟁이사자처럼이 만든 온라인 코딩 교육 서비스 코드라이언!

    www.codelion.net

     

    728x90
    반응형