자아실현/파이썬

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

멧새소리 2022. 4. 29. 18:43

안녕하세요?

 

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

 

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

 

<참고> 파이썬으로 아웃룩 이메일 보내기 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