[Python] 아웃룩 이메일 본문에 이미지 넣기
- 자아실현/파이썬
- 2022. 4. 29.
안녕하세요?
파이썬으로 아웃룩 이메일을 보낼 때, 이메일 본문에 이미지를 넣고 싶은 경우가 있습니다. 파일로 첨부하는 방법 말고요. 이번 게시물에서는 아래와 같이 본문에 이미지를 삽입하는 법을 알아보겠습니다.
<참고> 파이썬으로 아웃룩 이메일 보내기 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