엑셀 Send_Email 명령문 사용법 및 전체 명령문 :: 메일 보내기 자동화

아웃룩과 연동하여 메일 발송을 자동화하는 SEND_EMAIL 함수의 사용법 및 전체 명령문 동작원리를 알아봅니다.

작성자 :
오빠두엑셀
최종 수정일 : 2021. 10. 31. 18:16
URL 복사
메모 남기기 : (61)

엑셀 '메일 보내기' VBA 매크로 :: Send_Email 명령문 

설명

Send_Email 명령문은 엑셀 VBA의 Outlook 라이브러리를 참고합니다. 엑셀과 아웃룩을 연동하여 첨부파일, 예약발송, 표 붙여넣기 등의 다양한 부가기능으로 '엑셀 메일 보내기'를 자동화합니다.

Send_Email 명령문에 대한 자세한 설명은 퀵 VBA 7 강 - 메일 보내기 자동화 강의를 확인하세요.

엑셀 선택 범위를 VBA 코드에 사용하기 위한 HTML 형식 문장으로 변경하는 방법은 관련 포스트를 확인하세요.

패치노트
  • 2019년 11월 5일 :
    DeliveryTime 인수를 추가하였습니다. (예약발송 시간을 설정, 기본값 : 지금 보내기)
  • 2019년 12월 10일 :
    PasteAsImage 인수를 추가하였습니다. (그림형식으로 붙여넣기 여부를 결정, 기본값 : 표형식으로 붙여넣기)
  • 2020년 5월 28일 :
    InsertSignature 인수를 추가하였습니다. (True일 경우 메일 아래에 서명을 추가합니다.)

예제파일 다운로드

오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.

  • [VBA예제] Send_Email 메일 보내기 명령문
    예제파일

관련 강의
Send_Email 메일보내기 명령문 전체 코드
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ 명령문    : Send_Email
'▶ 설명      : 아웃룩과 연동하여 메일보내기를 자동화하는 모듈입니다.
'▶ 인수 설명
'_____________MailTo        : 받을 사람의 메일 주소입니다.
'_____________Subject       : 메일 제목입니다.
'_____________HTMLString    : HTML 형식의 메일 본문입니다.
'_____________PasteRng      : 메일에 붙여넣기 할 엑셀 범위입니다.
'_____________CCTo          : 참조 메일 주소입니다.
'_____________BCCTo         : 숨은참조 메일 주소입니다.
'_____________AttachFilePath    : 첨부파일 경로입니다. ("|"로 여러개의 파일을 구분합니다.)
'_____________PathDelimiter     : 여러개의 첨부파일을 구분할 구분자입니다.
'_____________DeliveryTime      : 예약발송할 날짜입니다. 기본값은 현재시간입니다.
'_____________ImmediateSend     : True 일 경우 메일 작성 후 검토 없이 바로 보냅니다.
'_____________PasteAsImage      : True 일 경우 이미지 형식으로 붙여넣기 합니다. False일 경우 표 형식으로 붙여넣기 합니다.
'_____________InsertSignature   : True 일 경우 서명을 삽입합니다.
'▶ 사용된 기타 사용자지정함수
'▶ 그외 참고사항
'######################################################################
 
Sub Send_Email(MailTo As String, _
                Subject As String, _
                HTMLString As String, _
                Optional PasteRng As Range = Nothing, _
                Optional CCTo As String = "", _
                Optional BCCTo As String = "", _
                Optional AttachFilePath As String = "", _
                Optional PathDelimiter As String = "|", _
                Optional DeliveryTime As Date, _
                Optional ImmediateSend As Boolean = False, _
                Optional PasteAsImage As Boolean = False, _
                Optional InsertSignature As Boolean = True)
 
Dim AppOutlook As Outlook.Application
Dim newEmail As Outlook.MailItem
Dim pageInspector As Outlook.Inspector
Dim pageEditor As Object
Dim varFilePath As Variant
Dim FileCount As Long
Dim i As Long
Dim wdPasteDefault As Variant
Dim wdPasteBitmap As Variant
Dim Signature As String
 
Set AppOutlook = New Outlook.Application
Set newEmail = AppOutlook.CreateItem(olMailItem)
 
If IsDate(DeliveryTime) = False Then
    MsgBox "올바른 예약발송 시간을 입력하세요."
    Exit Sub
End If
 
If AttachFilePath <> "" Then
        varFilePath = Split(AttachFilePath, PathDelimiter)
End If
 
With newEmail
    .To = MailTo
    .CC = CCTo
    .BCC = BCCTo
    .Subject = Subject
    If AttachFilePath <> "" Then
        For i = 1 To UBound(varFilePath) + 1
            .Attachments.Add varFilePath(i - 1), 1, i
        Next
    End If
 
    .Display
    If InsertSignature = True Then Signature = .HTMLBody
    .HTMLBody = HTMLString
 
    If DeliveryTime = 0 Then DeliveryTime = Now
    .DeferredDeliveryTime = DeliveryTime
 
    If Not PasteRng Is Nothing Then
        Set pageInspector = newEmail.GetInspector
        Set pageEditor = pageInspector.WordEditor
 
        PasteRng.Copy
        pageEditor.Application.Selection.Start = Len(.Body)
        If PasteAsImage = False Then
            pageEditor.Application.Selection.PasteAndFormat wdPasteDefault
        Else
            pageEditor.Application.Selection.InsertAfter vbNewLine
            pageEditor.Application.Selection.Start = Len(.Body)
            pageEditor.Application.Selection.PasteSpecial Placement:=1, DataType:=wdPasteBitmap
        End If
    End If
 
    .HTMLBody = .HTMLBody & Signature
 
    If ImmediateSend = True Then
        .Send
    End If
 
End With
 
Set pageEditor = Nothing
Set pageInspector = Nothing
Set newEmail = Nothing
Set AppOutlook = Nothing
 
End Sub

Send_Email 명령문 상세설명

사용예제
Send_Email MailTo:="test@oppadu.com", _
            Subject:="메일 테스트", _
            HTMLString:="안녕하세요? 테스트 발송용 메일입니다.", _
            PasteRng:=Sheet1.Range("A9:E15"), _
            DeliveryTime:="2019-12-25 08:00:00", _
            ImmediateSend:=False, _
            PasteAsImage:=False
메일 보내기 Send_Email 사용예제 gif_
Send_Email 명령문으로 엑셀 메일 보내기를 자동화합니다.
인수 설명

Send_Email 명령문에는 총 10개의 인수가 사용됩니다. 각 인수는 필요에 따라 변경해서 사용 가능합니다.

인수명 데이터구분 설명 기본값
MailTo String 받을 사람의 메일주소입니다.
Subject String 메일 제목입니다.
HTMLString String HTML 형식의 메일 본문입니다.
PasteRng
[선택인수]
Range 메일에 붙여넣기 할 범위입니다. Nothing
CCTo
[선택인수]
String 참조 메일입니다. ""
BCCTo
[선택인수]
String 숨은참조 메일입니다. ""
AttachFilePath
[선택인수]
String 첨부파일 파일 경로입니다. ""
PathDelimiter
[선택인수]
String 여러 개의 첨부파일이 있을 시, 파일 경로를 구분할 구분자입니다. "|"
DeliveryTime
[선택인수]
Date 예약발송 시간을 지정합니다. 0
ImmediateSend
[선택인수]
Boolean 작성한 메일을 검토없이 바로 보낼지 여부를 결정합니다. False
PasteAsImage
[선택인수]
Boolean True일 경우 그림형식으로 붙여넣기 합니다. False일 경우 표형식으로 붙여넣기 합니다. False
InsertSignature
[선택인수]
Boolean True일 경우 서명을 삽입합니다. True
변수 설명

본 명령문은 VBA의 Outlook 16.0 Object Library를 참조합니다. 따라서 명령문 작성 전, 반드시 '도구' - '참조' 에서 Microsoft Outlook 16.0 Object Library 를 활성화 합니다.

아웃룩 라이브러리 추가
VBA 편집기 '도구' - '참조' 에서 아웃룩 라이브러리를 활성화합니다.
변수명 데이터구분 설명
AppOutlook Outlook.Application 아웃룩 프로그램입니다.
newEmail Outlook.MailItem 새로 작성할 메일 항목입니다.
pageInspector Outlook.Inspector 워드에디터를 불러오기 위한 상위개체 입니다.
pageEditor Object 아웃룩 워드에디터입니다.
varFilePath Variant 첨부파일 파일경로를 나열한 배열입니다.
FileCount Long 첨부파일 개수입니다.
i Long For 반복문 연번입니다.
wdPasteDefault Variant 워드에디터에 붙여넣기 할 형식입니다. (기본값)
명령문 동작 원리
  1. 변수를 설정한 뒤, 개체 변수를 지정합니다. (Outlook 개체 변수 설정을 위해, '도구'-'참조' 에서 Outlook 라이브러리를 반드시 활성화합니다.)
    Dim AppOutlook As Outlook.Application
    Dim newEmail As Outlook.MailItem
    Dim pageInspector As Outlook.Inspector
    Dim pageEditor As Object
    Dim varFilePath As Variant
    Dim FileCount As Long
    Dim i As Long
    Dim wdPasteDefault As Variant
     
    Set AppOutlook = New Outlook.Application
    Set newEmail = AppOutlook.CreateItem(olMailItem)
  2. 입력한 예약발송 시간이 올바르지 않은 형식일 경우 안내메세지를 띄웁니다.
    If IsDate(DeliveryTime) = False Then
        MsgBox "올바른 예약발송 시간을 입력하세요."
        Exit Sub
    End If
  3. 첨부파일이 1개라도 있을 시, String 으로 입력된 값을 배열 형태로 변환합니다.
    If AttachFilePath <> "" Then
            varFilePath = Split(AttachFilePath, PathDelimiter)
    End If
  4. 메일의 각 항목을 설정합니다.
    - To : 받을사람
    - CC : 참조
    - BCC : 숨은참조
    - Subject : 메일제목
    - HTMLBody : HTML 형식의 메일 본문

    With newEmail
        .To = MailTo
        .CC = CCTo
        .BCC = BCCTo
        .Subject = Subject
        .HTMLBody = HTMLString
    End With
  5. 첨부파일이 있을 시, For문으로 배열을 하나씩 돌아가며 메일에 첨부파일을 더합니다.
    - Attachments.Add ( 파일경로, 첨부파일숨김여부, 파일순서) : 첨부파일 추가

        If AttachFilePath <> "" Then
            For i = 1 To UBound(varFilePath) + 1
                .Attachments.Add varFilePath(i - 1), 1, i
            Next
        End If
  6. 예약발송시간이 지정되지 않았을 시, 예약발송시간을 현재시간으로 설정합니다.
    If DeliveryTime = 0 Then DeliveryTime = Now
        .DeferredDeliveryTime = DeliveryTime
  7. 메일 본문에 붙여넣기 할 범위가 있을 시, 메일 본문 마지막 지점을 찾아 해당 범위를 복사/붙여넣기 합니다.
    - 범위는 기본형식(wdPasteDefault)으로 붙여넣기 됩니다. 워드에디터의 다른 붙여넣기 형식이 궁금하신 분은 관련 링크를 참고하세요.
    - 만일 PasteAsImage 인수가 True일 경우 PasteSelection 을 통해 그림형식으로 붙여넣기 합니다.

        If Not PasteRng Is Nothing Then
            .Display
            Set pageInspector = newEmail.GetInspector
            Set pageEditor = pageInspector.WordEditor
     
            PasteRng.Copy
            pageEditor.Application.Selection.Start = Len(.Body)
            If PasteAsImage = False Then
                pageEditor.Application.Selection.PasteAndFormat wdPasteDefault
            Else
                pageEditor.Application.Selection.InsertAfter vbNewLine
                pageEditor.Application.Selection.Start = Len(.Body)
                pageEditor.Application.Selection.PasteSpecial Placement:=1, DataType:=wdPasteBitmap
            End If
        Else
            .Display
        End If
  8.  즉시 메일 보내기 여부가 True 일 경우 메일을 발송합니다.
        If ImmediateSend = True Then
            .Send
        End If
  9. 할당된 변수를 초기화 합니다. (여러개 메일 발송 시 동작속도 개선)
    Set pageEditor = Nothing
    Set pageInspector = Nothing
    Set newEmail = Nothing
    Set AppOutlook = Nothing
5 25 투표
게시글평점
61 댓글
Inline Feedbacks
모든 댓글 보기
61
0
여러분의 생각을 댓글로 남겨주세요.x