ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [php] php의 mail() 함수로 구글 이메일 보내기 / XAMPP 서버 및 aws의 EC2 / php mail function to send Gmail at XAMPP and AWS EC2 not working / Username and Password not accepted.
    앱 개발/오류모음 - Flutter 2023. 1. 6. 23:50
    반응형

    파이어베이스를 이용하면 사용자들에게 안내 이메일을 쉽게 보낼 수 있지만, 파이어베이스를 사용하지 않는 경우, 다른 방법으로 이용자들에게 메일을 보내야한다. 이 글에서는 php의 mail 함수를 이용하여 메일 보내는 방법을 알아본다.

     

    XAMPP (local)

    로컬에서 메일을 자동으로 보내는 방법을 알아보자. 

    Apache 서버가 구동되었다면, Config에서 PHP (php.ini)로 간다. 이후 다음과 같이 변경한다.

    아래 네 변수를 각각 찾는다. 만약 주석처리가 되어있다면, 주석처리를 풀고 적어주어야한다. txt파일로 열었을 때 아래 네 줄 앞에 세미콜론(;)이 붙어있다면 그걸 지우고 뒤에 값을 바꿔주면 된다는 뜻이다. 

    SMTP=smtp.gmail.com
    smtp_port=587
    sendmail_from = example@gmail.com  /*보낼 이메일(Gmail 작성)*/
    sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"

    이후, C드라이브의 xampp, sendmail 내에 sendmail 파일을 찾는다. 이 파일을 수정할건데,  위와 같은 방법으로 아래 7줄을 수정해준다. 이 때 비밀번호가 필요한데, 그것은 우리가 로그인 할 때 들어가는 비밀번호가 아니다.

    smtp_server=smtp.gmail.com
    smtp_port=587
    error_logfile=error.log
    debug_logfile=debug.log
    auth_username=example@gmail.com  /*보내는 이의 Gmail 주소*/
    auth_password=**********  /*비밀번호(이 비밀번호는 단순히 계정 비밀번호가 아님)*/
    force_sender=example@gmail.com  /*선택사항*/

     

    보내는 이의 구글 계정으로 들어가, 저기에 넣을 특별한 비밀코드를 받아보겠다.

    만약, 이 방법으로 하지 않고 그냥 본인의 로그인용 비밀번호를 입력한다면 다음과 같은 오류가 뜰 것이다.

    Username and Password not accepted.

    Less secure apps & your Google Account. 이것이 우리가 돌아돌아 이 문제를 해결해야만 하는 주된 원인이다 ㅠㅠ 보안 수준이 낮은 앱 액세스는 종료되었다. 그래서 특정 PHP로 우리가 Gmail에 접근할 수 있도록 허락해주는 과정이 필요하다. 

    일단 위와 같이, 보내는 이의 계정 > 보안 탭에 들어가서, 2단계 인증을 설정해주어야한다. 

     

    이후 2단계 인증을 했으면 앱비밀번호를 만들 수 있다.

    나는 제목을 smtp라고 하고, 생성했다. 이 때 코드 6자리가 뜨는데 잘 복사해두어야한다. 한번 창을 없애면 확인할 방법이 없는 것 같다..

    앱 비밀번호가 생성되었고, 이게 우리가 그 파일에 알려줄 비밀번호였던 것이다 !! 

    auth_password=**********

    (위를 참고) 다음과 같이, 앱 비밀번호로 받은 걸 복사해서 넣어준다.

     

     

     

     

     

     

    이후, 아래와 같이 php 코드를 작성한다. post 방식으로 user_email을 받아오는데, 그냥 문자열로 넣어도 무관하다. 

    반응형
    <?php	
    try{
        // 학교 계정, 네이버, 구글, 다음까지 다 가능 !!!!!
        $to_email = $_POST['user_email'];
        $from_email = "Organization"; //보내는 이의 이름이 이걸로 표시된다.
    
    
        // 제목
        $subject = $_POST['title'];
        // 내용
        $body = $_POST['content'];
    
    
        // 한글 안깨지게
        $subject = "=?UTF-8?B?".base64_encode($subject)."?=";
        // 메일 헤더
        $headers = "From: $from_email<do-not-reply@a.com>\r\nMIME-Version: 1.0\r\nContent-Type: text/html; charset=utf-8\r\nContent-Transfer-Encoding: base64\r\n";
        // 메일 콘텐츠
        $content = "<html lang='ko'><head><meta charset='utf-8'/></head><body>$body</body></html>";
        // 메일 전송
    
    
    
        if (mail($to_email, $subject, chunk_split(base64_encode($content)), $headers)){
            echo json_encode(array("success" => true));
        }
        
        else
        
        {
            echo json_encode(array("success" => false));
        }
    }
    catch (Exception $e) {
        echo json_encode(array("connection" => $e));
    }
    
    ?>

    한글인 경우 자주 깨졌다. 그래서 위와 같이 조취를 취해줬다.  

     $subject = "=?UTF-8?B?".base64_encode($subject)."?=";

    이 코드로 제목이 깨지지 않도록 해주었다. 

    $content = "<html lang='ko'><head><meta charset='utf-8'/></head><body>$body</body></html>";

    위 코드로 내용이 깨지지 않도록 해주었다. 내용은 제목의 코드처럼 했을 때 한글로 나타나지 않는 경우가 많았다. 그래서 html로 감싸서 한글로 보이게 만들어주었다.

     

     

     

     

     

     

    AWS EC2

     

    * AWS에 더 좋은 서비스가 있을 수 있으니 더 알아보고 구현하는 것을 권장함.

     

     

    똑같이 코드를 작성한다. 하지만 이 코드를 EC2 환경에서 돌리기 위해서는 다른 루트를 타야한다. 

    콘솔창에서 postfix를 설치해준다. 설치 시 팝업창이 안꺼지는 상황이 발생할 수 있는데, Tab 하여 빨간색 직사각형이 OK를 가리키면 엔터를 누르면 된다. 

    sudo apt-get install postfix

     

    그리고 /etc/postfix/main.cf를 수정해야한다. 원본 파일과 아래를 잘 비교하면서, 파일의 맨 마지막부분을 수정/추가 하면 된다.

    smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
    myhostname = email.myownserver.com # Change this to your own server name
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    myorigin = /etc/mailname
    mydestination = $myhostname, email.myownserver.com, localhost
    relayhost = [smtp.gmail.com]:587
    mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
    mailbox_size_limit = 0
    recipient_delimiter = +
    inet_interfaces = all
    inet_protocols = all
    
    # Enable SASL authentication
    smtp_sasl_auth_enable = yes
    # Disallow methods that allow anonymous authentication
    smtp_sasl_security_options = noanonymous
    # Location of sasl_passwd
    smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
    # Enable STARTTLS encryption
    smtp_tls_security_level = encrypt
    # Location of CA certificates
    smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

     

    이후,  /etc/postfix/sasl/sasl_passwd라는 파일을 하나 만든다. (파일 작성은 sudo vim을 이용한다.)

    그 파일에 아래 내용을 담는다. 

    [smtp.gmail.com]:587 example@gmail.com:앱비밀번호

    example@gmail.com에 보내는 이의 이메일을 넣고, 콜론 뒤에 앱비밀번호를 입력한 후 저장한다. (저장은 :wq를 이용한다.)

    sudo chown root:root /etc/postfix/sasl/sasl_passwd
    sudo chmod 0600 /etc/postfix/sasl/sasl_passwd

    이후 권한 설정을 위해 위의 두 커맨트를 입력한다.

     

     

     

    또한, 아래 커맨드를 작성한다. 그리하여 새로운 sasl_passwd.db 파일이 형성된다.

    sudo postmap /etc/postfix/sasl/sasl_passwd

    테스트를 해보기 위해 아래와 같이 예제 커맨드를 쳐보자 !

    echo "Hello Postfix" | mail -s "Postfix configured" -a "From:보내는이이메일@gmail.com" 받은이메일@gmail.com

    그러면 이메일이 간다 슝 ~~

     

     

     

     

    혹시 아무 일도 일어나지 않았을 경우, 아래를 추가적으로 시도해보자.

    /etc/php/8.1/fpm/php.ini에서 다음 두 줄을 찾아 아래와 같이 수정한다.

    SMTP=smtp.gmail.com
    smtp_port=587
    sendmail_from = example@gmail.com  /*보낼 이메일(Gmail 작성)*/
    sendmail_path = "/usr/sbin/sendmail -t -i -f example@gmail.com"

    sendmail 위치

     

     

    그래도 메일이 가지 않았을 경우, EC2에 sendemail을 설치하거나, 스팸메일을 확인해보자

     

     

     

     

     

    오늘 내가 하루종일 도전했던 php로 이메일 보내기에 대해 두가지 방법으로 알아봤다.

    로컬에서도, 서버에서도 되도록 !! 

    하지만 좀 더 알아보고 더 나은 방법을 찾아보도록 하자 ㅋㅋ php로 보내는 건 너무 무식한 방법인 것 같다.. ㅎㅎㅎ

    그래도 더 다양한 기능을 구현할 수 있다는 건 조금 이득이긴 하다 ㅎㅎ

     

     

     

     

     

     

    References

    https://serverfault.com/questions/119105/setup-ubuntu-server-to-send-mail

    https://www.youtube.com/watch?v=sCsMfLf1MTg

    https://www.milople.com/blogs/how-to-send-mail-from-localhost-xampp-using-gmail/

    https://askubuntu.com/questions/87872/how-do-i-accept-the-configuration-screen-that-pops-up-when-installing-postfix

    https://serverfault.com/questions/119105/setup-ubuntu-server-to-send-mail

     

     

     

     

     


    오류, 질문이 있으면 댓글달아주세요

    구독은 항상 환영입니다 :)


     

    반응형

    댓글

Designed by Tistory.