메일 발송 함수를 만들어, 다양한 자동화 프로그램에서 이용하기

* 참고로, 네이버 메일 발송 함수를 이해하면 Target을 구글 등으로 변경해서 이용하기 쉽고, 본인이 개발하거나 구상하는 여러 업무 자동화 프로젝트에 호출만 하면 되기에 활용도가 매우 높음.
'함수명 (변수로 수신받는자, 메일 제목, 메일 내용, 첨부파일)' 만 호출하면 됨
* 메일 발송은 실제 메일 서버를 구축해서 직접 발송하는게 아니라, 네이버에 메일을 보내주세요. 라고 요청하는 것입니다. 따라서 특정 규격(SMTP)에 만 맞게 설정하면 됩니다. 기본적으로 서버명, 포트(465), 이용자, 비밀번호 정도를 가지고 요청합니다. 포트 번호 등 확인이 원하시면, 네이버 메일에 접속하셔서 [네이버메일 > 환경 설정 > POP3/IMAP 설정 ] 화면에 서버명과 포트 정보를 확인하실 수 있습니다.

네이버 환경설정 > POP3/SMTP 설정 화면.

* 메일 발송은 2가지 타입을 만들어서 이용하는 것을 추천

  메일 제목 메일 내용 참조 숨은 참조 첨부파일 유무
간단 메일 발송 O O X X O
대량 메일 발송 O O O O O

* 첨부파일 유무에 따른 소스는 10줄 내외로 복잡하지 않으며, 메일 발송시에도 첨부파일이 없는 경우 함수 호출할 때 첨부파일명을 생략하면 기본값(False) 로 처리되어 추가 작업을 해줄 게 없다.
* 다만, 참조, 숨은 참조는 기능 등에 따라 구현이 필요 없을 수도 있다. CC(참조), TO(수신자)를 설정한 후 발송하면 TO, CC목록에 없는 이메일 주소는 BCC(숨은참조)가 되는 것이다.
* 다수에게 발송할 경우 기본적으로 TO, CC, BCC는 콤마(,)를 구분자로 하여 문자열로 던져주면, 규격에 맞게 함수에서 smtp요청시 배열로 변경하여 발송하고 있음.
아래의 샘플소스는 네이버메일, 비밀번호만 변경해서 저장한 후 바로 이용 가능하다.

# 간단 네이버 메일 발송(my_navermail.py)  #
from email.mime.text import MIMEText          # 여기서 부터
from email.mime.multipart import MIMEMultipart
from smtplib import SMTP_SSL
from email.mime.base import MIMEBase
from email import encoders                            # 여기까진 메일 발송을 위한 라이브러리

from os.path import basename                       # 파일 경로 확인 목적

SMTP_SERVER = "smtp.naver.com"             # 메일발송 요청서버
SMTP_PORT   = 465                                      # 공통
SMTP_USER   = "naverID@naver.com"        # 네이버 계정(메일)
SMTP_PASSWORD = "naver_password"      #비밀번호 기재로, 해당 파일 관리 잘 해야 함


def send_email(recvs, mail_title, contents, attachment=False) :
    msg = MIMEMultipart("alternative")            # 기본은 첨부파일이 없는 경우
    
    if attachment :                                             # 만약 첨부파일이 있다면,
        msg = MIMEMultipart('mixed')
        file_data = MIMEBase('application', 'octet-stream')        
        f = open(attachment, 'rb')
        file_contents = f.read()
        file_data.set_payload(file_contents)
        encoders.encode_base64(file_data)

        filename = basename( attachment )
        file_data.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', filename))
        msg.attach(file_data)

    msg['From'] = SMTP_USER
    msg['To']   = recvs
    msg['Subject'] = mail_title
     
    text=MIMEText(contents)
    msg.attach(text)

    smtp = SMTP_SSL(SMTP_SERVER, SMTP_PORT)
    smtp.login(SMTP_USER, SMTP_PASSWORD)
    smtp.sendmail(SMTP_USER, recvs.split(','), msg.as_string())
    smtp.close()

#호출은 다른 py파일에서 import하여 호출

from  my_navermail import send_email 
send_email('receiver@mail.com', '홍길동님, 메일이 왔습니다.', 'Welcome to Python')
send_email('receiver@mail.com', '홍길동님, 메일이 왔습니다.', 'Welcome to Python', 'auto.xlsx')

만약, 참조와 숨은 참조를 이용하려고 한다면, 위의 my_navermail.py 파일에 아래의 함수를 추가한다.

def send_email_with_cc(recvs, cc, hidden_cc, mail_title, contents, attachment=False) :
    msg = MIMEMultipart("alternative")

    if attachment :
        msg = MIMEMultipart('mixed')
        file_data = MIMEBase('application', 'octet-stream')
        f = open(attachment, 'rb')
        file_contents = f.read()
        file_data.set_payload(file_contents)
        encoders.encode_base64(file_data)

        filename = basename( attachment )
        file_data.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', filename))
        msg.attach(file_data)

    msg['From'] = SMTP_USER
    msg['To']   = recvs    
    msg['CC'] = cc
    msg['Subject'] = mail_title
    targets = ','.join((recvs, cc, hidden_cc))
     
    text=MIMEText(contents)
    msg.attach(text)

    smtp = SMTP_SSL(SMTP_SERVER, SMTP_PORT)
    smtp.login(SMTP_USER, SMTP_PASSWORD)
    smtp.sendmail(SMTP_USER, targets.split(','), msg.as_string())
    smtp.close()

#호출은 다른 py파일에서 import하여 호출하고, cc(참조)와 bcc(숨은참조)를 콤마(,) 로 구분하여 입력하여 발송.

from my_navermail import send_email, send_email_with_cc

send_email_with_cc('recv1@mail.com, recv2@mail.com', 'cc1@mail.com, cc2@mail.com', 'bcc1@mail.com', '홍길동님, 메일이 왔습니다.', 'Welcome to Python' )

send_email_with_cc('recv1@mail.com, recv2@mail.com', '', 'bcc1@mail.com', '홍길동님, 메일이 왔습니다.', 'Welcome to Python' )
send_email('recv1@mail.com, recv2@naver.com', '홍길동님, 메일이 왔습니다.', 'Welcome to Python' )
Posted by 목표를 가지고 달린다
,