이메일 보내기 모듈 (Send_Email)
엑셀 x 아웃룩 연동으로 이메일 보내기 자동화! - 이메일 보내기 명령문
이 강의에서는 엑셀 VBA와 아웃룩 라이브러리를 연동해 메일 발송을 자동화하는 Send_Email 명령문을 직접 구현합니다. 받는 사람·참조·첨부파일·예약 발송 등 여덟 개 인수의 설계 의도부터 파일 검사·페이지 설정·PDF 추출 보조 모듈, 본 명령문, 테스트 호출까지 단계별로 살펴보고, 메일 본문에 서명을 자동으로 덧붙이는 응용 방법까지 정리합니다.
실습자료를 준비했어요
수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇
실습 가이드
이번 강의에서는 엑셀 메일 보내기 자동화 매크로를 작성합니다. 엑셀과 아웃룩을 연동해 메일 발송을 자동화하면, VBA 가 기본으로 제공하는 아웃룩 라이브러리를 활용해 첨부파일 첨부, 예약 발송 등 다양한 부가 기능을 구현할 수 있습니다.
이전 강의에서 다룬 PDF 추출 매크로와 페이지 레이아웃 설정 모듈도 함께 사용하므로, 이전 강의를 보지 못한 분은 관련 링크를 먼저 확인해주세요.
추가 설정 없이 바로 사용할 수 있는 보다 자동화된 Send_Email 명령문이 필요하다면, Send_Email 메일 보내기 명령문 전체 마스터 코드를 아래 링크에서 확인할 수 있습니다.
패치노트
- 2019년 12월 5일 :
Send_Email 명령문에 예약 발송 기능과 '그림으로 첨부' 기능을 추가하였습니다. - 2020년 5월 28일:
메일 본문 아래에 서명을 자동으로 추가하는 명령문을 업데이트하였습니다.
1. 메일 보내기 명령문 보조 모듈 추가
이전 강의에서 제작한 PDF 변환 명령문과 그 외 보조 모듈을 먼저 추가합니다. 각 명령문에 대한 자세한 설명은 이전 강의 PDF 변환 매크로 만들기 (퀵 VBA 6강)를 참고하세요.
A. 파일명 설정 및 파일 저장을 위한 보조 명령문
파일 경로 검사와 파일명 검증에 사용하는 보조 함수입니다. 각 함수의 동작 원리는 아래 관련 포스트에서 자세히 확인할 수 있습니다.
'########################################## 'z_SubModule 이라는 모듈을 생성한 뒤 복사/붙여넣기 하세요 '########################################## Option Explicit Public Function FileExists(ByVal path_ As String) As Boolean FileExists = (Dir(path_, vbDirectory) <> "") End Function Public Function GetDesktopPath(Optional BackSlash As Boolean = True) Dim oWSHShell As Object Set oWSHShell = CreateObject("WScript.Shell") If BackSlash = True Then GetDesktopPath = oWSHShell.SpecialFolders("Desktop") & "\" Else GetDesktopPath = oWSHShell.SpecialFolders("Desktop") End If Set oWSHShell = Nothing End Function Function FileSequence(FilePath As String, Optional Sequence As Long = 1) Dim Ext As String: Dim Path As String: Dim newPath As String Dim Pnt As Long Pnt = InStrRev(FilePath, ".") Path = Left(FilePath, Pnt - 1) Ext = Right(FilePath, Len(FilePath) - Pnt + 1) newPath = Path & Sequence & Ext Do Until FileExists(newPath) = False Sequence = Sequence + 1 newPath = Path & Sequence & Ext Loop FileSequence = newPath End Function Function ValidFileName(ByVal FileName As String) As Boolean Dim Arr As Variant: Dim Val As Variant Dim Pnt As Long Arr = Array("/", "\", ":", "*", "?", """", "<", ">", "|") If InStr(1, FileName, ":\") > 0 Then Pnt = InStrRev(FileName, "\") FileName = Right(FileName, Len(FileName) - Pnt) Debug.Print FileName End If ValidFileName = True For Each Val In Arr If InStr(1, FileName, Val) > 0 Then ValidFileName = False: Exit Function Next End Function
B. 페이지 레이아웃 설정을 위한 보조 모듈 (Page_Setup)
'########################################## 'z_PageSetup 이라는 모듈을 생성한 뒤 복사/붙여넣기 하세요 '########################################## Public Enum ePrintMargin xlNone = 0 xlNarrow = 1 xlNormal = 2 xlWide = 3 End Enum Public Enum ePaperSize xlA4 = 9 xlA3 = 8 xlLetter = 1 xlA5 = 11 End Enum Function getPrintMargin(eValue As ePrintMargin) As Variant '// 설정된 eNum 값으로 페이지 여백설정을 위한 값을 배열로 나열합니다. Select Case eValue Case 0 getPrintMargin = Array(0.05, 0.05, 0.05, 0.05, 0.1, 0.1) Case 1 getPrintMargin = Array(0.25, 0.25, 0.75, 0.75, 0.3, 0.3) Case 2 getPrintMargin = Array(0.7, 0.7, 0.75, 0.75, 0.3, 0.3) Case 3 getPrintMargin = Array(1, 1, 1, 1, 0.5, 0.5) End Select End Function Sub Page_setup(WS As Worksheet, Optional LHead As String = "", Optional RHead As String = "&D / &T", _ Optional LFoot As String = "본 페이지의 무단복제를 금합니다.", Optional RFoot As String = "&P / &N 페이지", _ Optional eMargin As ePrintMargin = xlNarrow, _ Optional HFit As Boolean = True, Optional VFit As Boolean = False, _ Optional HCenter As Boolean = True, Optional VCenter As Boolean = False, _ Optional eOrient As XlPageOrientation = xlPortrait, Optional eSize As ePaperSize = xlA4) Dim pSetup As String Dim varMargin As Variant Dim lngOrient As Integer '// 인쇄설정 업데이트 중단 (속도증가) Application.PrintCommunication = False '// 인쇄여백값을 받아옵니다. varMargin = getPrintMargin(eMargin) '// 인쇄용지 방향을 설정합니다. If eOrient = xlPortrait Then lngOrient = 1 Else lngOrient = 2 End If '// ExecuteExcel4Macro 의 Page.Setup 명령문 실행을 위한 문구를 입력합니다. Head = """&L" & LHead & "&R" & RHead & """" '// 페이지 머릿말입니다. Foot = """&L" & LFoot & "&R" & RFoot & """" '// 페이지 꼬릿말입니다. pLeft = varMargin(0) '// 왼쪽여백 pRight = varMargin(1) '// 오른쪽여백 Top = varMargin(2) '// 윗여백 Bot = varMargin(3) '// 아래여백 Head_margin = varMargin(4) '// 머릿말여백 Foot_margin = varMargin(5) '// 꼬릿말여백 Hdng = 0 '// 행/열반복 출력여부 0 = 반복출력안함 1 = 반복출력 Grid = False '// 눈금선출력여부 Notes = False '// 메모출력여부 H_cntr = HCenter '// 가운데정렬 V_cntr = VCenter '// 중앙정렬 Orient = lngOrient '// 문서방향, 1 = 세로 2 = 가로 Paper_size = eSize '// 용지크기 Pg_num = 1 '// 페이지 시작번호 Pg_order = 1 '// 페이지번호 순서, 1 = 위-아래-우 2 = 좌-우-아래 Quality = "" '// 인쇄품질 (dot-per-inch로 입력) (공백 = 자동) bw_cells = False '// 흑백인쇄여부, TRUE = 글자/테두리 검정,배경 흰색 FALSE = 색깔 pScale = 100 '// 축소/확대비율 또는 TRUE (Fit to Page) '// 여백을 없음으로 설정할 경우 머릿말/꼬릿말을 삭제하여 인쇄영역과 겹치지 않도록 합니다. If eMargin = xlNone Then Head = """""" Foot = """""" End If '// ExecuteExcel4Macro 명령문을 실행합니다. pSetup = "PAGE.SETUP(" & Head & ", " & Foot & ", " & pLeft & ", " & pRight & ", " & Top & ", " & Bot & ", " pSetup = pSetup & Hdng & ", " & Grid & "," & H_cntr & "," & V_cntr & "," & Orient & "," pSetup = pSetup & Paper_size & "," & pScale & "," pSetup = pSetup & Pg_num & "," & Pg_order & "," & bw_cells & "," & Quality & "," pSetup = pSetup & Head_margin & "," & Foot_margin & "," & Notes & ")" Application.ExecuteExcel4Macro pSetup '// ExecuteExcel4Macro에서는 '한 페이지에 행/열 맞추기' 기능이 지원되지 않습니다. '// 따라서 시트의 PageSetup 속성으로 '페이지 행/열 맞추기 기능을 설정합니다. With WS.PageSetup If HFit = True Then .FitToPagesWide = 1 Else .FitToPagesWide = False End If If VFit = True Then .FitToPagesTall = 1 Else .FitToPagesTall = False End If End With '// 인쇄설정 업데이트 Application.PrintCommunication = True End Sub
C. 선택범위 PDF 저장 모듈 (Rng_To_PDF)
'#################################################### '모듈을 추가한 뒤 복사/붙여넣기 하세요. '#################################################### Sub Rng_To_Pdf(rngSelect As Range, _ Optional FileName As String = "pdf출력", _ Optional SavePath As String = "", _ Optional DocProperty As Boolean = True, _ Optional PrintArea As Boolean = False, _ Optional OpenPdf As Boolean = False, _ Optional AddSequence As Boolean = True) Dim WS As Worksheet Dim FilePath As String Set WS = rngSelect.Parent If SavePath = "" Then SavePath = GetDesktopPath FilePath = SavePath & FileName & ".pdf" If ValidFileName(FilePath) = False Then MsgBox ("올바른 파일명을 사용하세요"): Exit Sub If AddSequence = True Then FilePath = FileSequence(FilePath, 1) End If rngSelect.ExportAsFixedFormat xlTypePDF, FilePath, xlQualityStandard, DocProperty, PrintArea, , , OpenPdf End Sub
2. 메일 보내기 본 명령문 작성 (Send_Email 명령문)
이번 단계에서는 엑셀과 아웃룩을 연동해 이메일을 발송하는 본 명령문을 작성합니다. 새로운 모듈을 추가한 뒤, 모듈 이름을 "Email_Module" 로 변경합니다.
A. Outlook 라이브러리 추가
VBA 편집창 상단의 '도구' – '참조' 메뉴에서 Outlook 라이브러리(Microsoft Outlook 16.0 Object Library)를 추가합니다.

B. 명령문 인수 작성
명령문에 사용할 인수를 정의합니다. Send_Email 명령문에는 총 8개의 인수가 들어갑니다.
| 인수 | 설명 |
| MailTo [String] |
받는 사람의 메일 주소입니다. |
| Subject [String] |
메일 제목입니다. |
| HTMLString [String] |
HTML 형식의 메일 본문입니다. |
| PasteSelection [Boolean, 선택인수] |
TRUE 일 경우 선택한 범위를 메일 본문에 붙여넣기합니다. 기본값은 FALSE 입니다. |
| CCTo [String, 선택인수] |
참조 메일 주소입니다. |
| BCCTo [String, 선택인수] |
숨은참조 메일 주소입니다. |
| AttachFilePath [String, 선택인수] |
첨부파일의 파일 경로입니다. |
| PathDelimiter [String, 선택인수] |
여러 개의 첨부파일이 있을 때 파일 경로를 구분하는 구분자입니다. |
C. 명령문 변수 작성 및 설정
명령문 내부에서 사용할 변수를 선언하고 초기값을 설정합니다.
- 변수 중 wdPasteDefault 는 워드 에디터에서 복사한 값을 붙여넣기 할 방식을 결정하는 WdRecoveryType 항목으로, 원칙적으로는 Word Object Library 를 참조해 지정하는 것이 맞습니다.
- 다만 아웃룩에서 사용하는 워드 에디터는 별도 Word 프로그램이 참조하는 라이브러리와 분리되어 동작하므로 Word Object Library 를 직접 사용할 수 없습니다. 따라서 Variant(임의값) 타입으로 변수를 선언해 명령문을 작성합니다.
| 변수명 | 설명 |
| AppOutlook [Outlook.Application] |
실행할 아웃룩 프로그램입니다. |
| newEmail [Outlook.MailItem] |
아웃룩에서 새로 작성할 메일 항목입니다. |
| pageInspector [Outlook.Inspector] |
아웃룩 워드 에디터를 가져오기 위한 Inspector 객체입니다. |
| pageEditor [Object] |
아웃룩에서 메일 본문을 편집하는 워드 에디터입니다. |
| varFilePath [Variant] |
String 으로 전달받은 첨부파일 경로를 배열 형태로 변환한 값입니다. |
| FileCount [Long] |
첨부파일의 개수입니다. |
| i [Long] |
For 반복문의 연번 변수입니다. |
| wdPasteDefault [Variant] |
엑셀에서 선택한 범위를 메일에 붙여넣기 할 방식을 지정하는 값입니다. |
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)
D. 메일항목 설정 #1
보낼 메일의 각 항목을 설정합니다. 설정에 사용되는 모든 값은 명령문의 인수 또는 앞서 선언한 변수에서 받아오므로, 각 항목을 차례대로 호출해 할당하면 됩니다.
- To : 받는 사람의 메일 주소입니다.
- CC : 참조 메일 주소입니다.
- BCC : 숨은 참조 메일 주소입니다.
- Subject : 메일 제목입니다.
- Attachments.Add : 메일에 첨부파일을 추가합니다.
- HTMLBody : HTML 형식의 메일 본문을 작성합니다.
- DefferedDeliveryTime : 예약 발송 또는 지연 발송 시간을 설정합니다.
- DateSerial 함수 - 연/월/일로 입력한 날짜의 일련번호를 반환합니다.
- TimeSerial 함수 - 시/분/초로 입력한 시간의 일련번호를 반환합니다.
- DateAdd 함수 - 지정한 시간/날짜를 기준으로 선택한 단위만큼 더한 값을 반환합니다.
예약발송 설정 예제
- 예제1) 2019년 12월 25일 오후 9시에 발송 : DateSerial(2019, 12, 25) + TimeSerial(9,0,0)
- 예제2) 현재 시간 기준 30분 뒤 발송 : DateAdd("n", 30, Now)
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 .HTMLBody = HTMLString '.DeferredDeliveryTime = DateAdd("n", 5, Now) .DeferredDeliveryTime = DateSerial(2030, 1, 1) + TimeSerial(8, 0, 0) End With
E. 메일항목 설정 #2
엑셀 시트에서 선택한 범위를 메일 본문에 붙여넣기 하려면, 아웃룩의 워드 에디터에 추가 설정이 필요합니다. 본 강의에서는 엑셀에서 선택한 범위를 메일 본문 마지막 부분에 기본 표 형식으로 붙여넣기 하는 방법을 알아봅니다.
- pageEditor.Application.Selection.Start : 엑셀에서 복사한 범위를 붙여넣기 할 시작 지점입니다.
- pageEditor.Application.Selection.PasteAndFormat : 붙여넣기 방식을 지정합니다. 본 강의에서는 기본값을 사용했습니다.
- 워드 에디터의 붙여넣기 형식 전체 목록 :
https://docs.microsoft.com/en-us/office/vba/api/word.wdrecoverytype
If PasteSelection = True Then .Display Set pageInspector = newEmail.GetInspector Set pageEditor = pageInspector.WordEditor pageEditor.Application.Selection.Start = Len(.Body) Selection.Copy pageEditor.Application.Selection.PasteAndFormat wdPasteDefault Else .Display End If
F. 메일 보내기 및 변수 초기화
Send 함수로 메일을 발송합니다. 다수의 메일을 연속해서 보낼 때는 사용한 변수를 초기화해 매크로 동작 속도를 높일 수 있습니다. 변수 초기화는 마지막에 할당한 변수부터 역순으로 진행해야 한다는 점에 유의하세요.
'.Send '// 메일을 보내려면 주석처리를 해제하세요. Set pageEditor = Nothing Set pageInspector = Nothing Set newEmail = Nothing Set AppOutlook = Nothing
G. Send_Email 전체 명령문
보다 개선된 Send_Email 전체 마스터 코드와 실전 예제 파일은 여기에서 확인할 수 있습니다.
'###################################################################### ' 명령문 : Send_Email ' 설명 : 아웃룩과 연동하여 메일보내기를 자동화하는 모듈입니다. '###################################################################### Sub Send_Email(MailTo As String, _ Subject As String, _ HTMLString As String, _ Optional PasteSelection As Boolean = False, _ Optional CCTo As String = "", _ Optional BCCTo As String = "", _ Optional AttachFilePath As String = "", _ Optional PathDelimiter As String = "|") 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 '// For문 반복문의 변수 Dim wdPasteDefault As Variant Set AppOutlook = New Outlook.Application Set newEmail = AppOutlook.CreateItem(olMailItem) 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 .HTMLBody = HTMLString '.DeferredDeliveryTime = DateAdd("n", 5, Now) .DeferredDeliveryTime = DateSerial(2030, 1, 1) + TimeSerial(8, 0, 0) If PasteSelection = True Then .Display Set pageInspector = newEmail.GetInspector Set pageEditor = pageInspector.WordEditor pageEditor.Application.Selection.Start = Len(.Body) Selection.Copy pageEditor.Application.Selection.PasteAndFormat wdPasteDefault Else .Display End If '.Send '// 메일을 보내려면 주석처리를 해제하세요. End With Set pageEditor = Nothing Set pageInspector = Nothing Set newEmail = Nothing Set AppOutlook = Nothing End Sub
3. 이메일 보내기 명령문 테스트
앞서 작성한 메일 보내기 명령문을 테스트하기 위한 호출 명령문을 작성합니다. 아래 코드를 복사해 붙여넣은 뒤 실행해보세요. 테스트 명령문은 다음과 같이 동작합니다.
- '직원명_부서명_년도-월' 형식의 파일명으로 PDF 파일을 바탕화면에 저장합니다.
- 저장된 PDF 파일을 메일에 첨부합니다 (파일 경로를 세로바(|)로 구분하여 두 개의 파일을 동시에 첨부할 수 있습니다).
- HTML 형식으로 작성한 메일 본문과 함께, 급여명세서의 B2:E18 범위를 메일 본문에 붙여넣기 합니다.
엑셀 범위를 HTML 형식으로 변환하는 방법은 관련 포스트에서 자세히 다루고 있습니다. - test@oppadu.com 주소로 메일을 발송합니다.
테스트 명령문에서 받는 사람 주소, 메일 본문, PDF 변환 범위 등은 필요에 따라 직접 수정하여 사용할 수 있습니다.
'########################################################## ' 오빠두엑셀 퀵 VBA 7강, 메일 보내기 자동화 완성파일 ' 명령문에 대한 자세한 설명은 아래 링크에서 확인하세요. ' https://www.oppadu.com/엑셀-메일-보내기-아웃룩-매크로/ '########################################################## Sub Test() Dim FileName As String Dim SavePath As String FileName = Sheet4.Range("E3").Value & "_" & Sheet4.Range("C4").Value & "_" & Sheet4.Range("H3").Value & "년 " & Sheet4.Range("H4").Value & "월" SavePath = GetDesktopPath Rng_To_Pdf Sheet4.Range("B2:E18"), FileName, SavePath, OpenPdf:=False, AddSequence:=False '// Rng_To_Pdf 명령문의 첫번째 인수를 Selection으로 변경하면 선택한 범위를 PDF파일로 추출하여 메일에 첨부합니다. Sheet4.Range("B2:E18").Select '// 선택된 범위가 아닌 원하는 부분을 지정해서 메일에 첨부하는 방법이 궁금하신분은 Send_Email 명령문 관련 포스트를 참고하세요. Send_Email "test@oppadu.com", _ FileName, _ "
오빠두 대리 님께
귀하의 2019년 10월 급여명세서를 송부드립니다.
오빠두엑셀을 위한 귀하의 노고에 깊은 감사드리며 더욱 발전된 모습으로 귀하에 노고에 보답하겠습니다.
", _ True, _ "", , _ SavePath & FileName & ".pdf" & "|" & SavePath & FileName & ".pdf" End Sub
4. 시트에 매크로 실행 버튼 추가
작성한 매크로를 손쉽게 실행하기 위해 시트 위에 실행 버튼을 추가합니다. 시트에 도형을 삽입한 뒤 원하는 문구나 아이콘을 넣고, 도형을 우클릭한 다음 매크로 지정을 선택합니다.

매크로 지정을 선택하면 새 팝업창이 나타납니다. 팝업창에서 방금 추가한 'Test' 명령문을 선택합니다.

이후 도형을 클릭하면 작성한 메일 보내기 명령문이 실행됩니다.

Q. 메일 아래에 서명을 추가하려면?
메일 본문 아래에 서명을 자동으로 추가하려면 Send_Email 명령문의 With newEmail ~ End With 부분을 아래 코드로 변경합니다.
- 이메일 서명을 가져오기 위해 먼저 .Display 로 이메일 창을 실행합니다.
- HTML 형식의 서명을 Signature 변수에 저장한 뒤, 메일 본문 작성이 끝나면 메일 마지막 부분에 다시 붙여 넣습니다.
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 Dim Signature As String Signature = .HTMLBody .HTMLBody = HTMLString '.DeferredDeliveryTime = DateAdd("n", 5, Now) .DeferredDeliveryTime = DateSerial(2030, 1, 1) + TimeSerial(8, 0, 0) If PasteSelection = True Then .Display Set pageInspector = newEmail.GetInspector Set pageEditor = pageInspector.WordEditor pageEditor.Application.Selection.Start = Len(.Body) Selection.Copy pageEditor.Application.Selection.PasteAndFormat wdPasteDefault '------------------------------- ' 서명 추가를 위해 변경된 부분 '------------------------------- .HTMLBody = .HTMLBody & Signature Else .Display End If '.Send '// 메일을 보내려면 주석처리를 해제하세요. End With
FileName, _
"", _
True, _ <-- 이부분에서 컴파일 오류 형식이 일치 하지 않습니다 라고 나옵니다
"", , _
SavePath & FileName & ".pdf" & "|" & SavePath & FileName & ".pdf"
적어주신 내용만으로는 정확한 답변을 드리기가 어렵습니다.
로 우선 실행해보신 뒤, 잘 동작하는지 확인해보시겠어요?^^
만약 잘 동작한다면, 이후에 들어가는 인수는 모두 선택인수이므로 하나씩 지정해서 테스트해보시길 바랍니다.
감사합니다.
테스트를 해보니 강의에서처럼 메일보내기 창도 잘 뜨고 첨부도 잘 됩니다.
그런데 지연 발송을 하든 그 부분을 삭제하든 보내기를 누르면 창이 닫히고 보낼편지함으로 가는 것 같습니다.
그게 계속 발송이 안되다가 아웃룩을 수동으로 켜면 그제서야 발송이 됩니다.
(아웃룩 켜면 그 사이 실험해봤던것이 우수수 오는 상황)
저의 컴퓨터 환경의 문제인지.... 여러가지로 시도 하다가 해결이 되지 않아 문의드립니다.
저도 예전 업무볼때 불편했던 사항 중 하나인데요.
아웃룩의 경우 PC의 '실행프로그램'으로 동작해서, 예약발송을 걸었을 때 해당 메일을 서버에 전송한 뒤 PC가 꺼진 상태에서도 발송되는 시스템이 아니라, PC에 프로그램이 계속 실행된 상태에서 예약한 시간이 되면 그때 발송이 되는.. 시스템이라고 합니다. (그래서 예약발송 걸어놓고 아웃룩 프로그램을 종료하면 메일이 발송되지 않는다는 안내메세지가 출력되죠..)
이 문제는 Outlook 계정을 사용하면 해결가능하다고 예전 MS 블로그에서 본적이 있는데요.
이게 사실상 해결이 어려운 부분이, 대게 많은 회사가 각자 도메인주소를 따서 회사 고유의 메일서버를 이용하는게 대부분이라.. 근본적인 해결책이 어떻게 있을지는 정확히 모르겠습니다. ^^;
가장 쉬운 방법은 '아웃룩' 프로그램이 실행된 상태에서 예약발송을 걸어두는 것이고, 이는 매크로와는 별개로.. 아웃룩으로 예약발송을 구현하시려면 어쩔 수 없는 문제일듯 합니다.
만약 업무상 정말 필요한 기능이라면, 전산팀에 문의해서 해결해보시는 것도 하나의 방법일듯 합니다.
제시해드린 답변이 도움이 되셨길 바랍니다.
감사합니다 ^^
아래 문구(바로가기를 실행)를 껴넣어서 아웃룩을 켜놓는 방법으로 해결했습니다.
그런데 Shell 을 사용하지 않고 아웃룩 본체를 띄울수는 없을까요?
다른 컴퓨터환경에서는 경로가 다를 수 있어서요.
Shell "rundll32.exe url.dll,FileProtocolHandler " & "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Outlook 2016.lnk", vbNormalFocus
아웃룩은 아래 Shell 명령문으로 아주 간단하게 실행할 수 있습니다.
답변이 도움이 되셨길 바랍니다.
감사합니다.
그런데 아웃룩 내에서는 와꾸(?)가 복사한대로 이쁘게 나오는데, 네이버 메일 상에서는 표의 가로 세로 길이가 이상하게 보이게 전송됩니다.
이런건 어떻게 해결해야할까요..
아래 내용을 같이 확인주시겠어요?
- 매크로를 사용하지 않고 직접 작성하신 메일에서도 같은 문제가 발생하나요?
만약 위 두 질문에 대한 답변이 모두 YES일 경우, 메일을 보내기 전 HTML 코드를 수정해주셔야 하는데요 ^^;
Table 태그의 Width 를 100% 로 변경해주시고, Tr 태그의 Min-Height 값을 2em ~ 3em 정도로 수정해주시면 해결되실듯 합니다..
제시해드린 답변이 도움이 되셨길 바랍니다.
감사합니다.
넘 관심 있는 주제인데, 파일 생성까지만 되고, 메일은 보내지지 않네요 ㅠㅠ
a) Tool-Reference - Microsoft word 16.0 의 체크박스는 해지하고 매크로 실행이 맞지요? (Object로 받기 때문에?)
b) 회사도메인이 등록되어 있는 Outlook 메일로는 이 메크로가 사용 불가한가요? 코딩하고 보니 보내는 사람정보(ID/PW) 등은 설명에 없는 것 같아서 궁금하네요.
c) sub Test()를 실행하면 파일 생성후 에러 팝업 'Compile error / User-defined type not defined' 가 뜨며 메일은 발송 안됩니다.
모듈(Email_Module) 에서 Optional Pathdelimiter as string = "|") 부분에서 계속 디버깅이 발생하는데 이유를 찾을수가 없네요.
몇번 하다가 안되서, 사이트에서 코드를 그대로 복사 해왔는데도 자꾸 오류가 납니다.
오빠두님의 명쾌한 조언 부탁 드릴게요!
덕분에 정말 많이 배우고 있습니다.
감사드립니다. 🙂
문제가 해결되셨다니 너무나도 다행입니다!^_^*
이후에도 어려움이 있을경우 언제든지 댓글이나 커뮤니티에 글을 올려주시면 확인 후 최대한 도움이 되는 답변 드리도록 노력하겠습니다.
감사합니다.
엑셀-아웃룩 매크로의 메커니즘은 기존의 엑셀 아웃룩 간 작성/복사/붙여넣기 작업을 자동화해주는 것입니다.
아웃룩에서 메일전송이 안되는 것은 '아웃룩'쪽 설정을 확인하셔야 할듯 한데요.
https://www.oppadu.com/%ec%97%91%ec%85%80-%eb%a9%94%ec%9d%bc-%eb%b3%b4%eb%82%b4%ea%b8%b0-%ec%95%84%ec%9b%83%eb%a3%a9-%eb%a7%a4%ed%81%ac%eb%a1%9c/#comment-2376
위 댓글에서도 말씀드렸지만, 아웃룩은 '아웃룩' 계정을 사용하지 않는한, 예약발송 기능은 '아웃룩이 실행된 상태'여야만 정상적으로 동작합니다.
따라서 아래 1가지를 확인하시면 될듯 합니다.
만 확인 후, Outbox에 메일이 정상적으로 들어간다면 아웃룩을 항시 실행시켜놓는 방법으로 문제를 해결하실 수 있을듯 합니다 ^^
아래 명령문은 아웃룩을 실행하는 명령문입니다.
답변이 도움이 되셨길 바랍니다.
감사합니다.
아웃룩 계정 로그인 한 상태에서 아웃룩 메일을 항시 실행시켜놓은 상태입니다
아웃룩 자체에서 메일 보내고 받고의 기능은 정상적으로 작동됩니다
그리고 추가적으로 작업창 안내 메시지에
"(~~~@메일주소)의 구독된 폴더를 동기화하는 중입니다."
"(~~~@메일주소)에 있는 구독된 폴더에서 새 메일을 검사합니다."
라는 문구가 확인 됩니다.
이 상태에서 진행률이 시간이 흘러도 막대바가 채워지지 않는데.....
관련해서 아웃룩 오류를 해결하기 위해 검색중이기는 하지만
혹시 조언 주실 내용이 있을까요:)
아무것도 모르고 무작정 강의보고 사이트 보고 어설프게 따라하고 있습니다.
최종 엑셀 내용을 pdf으로 저장되며 자동으로 첨부파일로 등록이 되어 메일 발송까지는 됩니다.
하지만 엑셀에 한 부분을 메일에 붙여넣기가 안되는데
사이트에 올라온 내용을 그대로 따라 붙여넣기도 해보고 다해봐도 자동으로 붙여넣기가 안됩니다..
도와주세요..
흑흑
우선 도움을 드리고 싶으나, 적어주신 내용만으로는 제가 답변을 드리기 어렵습니다.
간단한 디버깅을 해보시겠어요?
만약 코드를 그대로 사용하셨다면,
위 부분에 마우스 커서를 두신 뒤, 키보드 F9키를 눌러 중단점을 설정해주세요.
그리고 메일보내기 매크로를 실행하면 해당 지점에서 명령문이 스톱됩니다.
그 상태에서 키보드 F8키로 단계별로 실행하면서, 복사/붙여넣기 하는 동작이 잘 되는지 확인해보세요.
위 명령문을
로 수정해서 선택한 범위의 셀 주소가 제대로 출력되는지도 확인해보시구요.
직접 디버깅하시다보면 문제점을 찾으실 수 있을겁니다 ^^
답변이 도움이 되셨길 바랍니다.
복사해서 붙여넣은 selection 항목의 사이즈 조절이 가능할까요?
applicaion.selection property 에서 사이즈 속성은 못찾겠네요.
행/열 높이크기는 EntireRow / EntireColumn 에서 RowHeight/ColumnWidth 속성을 변경해주시면 됩니다.
행/열 개수는 Resize 속성을 변경해보세요 ^^
노란음영의 커서는 아래 명령문을 가르키고, Dim AppOutlook As Outlook.Application 이 자동 선택됩니다.
Sub Send_Email(MailTo As String, _
Subject As String, _
HTMLString As String, _
Optional PasteSelection As Boolean = False, _
Optional CCTo As String = "", _
Optional BCCTo As String = "", _
Optional AttachFilePath As String = "", _
Optional PathDelimiter As String = "|")
제가 변경한 것은 test()에서 동일한 내용에 sheet4를 sheet3으로 변경한 것 밖에 없는데 왜 오류가 나는 걸까요.ㅜㅜ?
A. Outlook 라이브러리 추가
이부분을 확인해보시겠어요?^^
본 예제에 추가 기능을 넣고 싶은데, 쉽지가 않네요... ㅜㅜ 아래와 같은 추가 기능을 넣으려면
어떻게 해야하나요....?
[원하는 추가기능]
sheet1의 A열에 수신인 별 일련번호, B열에 수신인 이름, C열에 이메일 주소 (약 120명) 가 있고,
한 폴더에 각 수신인 별로 보낼 파일이 2 개 또는 4개가 존재합니다.
(파일명 :
① 수신인일련번호_단체명_수신인명_AAA_XXX
② 수신인일련번호_단체명_수신인명_AAA_YYY
③ 수신인일련번호_단체명_수신인명_BBB_XXX
④ 수신인일련번호_단체명_수신인명_BBB_YYY
YYY 파일 (즉, ②와 ④)는 수신인별로 존재하는 수신인이 있고, 존재하지 않는 수신인이 있습니다.
MailTo를 Range로 지정하고, 반복문(For)을 돌려야 할 것 같고
AttachmentFilePath는 YYY 존재유무를 먼저 확인하고 Attach하는 명령문이
필요한 것은 알겠지만 코드 작성이 어렵네요 ... ㅜㅜ
염치불구하고 여쭤봅니다. ㅜㅜ
파일을 첨부하신 뒤, 해당 파일을 메일 본문에 삽입할 수 있습니다.
예를들어 첨부한 파일명이 '이미지.jpg' 일 경우, 아래 코드를 메일 본문에 넣어보세요.