Python Outlook 아웃룩 메일 보내기 예제

2020. 4. 10. 11:34Python/소스코드

728x90
반응형
    def mailContents(self):
        outlook = win32.Dispatch('outlook.application')
        mail = outlook.CreateItem(0)

        textTitle = self.title
        textMailTo = self.mailto
        textMailCC = self.mailcc
        textBody = self.textbody

        mail.Subject = textTitle
        mail.To = textMailTo
        mail.CC = textMailCC
        mail.GetInspector
        mail.HTMLBody = textBody + mail.HTMLBody
        mail.Display()​

회사 업무를 하다보니 매번 메일 보낼 때마다

아무렇치 않게 입력하던 오늘날짜 현재시간 이런 내용들을 수동으로 입력하고 있었다.

특히 업무 마무리 할 때? 보내는? 그런메일을 보낼 때가 있는데

금일 업무보고 _2019.01.20

약간 이런식....

그래서 Python 배우는 김에

만들어봤다..

실행 화면!

우선 가장 중요한 outlook을 사용하기위해 import를 해주고

시간과 날짜를 컨트롤하기 위한 datetime 및 time을 import 해준다.

from datetime import date
import datetime
import time
import win32com.client as win32


그 다음 메일에 들어갈 text들을 담을 사용자 정의 함수를 만든다.

제목 및 수신자는 텍스트로 넣고

내용 Body는 메일서명과 같이 넣어주기 위해서 html형식으로 내용을 만든다.

* 그냥 텍스트만 넣고 싶으면 텍스트형식으로 해도 된다.

ex) "안녕하세요. \n ㅎㅎㅎㅎㅎ"

그림이 포함 된 서명과 함께 텍스트를 쓰고싶다면 html형식으로!

코드를 다 작성한 다음 마지막에 딕셔너리 형식으로 값을 리턴 하도록 코드를 짠다.

 

def num_1():
    today = str(date.today().strftime("%Y.%m.%d"))
    texttitle = "메일제목(" + today + ")"   # 메일제목(2019.01.10)
    textMailTo = "받는사람"
    textMailCC = "참조"
    textBody = """
      <body>
        <p>안녕하세요...<br>
           <br>
           <br>
           <br>
           감사합니다. <br>
           홍길동 드림
        </p>
      </body>
    """
    _mailinfo = {'title': texttitle, 'mailTo': textMailTo, 'mailCC': textMailCC, 'htmlBody': textBody}
    return _mailinfo

들어갈 내용들을 정리 했으니 이제 아웃룩을 실제 기동하고 내용을 채우는 코드를 작성한다.

여러가지의 메일내용을 보내기 위해 Class를 만들어서 구현 했다.

 

class Outlook(object):
    def __init__(self,title, mailto, mailcc, textbody):
        self.title = title
        self.mailto = mailto
        self.mailcc = mailcc
        self.textbody = textbody

Class에다가 메일에 들어갈 제목, 받는 사람, 참조, 내용을 저장하기 위한

멤버변수들을 만들어 주고 저장을 한다.

그런 다음 멤버변수들을 Class 밖에서도 꺼내 쓸 수 있게 멤버메소드를 만든다.

   def getTitle(self):
        return self.title
    def getMailTo(self):
        return self.mailto
    def getMailCC(self):
        return self.mailcc
    def getBody(self):
        return self.textbody


이제 실제 메일 화면을 켜는 코드를 작성!

간단하게 설명 하면

outlook 객체를 만든다.

mail 이라는 객체에 outlook의 메일 아이템을 생성과 동시에 할당 한다.

그 다음 Class에 저장 되어있는 제목, 받는사람, 참조, 내용을 변수에 저장한다.

mail.Subject = 메일 제목에 들어갈 내용을 넣음.

mail.To = 받는 사람 텍스트를 넣음.

mail.cc = 참조를 넣음.

mail.GetInspector # 요건 정확히 뭔지 모르겠다... StacFlow에서 코드를 활용하는데 대부분 작성해서 넣음...

mail.HTMLBody = HTML형식의 Body 에 Text 내용을 넣어줌.

textBody(내용) + mail.HTMLBody(기존 서명데이터),

이렇게 쓰는 이유는 텍스트가 먼저 나오고 htmlbody의 내용을 밑으로 하기 위함.

mail.display 값을 다 넣었으니 실제 메일 화면을 Display 한다

   def mailContents(self):
        outlook = win32.Dispatch('outlook.application')
        mail = outlook.CreateItem(0)

        textTitle = self.title
        textMailTo = self.mailto
        textMailCC = self.mailcc
        textBody = self.textbody

        mail.Subject = textTitle
        mail.To = textMailTo
        mail.CC = textMailCC
        mail.GetInspector
        mail.HTMLBody = textBody + mail.HTMLBody
        mail.Display()

이제 사용자가 번호를 입력 하면 원하는 내용으로 메일을 쓰기 위해

메뉴 번호를 입력하도록 유도 한다.

a = Outlook 클래스 멤버변수에 값을 넣어 저장해야 하는데

아까 맨 위에서 적어둔 내용을 꺼내는 작업이다.

num_1() 이라는 사용자정의 함수에 리턴 값이 이런식으로 되어있으므로 texttitle, textMailto 요런 값으로

Class 멤버변수에 넣음!

{'title': texttitle, 'mailTo': textMailTo, 'mailCC': textMailCC, 'htmlBody': textBody}

아웃룩 Class에 아래 처럼 되어있으므로

    def __init__(self,title, mailto, mailcc, textbody):
        self.title = title
        self.mailto = mailto
        self.mailcc = mailcc
        self.textbody = textbody

아래의 변수에 값을 이런식으로 넣는다.

a = Outlook(num_1().get('title'), num_1().get('mailTo'), num_1().get('mailCC'), num_1().get('htmlBody'))

 

그 다음 실제 메일을 보내는 메소드 실행!

    def mailContents(self):
        outlook = win32.Dispatch('outlook.application')
        mail = outlook.CreateItem(0)

        textTitle = self.title
        textMailTo = self.mailto
        textMailCC = self.mailcc
        textBody = self.textbody

        mail.Subject = textTitle
        mail.To = textMailTo
        mail.CC = textMailCC
        mail.GetInspector
        mail.HTMLBody = textBody + mail.HTMLBody
        mail.Display()


실제 실행할 때는 이렇게 사용! 위에서 a = outlook() 을 사용했기 때문에 a가 outlook Class 인 것

a.mailContents()

그러면 메일 내용이 꽉채워진 화면을 볼 수 있을 것이다.

    num = int(input("실행 할 메뉴를 선택하세요."))
    if num == 1:
        print("1번을 선택했습니다.")
        # 메일
        print("실행 중... \n")
        a = Outlook(num_1().get('title'), num_1().get('mailTo'), num_1().get('mailCC'), num_1().get('htmlBody'))
        a.mailContents()
        print("실행 완료... \n")




<아래는 풀 소스코드>

from datetime import date
import datetime
import time
import win32com.client as win32

class Outlook(object):
    def __init__(self,title, mailto, mailcc, textbody):
        self.title = title
        self.mailto = mailto
        self.mailcc = mailcc
        self.textbody = textbody

    def getTitle(self):
        return self.title
    def getMailTo(self):
        return self.mailto
    def getMailCC(self):
        return self.mailcc
    def getBody(self):
        return self.textbody

    def mailContents(self):
        outlook = win32.Dispatch('outlook.application')
        mail = outlook.CreateItem(0)

        textTitle = self.title
        textMailTo = self.mailto
        textMailCC = self.mailcc
        textBody = self.textbody

        mail.Subject = textTitle
        mail.To = textMailTo
        mail.CC = textMailCC
        mail.GetInspector
        mail.HTMLBody = textBody + mail.HTMLBody
        mail.Display()

def num_1():
    today = str(date.today().strftime("%Y.%m.%d"))
    texttitle = "메일제목(" + today + ")"   # 메일제목(2019.01.10)
    textMailTo = "받는사람"
    textMailCC = "참조"
    textBody = """
      <body>
        <p>안녕하세요...<br>
           <br>
           <br>
           <br>
           감사합니다. <br>
           홍길동 드림
        </p>
      </body>
    """
    _mailinfo = {'title': texttitle, 'mailTo': textMailTo, 'mailCC': textMailCC, 'htmlBody': textBody}
    return _mailinfo
def num_2():
    today = str(date.today().strftime("%Y.%m.%d"))
    texttitle = "메일제목(" + today + ")"   # 메일제목(2019.01.10)
    textMailTo = "받는사람2"
    textMailCC = "참조"
    textBody = """
      <body>
        <p>안녕하세요...<br>
           <br>
           <br>
           <br>
           감사합니다. <br>
           홍길동 드림
        </p>
      </body>
    """
    _mailinfo = {'title': texttitle, 'mailTo': textMailTo, 'mailCC': textMailCC, 'htmlBody': textBody}
    return _mailinfo

menu = """
1. XX에게 메일 보내기

2. XX에게 메일 보내기

3. 미구현...

※ 메뉴 외 번호를 입력하면 
    프로그램이 종료 됩니다...
"""

while True:
    print(menu)
    num = int(input("실행 할 메뉴를 선택하세요."))
    if num == 1:
        print("1번을 선택했습니다.")
        # 메일
        print("실행 중... \n")
        a = Outlook(num_1().get('title'), num_1().get('mailTo'), num_1().get('mailCC'), num_1().get('htmlBody'))
        a.mailContents()
        print("실행 완료... \n")
    elif num == 2:
        print("2번을 선택했습니다.")
        print("실행 중... \n")
        # 메일
        a = Outlook(num_2().get('title'), num_2().get('mailTo'), num_2().get('mailCC'), num_2().get('htmlBody'))
        a.mailContents()
        print("실행 완료... \n")

    else:
        print("종료 합니다.")
        break

 

 

728x90
반응형