# %%
import os, copy
import smtplib
from string import Template
from email import encoders
from email.utils import formataddr
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
# %%
class EmailContent:
    _existAttachments = False
    _existImages = False
    attachments = None
    images = None

    # 이메일 구성
    def __init__(self, subject, images, attachments, template, template_args):
        self.msg = MIMEMultipart()
        
        # 이메일 제목
        self.msg['Subject'] = subject
        
        # 이메일 본문
        body  = template.safe_substitute(template_args)
        mime_body = MIMEText(body, 'html')
        self.msg.attach(mime_body)
        
        # 본문에 이미지 추가
        self._existImags = images is not None
        if self._existImags: 
            for image_cid in images:
                with open(images[image_cid], 'rb') as img_file:
                    mime_img = MIMEImage(img_file.read())
                    mime_img.add_header('Content-Disposition', 'attachment', filename=images[image_cid])
                    mime_img.add_header('Content-ID', '<' + image_cid + '>')
                self.msg.attach(mime_img)
        
        # 첨부파일 추가
        self._existAttachments = attachments is not None
        if self._existAttachments:            
            for attachment in attachments:                
                mime_att = MIMEBase('application', 'octect-stream')
                with open(attachment, 'rb') as att_file:                                        
                    mime_att.set_payload(att_file.read())
                    encoders.encode_base64(mime_att)
                    mime_att.add_header('Content-Disposition', 'attachment', filename=attachment)
                self.msg.attach(mime_att)

class EmailSender:
    # 세션 생성
    def __init__(self, str_host, num_port):
        self.str_host = str_host
        self.num_port = num_port
        self.session = smtplib.SMTP(host=str_host, port=num_port)
        self.session.starttls() 
        self.session.login('gmail 계정', '앱 비밀번호') 
    
    # 메일 보내기
    def send_message(self, emailContent, from_addr, to_addrs):      
        self.msg = emailContent.msg

        FROM_ADDR_FMT = formataddr( from_addr )
        #TO_ADDRS_FMT = ",".join([ formataddr( addr ) for addr in to_addrs ])

        self.msg['From'] = FROM_ADDR_FMT
        #self.msg['To']   = TO_ADDRS_FMT # 네이버메일에서 수신을 못 함. 이유는 모르겠음.
        self.msg['To']   = ",".join(to_addrs) # 수신자리스트 

        self.session.send_message(self.msg, from_addr=FROM_ADDR_FMT, to_addrs=to_addrs)
        del self.msg
# %%