[php] [xampp] [php] php의 mail() 함수로 구글 이메일 보내기 / XAMPP 서버 및 aws의 EC2 / php mail function to send Gmail at XAMPP and AWS EC2 not working / Username and Password not accepted.

 

파이어베이스를 이용하면 사용자들에게 안내 이메일을 쉽게 보낼 수 있지만, 파이어베이스를 사용하지 않는 경우, 다른 방법으로 이용자들에게 메일을 보내야한다. 이 글에서는 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 환경에서 돌리기 위해서는 다른 루트를 타야한다. 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

콘솔창에서 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

 

 

 [출처] https://chocohaim1121.tistory.com/95

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
158 [php 응용개발] XE 템플릿 문법 file 졸리운_곰 2025.05.16 90
157 [php] PHP 보안강화 하기 졸리운_곰 2025.04.27 58
156 [php] php 와 javascript 차이 & 상호 간의 호출 방법 file 졸리운_곰 2024.08.13 99
155 [php] html 파일안의 php 코드 실행하기 : Apache 2 server on ubuntu can't parse php code inside html file 졸리운_곰 2024.08.13 86
154 [php] 리눅스 (유닉스 ) 계열에서 php로 마이크로소프트 MS SQL 서버 접속 : Microsoft Drivers for PHP for SQL Server의 Linux 및 macOS 설치 자습서 졸리운_곰 2024.08.07 89
153 PHP 실행 지연(delay) 시키기 졸리운_곰 2024.07.07 86
152 [PHP] 문자열 비교하기 - ===, strcmp(), strcasecmp(), strncmp() 졸리운_곰 2024.07.07 117
151 [PHP] 외부 URL의 내용 얻어오기(cURL, file_get_contents) 졸리운_곰 2024.07.07 276
150 [PHP] CURL를 활용하여 POST방식으로 JSON데이터 주고 받기 졸리운_곰 2024.06.21 138
149 [MySQL+PHP] MySQL 접속후 데이터 가져오기 졸리운_곰 2024.04.18 108
148 [php] [xampp] xampp php 버전 폴더 (디렉토리) 별 설정 : Running multiple PHP versions on XAMPP file 졸리운_곰 2024.03.21 1067
147 [php] [PHP] Laravel - PayPal 결제 모듈 연동하기 (2) - 백엔드 처리 file 졸리운_곰 2024.03.17 102
146 [php] [PHP] Laravel - PayPal 결제 모듈 연동하기 (1) file 졸리운_곰 2024.03.17 199
145 [php] PHP - Show JSON array in html table 졸리운_곰 2024.02.18 81
144 [php] php / string을 json으로 변환 한 뒤 값 가져오기 졸리운_곰 2024.02.18 107
143 [php] Low Code Web Content Server: Making Marks on the Digital Shore. An Anecdotal View. : 로우 코드 웹 콘텐츠 서버: 디지털 해안에 흔적을 남기다. 일화적인 견해. file 졸리운_곰 2024.02.18 90
» [php] [xampp] [php] php의 mail() 함수로 구글 이메일 보내기 / XAMPP 서버 및 aws의 EC2 / php mail function to send Gmail at XAMPP and AWS EC2 not working / Username and Password not accepted. file 졸리운_곰 2023.09.12 154
141 [php] PHP / MariaDB / 데이터베이스 값 가져와서 출력하기 졸리운_곰 2023.06.22 91
140 [php] Start Using HTML5 WebSockets Today With a PHP Server 지금 PHP 서버에서 HTML5 WebSocket 사용 시작 졸리운_곰 2023.05.09 143
139 [php] json_encode 유니코드 한글 깨짐 해결방법 졸리운_곰 2023.02.04 157
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED