Windows Server 2019 - ASP를 이용한 SMTP 메일 발송

    ASP를 이용한 SMTP 메일 발송

    이것을 일종의 폼메일이라고도 합니다. 폼(Form)+메일(Mail) 합성어로 홈페이지에서 문의 양식을 작성하여 발송을 하면 서버의 SMTP 서비스를 통해 관리자나 또는 수신자에게 메일로 전달하는 것을 말합니다. 여기서의 포스팅은 폼은 제가 따로 가지고 있지 않기 때문에 메일 발송 소스만으로 어떻게 동작을 하는지에 대해서만 진행하도록 하겠습니다. 폼은 검색을 하다 보니 마이크로소프트에서 제공하는 Visual Studio를 이용하면 좀 더 편하게 진행할 수 있는 것으로 보여 추후 설치 및 폼메일 만드는 실습을 해보도록 하겠습니다.

    전제 조건

    SMTP 서버 설치

    IIS 세팅을 통해 도메인(바운딩)이 연결이 되어 있어야 합니다.

    ASP 기능 설치


    STEP01 → SMTP 서버 설치 및 기본 세팅

    포스팅 참고 : https://foxydog.tistory.com/56

     

    Windows Server 2019 - SMTP서버 설치 및 기본 세팅

    Windows Server 2019 - SMTP Server SMTP Server SMTP(Simple Mail Transfer Protocol) Server는 인터넷 메일서버에서 이메일(E-MAIL)을 주고받기 위한 전송 프로토콜입니다. TCP/IP 통신 포트는 25(Port)..

    foxydog.tistory.com

     

     

    STEP02 → ASP 메일 발송용 소스코드 작성

    ※ IIS에 eztest01.com이라는 사이트가 있다고 가정하에 진행합니다.

     

    2-1 해당 사이트의 실제 경로에서 구분을 위해 별도의 폴더(MAIL) 생성

     

    2-2 새로 만들기 ▷ 텍스트 문서 ▶ sendmail.txt 파일 생성

     

    ※ 진행하기전, ASP 메일 발송용 소스코드 참고

    Windows Server 2012 R2에서 테스트로 사용했던 소스코드로 Windows Server 2019에서도 잘 먹히는 것을 확인하였습니다. 개발자가 아니다 보니 소스코드를 제대로 보지는 못합니다. 다만 이렇게 작동이 된다는 원리만 참고해주시기 바랍니다. 필드 뒤에 따옴표( ' )는 주석으로 설명하기 위해 표시하거나 해당 기능을 일시적으로 사용하지 못하게 막기 위한 용도로 없어도 되는 값입니다.

    <%

    '///////////////////////////
    ' 메일발송 소스코드
    '///////////////////////////

     

        dim mail_from, mail_to, mail_cc, mail_subject, mail_body, mail_type
        dim objconf, Flds

     

        mail_from = request("mail_from")              '보내는 사람의 메일 주소
        mail_to = request("mail_to")                     '받는 사람의 메일 주소
        mail_cc = request("mail_cc")                     '참조

        mail_bcc = request("mail_bcc")                  '숨은 참조
        mail_subject = request("mail_subject")        '메일의 제목
        mail_body = request("mail_body")             '메일 내용
        mail_type = request("mail_type")               '메일 형식 ( 0 : HTML , 1 : TEXT )

     

       Set objMail = Server.CreateObject("CDO.Message")       'CDO 2.0 (메일 보내기 컴포넌트 개체 생성)

       objMail.From = "mail_from"                                     '메일을 보내는 사람의 이메일 주소

       objMail.To = "mail_to"                             '메일을 받는 사람의 이메일 주소 (여러 사람일 경우는 ; 표시로 구분)

     

        Set objconf = objMail.Configuration
        Set Flds = objconf.Fields

        Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 1  '1 (로컬 SMTP) / 2 (외부 SMTP)

        Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "127.0.0.1"  '메일서버 IP 또는 메일서버 URL

        Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25  '발송 포트 번호로 서브 포트(587), 보안 포트(465)

        Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverpickupdirectory") = "c:\Inetpub\mailroot\Pickup"

     

        '외부 SMTP 이용 시 아래 주석 제거

        'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpaccountname") = "계정 이름"   '사용자 이름

        'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendemailaddress") = "이메일"       '전자 메일 주소

        'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpuserreplyemailaddress")= "이메일"   '회신 전자 메일

        'Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1  'cdoBasic          'CDO 기본 인증

        'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "메일서버_아이디"      '메일서버의 계정 ID

        'Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "메일서버_비밀번호"    '메일서버의 계정 비밀번호

     

        Flds.update                              'SendUsing 관련 설정 끝

     

        objMail.Cc = mail_cc                  '메일 참조

        objMail.Bcc = mail_bcc               '숨은 참조

        objMail.Subject = "mail_subject"    '메일 제목

     

        'HTML 형식으로 보낼 건지 결정 (TEXT는 숫자 1)

        If mail_type = "0" Then

            objMail.HTMLBody = "mail_body"   'HTML 본문 내용 입력
        Else
            objMail.TextBody = "mail_body"    'TEXT 본문 내용 입력

       End if
        objMail.Send                           '메일 보내기 메서드(이 부분이 보내는 부분)

        Set objMail = Nothing

    %>

     

    2-3 메모장 sendmail.txt 에 소스코드 복사 후 저장

     

    2-4 .ASP 파일 확장자 변경

     

     

    STEP03 → 웹에서 ASP 파일을 불러오기 위한 ASP 기능 설치

    ※ ASP.NET이 아닌 ASP 기능을 별도로 추가하시면 됩니다.

    포스팅 참고 : https://foxydog.tistory.com/58

     

    Windows Server 2019 - ASP.NET 기능 설치

    Windows Server 2019 - INSTALL ASP.NET ASP.NET [설치 설명 참고] ASP (Active Server Pages)는 웹 사이트 및 웹 응용 프로그램을 작성하기 위한 서버 쪽 스크립트 작성 환경을 제공합니다. 마이크로소프트에서..

    foxydog.tistory.com

     

     

    STEP04 → 발송 테스트하기 위한 소스 수정 후 저장

    ※ 최소 필수 값만 확인 후 변경하시면 됩니다.

     

     

    STEP05 → 웹페이지에서 발송 소스 실행 - 1차시도(실패)

    http://eztest01.com/MAIL/sendmail.asp 페이지를 를 실행했으나 다음과 같은 오류가 발생했습니다.

    500 -Internal server error. (내부 서버 오류)

    There is a problem with the resource you are looking for, and it cannot be displayed.

    (찾고 있는 리소스에 문제가 있으며 표시할 수 없습니다.)

    해당 메시지는 대체로 파일에 접근할 권한이 없을 경우 많이 발생합니다. [로깅 메시지 확인]

    2021-02-17 06:51:40 192.168.150.136 GET /MAIL/sendmail.asp |43|80070005|Access_is_denied.__ 80

    바로 원인을 말씀드리자면 소스 필드 중

    Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverpickupdirectory")

    ="c:\Inetpub\mailroot\Pickup" 해당 경로가 발생하는 문제의 원인입니다.

    최초 메일을 발송하게 되면 Pickup 폴더 경로에 메일 원문 파일을 생성하게 됩니다. 그러나 웹에서 실행을 했기 때문에 그 권한을 가지고 있는 IIS가 Pickup 폴더에 접근할 권한이 없다 보니 내부 서버 오류를 발생하게 됩니다.

     

    ■ 해결방법

    해당 경로에 IIS가 실행할 수 있는 권한을 부여하면 됩니다.

    ① Pickup 폴더가 있는 상위 mailroot 폴더로 이동 [내 PC 로컬 디스크 (C:) ▷ inetpub ▶ mailroot] 후 속성 클릭

    ② 보안 탭 ▷ 편집 ▶ 추가

    ③ 사용자 또는 그룹 선택에서 고급 ▷ 지금 찾기 ▶ 결과에서 IIS_IUSRS 선택 ▷ 확인(추가)

    ④ 확인 추가 후 ▷ 쓰기 권한(체크) ▶ 적용 후 확인

     

     

    STEP06 → 웹페이지에서 발송 소스 실행 - 2차시도(정상)

    ※ 수신 확인

    ※ 로컬 내부 서버를 통해 발송된 SMTP 로그 확인

     

     

    마치며

    이번에는 예전에 테스트한 ASP소스를 가지고 진행을 하였습니다. 다음에는 ASP.NET을 이용해 폼메일 전체 소스를 만들어 발송하는 방법을 알아보도록 하겠습니다.

    Designed by JB FACTORY