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

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

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

엑셀 '메일 보내기' 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일 경우 메일 아래에 서명을 추가합니다.)
예제파일 다운로드

관련 포스트

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:="[email protected]", _
            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개의 인수가 사용됩니다. 각 인수는 필요에 따라 변경해서 사용 가능합니다.

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

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

아웃룩 라이브러리 추가
VBA 편집기 '도구' - '참조' 에서 아웃룩 라이브러리를 활성화합니다.
변수명데이터구분설명
AppOutlookOutlook.Application아웃룩 프로그램입니다.
newEmailOutlook.MailItem새로 작성할 메일 항목입니다.
pageInspectorOutlook.Inspector워드에디터를 불러오기 위한 상위개체 입니다.
pageEditorObject아웃룩 워드에디터입니다.
varFilePathVariant첨부파일 파일경로를 나열한 배열입니다.
FileCountLong첨부파일 개수입니다.
iLongFor 반복문 연번입니다.
wdPasteDefaultVariant워드에디터에 붙여넣기 할 형식입니다. (기본값)
명령문 동작 원리
  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 6 votes
게시글평점
현재 페이지 댓글알림 신청
알림 설정
guest
23 Comments
Inline Feedbacks
View all comments
황대희
황대희
2020년 2월 5일 3:47 오후
게시글평점 :
     

안녕하세요

강의 잘 봤습니다.

user form에서 command button을 클릭시에 메일 보내기를 활성화 시키려면 어떻게 해야하나요?

[email protected]로 메일 주시면 문의 사항 파일로 보내드리겠습니다.

확인 부탁드립니다 ㅠ

황대희
황대희
2020년 2월 6일 4:11 오후

안녕하세요.. 테스트 명령문을 private commandbutton에 넣어서 사용하려니 하기 구문을 넣지 못하고 있습니다.. 방법이 있을까요? Sub Send_Email(MailTo As String, _ Subject As String, _ HTMLString As String, _ Optional PasteRng As… 더보기 »

닝빵
닝빵
2020년 4월 4일 8:48 오후

게시글평점 :       안녕하세요. 항상 오빠두엑셀을 잘 시청하고 있습니다. 올려주신 코드를 통해 적용하여 이메일 자동화 매크로를 제작했는데, 매크로를 통해 보내는 메일을 저희 회사 그룹웨어 메일서버에서 스팸으로 인식해서 저희 직원에게 보내는… 더보기 »

주니파파
주니파파
2020년 4월 14일 4:59 오후

게시글평점 :       안녕하세요 선택한 셀을 그림파일로 붙여넣기 할때 세로 방향으로 길이가 좀 긴것들을 짤리던데 안짤리고 메일에 붙여넣기 할수는없나요? PDF 파일은 선택한 셀까지 생성이 잘되는데 메일 붙여넣기 할때 세로 방향으로… 더보기 »

주니파파
주니파파
2020년 4월 17일 3:26 오후

정말 감사합니다
말씀대로 바로 해결되었습니다 ^^

라이언 홍
라이언 홍
2020년 4월 27일 9:18 오전

안녕하세요 ~ pageEditor.Application.Selection.PasteAndFormat 13 을 사용하여 붙여넣기 성공하였습니다. 하지만, 붙여넣기 할 영역의 사이즈가 커서 그런지 동일하게 아래 부분이 조금 안보이는 증상이 발생합니다. outlook 에 붙여넣기 된 그림을 선택하여 레이아웃 옵션에서… 더보기 »

라이언 홍
라이언 홍
2020년 5월 7일 10:10 오후

답변감사합니다. 말씀하신 링크에 이미지 추가 하였습니다.

라이언홍
라이언홍
2020년 5월 11일 10:31 오전

안녕하세요
아래 링크 보내 드립니다. 제가 빼 먹었습니다.
노란색 부분으로 마크 해두었습니다.
https://imgur.com/CVOG2SD

아르피노
아르피노
2020년 4월 16일 2:30 오후
게시글평점 :
     

메일에 붙여넣기 할 엑셀 범위를 1개의 시트에서만 가져오는데, 2개 또는 그 이상의 시트에서 각각 가져오게 할 수 있을까요?

황경수
황경수
2020년 6월 11일 5:38 오후

게시글평점 :       안녕하세요~ 오늘도 잘 보고 있습니다~ 감사합니다~ ^^ 근데 2019 버전에서 실행 시키면, Set AppOutlook = New Outlook.Application 이 부분에서 첨부와 같이 에러가 발생하는데, 방법이 없을까요? (2019 이하… 더보기 »

황경수
황경수
2020년 6월 12일 8:35 오전

와... 진짜 대단하세요.. 이걸 해결 해 주셨네요..ㅎㅎㅎ 사실 저도 엑셀 자신 있다고 생각해서 교육 이런거 해볼까도 생각 했는데, 야나두님 교육 들으면서 아 내가 진짜 해변가에 조개껍데기를 줍고 있었었구나 하고 포기… 더보기 »

최민기
최민기
2020년 6월 18일 2:57 오후
게시글평점 :
     

안녕하세요,
많은 도움이 되었습니다. 감사합니다.
To. 에서 수신자가 2명 이상일 경우 에러가 발생하는데요. 혹시 수신자를 2명 이상 추가할 수 있을까요?
감사합니다.

최민기
최민기
2020년 6월 24일 11:20 오전

안녕하세요,
확인 감사합니다.
수신자는 .To = Range("H32") 로 설정하였습니다.
.To = Range("H32") & ";" & Range ("H33") 이렇게 수신자를 2명으로 하고싶은데, 적용이 안되네요^^;;
 

23
0
여러분의 생각을 댓글로 남겨주세요.x