C# 프로그램을 개발하다 보면 프로그램에서 메일을 보내기해야 하는 경우가 가끔 있습니다.
출력 리포터를 PDF로 변환해서 메일에 첨부해서 보내는 경우도 있고, 주기적으로 만들어지는 특정 자료를 메일에 첨부해서 보내기 하는 프로그램을 개발할 때도 있습니다.
이번 글에서 설명할 내용은 폴더(파일)을 압축하고, 압축한 파일을 메일에 첨부해서 바로 보내기 하는 프로그램에 대한 설명입니다. 압축 파일을 푸는 프로그램에 대한 예제도 함께 기술하였습니다.
C#에서 파일이나 폴더를 압축하는 방법
예전에 Visual Studio 2008로 압축 프로그램을 개발할 때 ICSharpCode.SharpZipLib.dll 라이브러리를 참조해서 개발했던 기억이 있습니다. 물론 지금도 잘 만들어진 압축 관련 라이브러리를 사용해서 압축을 하거나 압축을 푸는 프로그램을 개발할 수 있습니다.
하지만 이번에 설명할 내용은 별도 외부 라이브러리를 사용하지 않고 System.IO.Compression을 사용해서 압축하는 방법에 대한 설명입니다.
System.IO.Compression은 .NET Framework 4.5 이상부터 사용할 수 있습니다. 아래 예제는 사용할 수 있는 최소 버전인 닷넷프레임워크 4.5를 사용하였습니다.
1. 먼저 프로젝트에 참조에 System.IO.Compression.FileSystem을 추가해 주어야 합니다.
2. [어셈블리] – [프레임워크]에서 찾아서 추가하면 됩니다.
3. 아래 화며처럼 프로젝트의 참조에 System.IO.Compression.FileSystem이 추가된 것을 확인할 수 있습니다.
4. 폴더 또는 파일을 압축하는 C# 소스
using System.IO; using System.IO.Compression; //압축할 폴더 string startPath = @“C:\Temp\Trans”; //압축 파일 이름 string zipPath = @“C:\Temp\Trans.zip”; //동일 이름의 압축파일이 있다면 먼저 파일을 삭제 if (File.Exists(zipPath)) File.Delete(zipPath); // 압축파일을 만듦 ZipFile.CreateFromDirectory(startPath, zipPath); |
File을 쉽게 사용하기 위해 using System.IO;를 추가했고, ZipFile을 쉽게 사용하기 위해 using System.IO.Compression;을 추가했습니다.
ZipFile.CreateFromDirectory의 매개변수로 Compression Level을 지정할 수 있습니다.
- CompressionLevel.Optimal = 0 : 압축을 완료하는 데 시간이 더 걸리더라도 압축 작업은 최적으로 압축되도록 수행합니다. (Default)
- CompressionLevel.Fastest = 1 : 압축 작업은 결과 파일이 최적으로 압축되지 않더라도 가능한 신속하게 완료되도록 수행합니다.
- CompressionLevel.NoCompression = 2 : 파일에 대한 압축을 수행하지 않습니다.
C#에서 압축을 해제하는 방법
– 압축 파일을 선택해서 지정한 폴더에 압축을 푸는 C# 프로그램의 예제 소스입니다.
OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = “Trans.zip 파일 선택”; ofd.FileName = “Trans.zip”; ofd.Filter = “압축 파일 (*.zip) | *.zip”; //파일 오픈창 로드 DialogResult dr = ofd.ShowDialog(); //OK버튼 클릭시 if (dr == DialogResult.OK) { //File경로와 File명을 모두 가지고 온다. string zipPath = ofd.FileName; //먼저 Trans 폴더를 삭제한다.(폴더에 있는 모든 파일을 삭제하기 위해) if (Directory.Exists(@“C:\Temp\TRANS”)) { Directory.Delete(@“C:\Temp\TRANS”, true); } //Trans.zip 파일의 압축을 푼다. ZipFile.ExtractToDirectory(zipPath, @“C:\Temp\TRANS”); } |
ZipFile.ExtractToDirectory을 사용하여 압축 파일을 쉽게 풀 수가 있습니다.
C#에서 메일에 파일을 첨부해서 보내는 방법
FileInfo를 쉽게 사용하기 위해 using System.IO;를 추가하고, MailMessage와 SmtpClient를 쉽게 사용하기 위해 using System.Net.Mail;을 추가했습니다.
using System.IO; using System.Net.Mail; //파일 크기 체크 FileInfo fi = new FileInfo(@“C:\Temp\Trans.zip”); long size = fi.Length; if (size > 30000000) //30MB 초과여부 체크 { MessageBox.Show(“첨부파일의 용량이 너무 큽니다.” + Environment.NewLine + “다른 경로를 통해 메일을 전송해 주세요.”); return; } Attachment att = new Attachment(@“C:\Temp\Trans.zip”); MailMessage _message = new MailMessage(); _message.From = new MailAddress(“abc@abc.co.kr”, “발신자”, System.Text.Encoding.UTF8); _message.To.Add(“def@abc.co.kr”); //수신 _message.CC.Add(“hij@abc.co.kr”); // 참조 _message.Subject = “Trans 폴더 전송 _ “ + DateTime.Now.ToString(“yyyy-MM-dd hh:mm:ss”); _message.SubjectEncoding = System.Text.Encoding.UTF8; _message.Body = _message.Subject; //본문 내용은 직접 입력하면 됨 _message.IsBodyHtml = true; //내용에 html이 포함된 경우 _message.BodyEncoding = System.Text.Encoding.UTF8; _message.Attachments.Add(att); //파일 첨부 SmtpClient server = new SmtpClient(“100.100.100.100”, 25); //smtp서버 주소 server.UseDefaultCredentials = false; server.EnableSsl = false; server.DeliveryMethod = SmtpDeliveryMethod.Network; server.Credentials = new System.Net.NetworkCredential(“”, “”); server.Send(_message); att.Dispose(); MessageBox.Show(“메일로 전송하였습니다.”); |
파일 크기가 30MB 초과하는 경우 메일 보내기가 되지 않도록 체크 구문을 앞에 두었습니다.
To.Add()와 CC.Add()를 사용하여 여러 사람에게 동시에 메일을 보낼 수가 있습니다.
마무리
이상으로 C#에서 파일이나 폴더를 압축하고 메일에 첨부해서 보내기 하는 방법에 대해 알아보았습니다.
업무에 유용하게 쓰이길 바랍니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^