[Python] 아웃룩 이메일 본문에 이미지 넣기

안녕하세요?

 

 파이썬으로 아웃룩 이메일을 보낼 때, 이메일 본문에 이미지를 넣고 싶은 경우가 있습니다. 파일로 첨부하는 방법 말고요. 이번 게시물에서는 아래와 같이 본문에 이미지를 삽입하는 법을 알아보겠습니다.

 

아웃룩 본문에 이미지를 삽입해보자

 

<참고> 파이썬으로 아웃룩 이메일 보내기 https://kminito.tistory.com/42

 

방법

이미지 데이터를 Base64로 인코딩하고, data URI scheme 을 이용하여 img 태그로 바로 작성합니다.

<img src="data:image/png;base64,이미지데이터"/>

 

코드가 간단하므로 코드와 함께 설명하겠습니다.

 

코드1 - 이미지 준비

import io
import base64
from PIL import Image

# 이미지 파일을 엽니다.
img = Image.open("img.jpg")

# 스트림에 이미지 데이터를 저장합니다.
bytearr = io.BytesIO()
img.save(bytearr, format="JPEG")

# 이미지 바이너리를 읽고 base64로 인코딩합니다.
imgbytearr = bytearr.getvalue()
encoded_image = base64.b64encode(imgbytearr).decode("utf-8")

# 이메일에 첨부하기 위해 img 태그에 이미지 데이터를 넣습니다.
image_for_body = f'<img src="data:image/png;base64,{encoded_image}"/>'

위의 코드에서 만들어진 image_for_body 를 이메일 본문에 추가하면 됩니다.

 

코드2 - 메일 보내기

# -*- coding: utf-8 -*-
import win32com.client

def send_mail(to,subject,content, atch=[]):
    new_Mail = win32com.client.Dispatch("Outlook.Application").CreateItem(0)
    new_Mail.To = to
    new_Mail.Subject = subject
    new_Mail.HTMLBody = content
    if atch:
        for file in atch:
            new_Mail.Attachments.Add(file)
    new_Mail.Send()
    
send_mail("받는 사람 메일 주소", "subject", image_for_body)

 

 

코드1+코드2를 합쳐서 실행하면 아래와 같은 결과 메일을 받을 수 있습니다.

 

전체 코드

# -*- coding: utf-8 -*-
import io
import base64
from PIL import Image
import win32com.client


def send_mail(to,subject,content, atch=[]):
    new_Mail = win32com.client.Dispatch("Outlook.Application").CreateItem(0)
    new_Mail.To = to
    new_Mail.Subject = subject
    new_Mail.HTMLBody = content
    if atch:
        for file in atch:
            new_Mail.Attachments.Add(file)
    new_Mail.Send()

img = Image.open("img.jpg") # 이미지 Open
bytearr = io.BytesIO()
img.save(bytearr, format="JPEG")

imgbytearr = bytearr.getvalue()
encoded_image = base64.b64encode(imgbytearr).decode("utf-8")
image_for_body = f'<img src="data:image/png;base64,{encoded_image}"/>'

contents = "이메일 내용입니다 <br>"
contents += image_for_body # 이미지 추가

send_mail("받는 사람 메일 주소", "subject", contents)

 

전체 코드 실행 결과

 

참고 사항 

PIL로 이미지를 다루던 경우 굳이 파일로 저장하고 다시 불러올 필요는 없습니다.

 

 아래는 참고용으로, PDF 파일을 이미지로 변환(pdf2image 사용) 후, 이미지의 특정 영역을 이메일에 추가하는 코드입니다. pdf2image는 이미지로 변환할 때 PIL의 Image객체를 반환하므로 굳이 파일을 저장할 필요가 없이, 바로 바이트 스트림에 전달한 후 Base64 인코딩이 가능합니다.

 

 

예시 코드 

            pages = convert_from_path(file_path) # PDF를 이미지로 변환
            area = (59,1700,1500,2136) # 이미지를 잘라낼 영역 설정
            crop_img = pages[0].crop(area) # 이미지를 잘라냄
            
            # 이후 코드 동일
            bytearr = io.BytesIO()
            crop_img.save(bytearr, format="JPEG")
            imgbytearr = bytearr.getvalue()
            encoded_image = base64.b64encode(imgbytearr).decode("utf-8")
            image_for_body = f'<img src="data:image/png;base64,{encoded_image}"/>'

 

 

 

<참고>

위키피디아 data URI scheme https://en.wikipedia.org/wiki/Data_URI_scheme

댓글

Designed by JB FACTORY