-
[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"
그래도 메일이 가지 않았을 경우, 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://serverfault.com/questions/119105/setup-ubuntu-server-to-send-mail
오류, 질문이 있으면 댓글달아주세요
구독은 항상 환영입니다 :)
반응형'앱 개발 > 오류모음 - Flutter' 카테고리의 다른 글