엑셀 '메일 보내기' 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 명령문으로 엑셀 메일 보내기를 자동화합니다. 인수 설명
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 를 활성화 합니다.

변수명 | 데이터구분 | 설명 |
---|---|---|
AppOutlook | Outlook.Application | 아웃룩 프로그램입니다. |
newEmail | Outlook.MailItem | 새로 작성할 메일 항목입니다. |
pageInspector | Outlook.Inspector | 워드에디터를 불러오기 위한 상위개체 입니다. |
pageEditor | Object | 아웃룩 워드에디터입니다. |
varFilePath | Variant | 첨부파일 파일경로를 나열한 배열입니다. |
FileCount | Long | 첨부파일 개수입니다. |
i | Long | For 반복문 연번입니다. |
wdPasteDefault | Variant | 워드에디터에 붙여넣기 할 형식입니다. (기본값) |
명령문 동작 원리
- 변수를 설정한 뒤, 개체 변수를 지정합니다. (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)
- 입력한 예약발송 시간이 올바르지 않은 형식일 경우 안내메세지를 띄웁니다.
If IsDate(DeliveryTime) = False Then MsgBox "올바른 예약발송 시간을 입력하세요." Exit Sub End If
- 첨부파일이 1개라도 있을 시, String 으로 입력된 값을 배열 형태로 변환합니다.
If AttachFilePath <> "" Then varFilePath = Split(AttachFilePath, PathDelimiter) End If
- 메일의 각 항목을 설정합니다.
- To : 받을사람
- CC : 참조
- BCC : 숨은참조
- Subject : 메일제목
- HTMLBody : HTML 형식의 메일 본문With newEmail .To = MailTo .CC = CCTo .BCC = BCCTo .Subject = Subject .HTMLBody = HTMLString End With
- 첨부파일이 있을 시, For문으로 배열을 하나씩 돌아가며 메일에 첨부파일을 더합니다.
- Attachments.Add ( 파일경로, 첨부파일숨김여부, 파일순서) : 첨부파일 추가If AttachFilePath <> "" Then For i = 1 To UBound(varFilePath) + 1 .Attachments.Add varFilePath(i - 1), 1, i Next End If
- 예약발송시간이 지정되지 않았을 시, 예약발송시간을 현재시간으로 설정합니다.
If DeliveryTime = 0 Then DeliveryTime = Now .DeferredDeliveryTime = DeliveryTime
- 메일 본문에 붙여넣기 할 범위가 있을 시, 메일 본문 마지막 지점을 찾아 해당 범위를 복사/붙여넣기 합니다.
- 범위는 기본형식(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
- 즉시 메일 보내기 여부가 True 일 경우 메일을 발송합니다.
If ImmediateSend = True Then .Send End If
- 할당된 변수를 초기화 합니다. (여러개 메일 발송 시 동작속도 개선)
Set pageEditor = Nothing Set pageInspector = Nothing Set newEmail = Nothing Set AppOutlook = Nothing