상세 컨텐츠

본문 제목

ASP.net SMTP 메일 첨부파일 방법

IT/ASP.net

by pandada 2020. 11. 3. 14:50

본문

반응형

 

 

ASP. net SMTP 메일 첨부파일 방법

 

 

요즘 시간이 없기 때문에... 코드 관련해서 내용을 오랜만에 올리는 부분...

 

뭐 일단 그전에는 그냥 메일만 보내는 것을 알아봤는데.. 

 

과연 사람들이 메일의 내용만 글을 보낼까? 첨부파일도 당연히 첨부 하겠지...

 

그런의도로 이제 메일 관련되서 추가 내용을 작성해보도록 한다...

 

그리고 추가로 일단 필자는.. 네이버나 지메일로 받는 것이 아니라

 

다른 서버에서 메일을 받아볼 수 있도록 하는 것이 목표이므로

 

해당 내용은 뭐 회사에 근무하는 사람들이라면 약간의 도움이 될 수 있을 것으로 판단한다.

 

 

FileUpload 클래스 (System.Web.UI.WebControls)

사용자가 서버에 업로드할 파일을 선택하는 데 사용할 수 있는 TextBox 컨트롤과 찾아보기 단추를 표시합니다.Displays a text box control and a browse button that enable users to select a file to upload to the server.

docs.microsoft.com

자 일단 가장 기본부터 시작해보자 일단 파일첨부를 위해서는

 

Asp에서 기본적으로 제공하는 FileUpload 클래스를 이해하는것 부터 시작해보자.

 

정말 간단하다. 그냥 asp를 이용하여 input 박스의 타입만 Fileupload로 작성하면된다.

 

자 그럼 솔직히 이것도 모르는 사람들이 있을수도 있으니까 이건 어떻게 쓰냐?!

 

<asp:FileUpload id="FileUpload1" runat="server"> </asp:FileUpload>

정말 간단하게 이렇게 한 줄 사용하면 된다. 그러면 알아서 표기가 된다..

 

이 내용의 상세한것은 내가 항상 누누히 얘기하는것 처럼.. API문서를 꼭 참고하자.

 

그럼 솔직히 아무것도 모르는 사람도 약간의 이해만 있다면 작성할 수 있으니까..

 

위의 코드를 사용할 경우에 화면은

 

< FileUpload 화면 >

일단 기본적으로는 이렇게 파일을 선택하게끔 나온다.

 

버튼 클릭도 매우 쉽고.. 자 그럼 여기서 파일을 선택할 경우에는 어떻게 될까?

 

 

< 파일 첨부 할 경우 >

정말 간단하게 원본 파일의 이름만 표기가 된다. 솔직히 말해서 일반 파일 경로를 올릴 경우

 

전체 경로가 필요가 없으니까.. 그리고 가장 중요한거는 마이크로소프트사에서

 

기본적인 보안을 위해서는 예전 버전에서는 전체 경로가 확인이 되지만..

 

이제는 전체 경로가 보안문제로 인해서 확인을 할 수가 없게 되었다...

 

자 그러면 어떻게 해야될까.. 네이버나 구글 그런곳에서는 그냥 가장 기본적인 코드를 사용하면 된다.

 

자 그럼 일단 가장 기본적인 코드부터 보고 가보자.

 

< 경로를 확인할 수 없다. >

이렇게 경로를 정확하게 알 수가 없다. 그렇기 때문에.. 이제 어떻게 진행을 해야할까

 

일단 진행하기에 앞서 가장 근본적인 내용을 확인해보자.

 

해당건에 대해서 내가 확인한 exception은 대략 이렇게 되어있다.

$exception
{"SaveAs 메서드는 루트 경로를 사용하도록 구성되었지만 'KakaoTalk_2020.png'은(는) 루트 경로가 아닙니다."}
System.Web.HttpException

일단 내가 발견한 exception이다. 간단하게 생각해보면.. SaveAs에서 메소드 경로를 확인하였지만...

 

메소드 경로가 확인이 안된다. 추가로 그렇다면 근본적으로 루트를 지정해주면 어떨까?!

 

생각하였지만 일단 가장큰 문제가 있다. 사람들이 과연 지정된 루트에 있는 파일만 올리세요.

 

이렇게 문구를 쓴다 한들 과연 이걸 그대로 진행할까?! 일단 그게 1차적인 의문.

 

그리고 왜 굳이 서버단의 메일을 이렇게 진행을 할까?! 그런 의문점이 든다.

 

자 그럼 필자는 이런 문제점을 해결하기 위해서 메일받은 서버에서 간단하게

 

첨부를 한 다음에 파일이 첨부가 되면 바로 그 즉시에 저장을 하도록 해놨다.

 

그리고 추가로 새로고침이나 예외사항이 발견되어서 종료될 경우 바로 해다이 경로의

 

파일이 삭제 되도록 진행을 해보았다. 추가로 메일이 전송되면 바로 또 삭제가 되도록..

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net.Mail;
using System.IO;
using System.Collections.ObjectModel;
using System.Net.Mime;

public partial class mail_test : PageBase
{
    protected void Regist(object sender, EventArgs e)
    {
        MailMessage mail = new MailMessage();
        String savePath = @"c:\temp\uploads\";
        string product1 = DropDownList1.SelectedItem.Text;
        string product2 = DropDownList2.SelectedItem.Text;
        if (FileUpload1.HasFile)
        {
            String fileName = FileUpload1.FileName;

            savePath += fileName;

            FileUpload1.SaveAs(savePath);
        }
        else
        {
        }

        try
        {
            string user = string.Empty;                   // 작성자
            string email = B.Post("cemail");                 // 이메일 아이디
            string title = B.Post("ctitle");                 // 제목
            string company = B.Post("ccompany");               // 회사명
            string message = Request.Form["cmessage"];       // 내용

            // 보내는 사람 메일, 이름, 인코딩(UTF-8)
            mail.From = new MailAddress(email, user, System.Text.Encoding.UTF8);
            // 받는 사람 메일
            mail.To.Add("받는사람메일");
            // 메일 제목
            mail.Subject = title + "";
            // 본문 내용
            mail.Body += "이름 : " + name + "<br/>";
            
            mail.Body += "내용 : " + message + "" + "<br/>";

            // 본문 내용 포멧의 타입 (true의 경우 Html 포멧으로)
            mail.IsBodyHtml = true;
            // 메일 제목과 본문의 인코딩 타입(UTF-8)
            mail.SubjectEncoding = System.Text.Encoding.UTF8;
            mail.BodyEncoding = System.Text.Encoding.UTF8;

            if (!savePath.Equals(""))
            {
                mail.Attachments.Add(new Attachment(savePath));
            }

            // smtp 서버 주소
            SmtpClient SmtpServer = new SmtpClient("SMTP서버");
            // smtp 포트
            SmtpServer.Port = 25;
            // smtp 인증
            SmtpServer.Credentials = new System.Net.NetworkCredential("계정", "비밀번호");
            // SSL 사용 여부
            SmtpServer.EnableSsl = true;
            // 발송
            SmtpServer.Send(mail);

        }
        catch (FileNotFoundException)
        {
            Javascript.AlertBack("The file or directory cannot be found.");
        }
        finally
        {
            // 첨부 파일 Stream 닫기
            foreach (var attach in mail.Attachments)
            {
                attach.ContentStream.Close();
            }

            Javascript.AlertBack("메일을 보냈습니다.");

            if (System.IO.File.Exists(savePath))
            {
                try
                {
                    System.IO.File.Delete(savePath);
                }
                catch (Exception)
                {
                }
            }
        }
       
    }

    public override void VerifyRenderingInServerForm(System.Web.UI.Control control)
    {
        // Confirms that an HtmlForm control is rendered for the specified ASP.NET server control at run time.
    }
}

자 위의 코드를 확인했을 때에 일단 내용은 대략적으로 이렇다.

 

1. 서버의 C드라이브 경로에 temp파일의 경로를 만든다.

 

2. 해당 경로에서 첨부된 파일을 저장시킨다.

 

3. 해당 첨부된 파일의 전체 경로를 통해서 메일을 보낸다.

 

4. 해당 파일을 이제 삭제한다.

 

이런식으로 구성을 하였다. 원래는 전체 코드를 굳이 다 보여줘야하나.. 이런 의문이 들긴 하지만

 

그래도 뭐 나중에 만약에 나중에 내가 필요할 수도 있으니까... 한번 이렇게 해보았다.

 

필요한 내용이 있을 수도 있고, 없을 수도 있기 때문에 한번 그래도 참고해서 보는 것을

 

추천한다. 자 그리고 추가로 그냥 네이버나 gmail 사용해서 메일 보낼 경우에는

 

굳이 이런 번거로운 작업을 할 필요가 없다. 그러면 이제 다음에는

 

1개의 파일이 아니라 여러 파일을 첨부하는 방법과 

 

바이러스의 감염을 막기위해 특정 파일의 확장자만 할 수 있도록 진행해보자.

반응형

'IT > ASP.net' 카테고리의 다른 글

IIS 신규 사이트 추가 (ASP.NET 3.5 설치)  (0) 2022.06.14
윈도우 10 / IIS 세팅  (0) 2022.06.13
ASP.net SMTP 메일보내기  (0) 2020.10.23

관련글 더보기

댓글 영역