2026. 8. 4. 09:50ㆍ파이썬
Python 프로그램에서 Gmail을 통해 메일을 발송하려면 Gmail 계정의 앱 비밀번호를 생성하고, Gmail SMTP 서버에 연결해야 합니다.
⚠️ 일반 Google 계정 비밀번호는 사용하지 않습니다.
목차
- Gmail 계정 준비
- 2단계 인증 활성화
- 앱 비밀번호 메뉴 찾기
- 앱 비밀번호 생성
- 앱 비밀번호 보안 안내
- Gmail SMTP 서버 정보
- Python에서 메일 발송하기
- 인증정보 소스 코드 분리
- 네트워크 및 방화벽 확인
- 메일 발송 테스트 순서
- 자주 발생하는 오류
- 앱 비밀번호 관리
- 최종 체크리스트
1. Gmail 계정 준비
메일 발송에 사용할 Gmail 계정을 준비합니다.
예:
example@gmail.com
SMTP 로그인 시 이 Gmail 주소가 사용자 이름으로 사용됩니다.
2. Google 계정의 2단계 인증 활성화
앱 비밀번호를 생성하려면 먼저 Google 계정의 2단계 인증이 활성화되어 있어야 합니다.
Google 계정 관리 화면에서 다음 순서로 이동합니다.
Google 계정
→ 보안 및 로그인
→ 2단계 인증
2단계 인증이 꺼져 있다면 안내에 따라 활성화합니다. 2단계 인증 방법으로는 다음과 같은 방식이 사용될 수 있습니다.
- Google 메시지
- 휴대전화 인증
- OTP 인증 앱
- 패스키
- 보안 키
2단계 인증이 이미 활성화되어 있다면 다음 단계로 이동합니다.
3. 앱 비밀번호 메뉴 찾기
Google 계정 화면에서 앱 비밀번호 메뉴가 바로 보이지 않을 수 있습니다.
이 경우 Google 계정 상단의 검색창에 다음과 같이 입력합니다.
앱 비밀번호
검색 결과에서 앱 비밀번호를 선택합니다. 또는 Google 계정의 앱 비밀번호 페이지로 직접 이동할 수도 있습니다.
https://myaccount.google.com/apppasswords
앱 비밀번호 메뉴가 표시되지 않는 경우에는 다음 사항을 확인합니다.
- Google 계정의 2단계 인증이 활성화되어 있는지
- 회사 또는 학교의 Google Workspace 계정인지
- 조직 관리자가 앱 비밀번호 사용을 차단했는지
- Google 고급 보호 프로그램을 사용하고 있는지
- 보안 정책상 앱 비밀번호 생성이 제한된 계정인지
개인 Gmail 계정이고 2단계 인증이 활성화되어 있다면 일반적으로 앱 비밀번호를 생성할 수 있습니다.
4. 앱 비밀번호 생성
앱 비밀번호 화면에서 사용할 프로그램을 구분할 수 있는 이름을 입력합니다.
예:
Python SMTP
또는:
Mail Sender
이 이름은 앱 비밀번호의 용도를 구분하기 위한 이름일 뿐이며, SMTP 설정값에는 사용하지 않습니다.
이름을 입력한 뒤 만들기를 누르면 16자리 앱 비밀번호가 생성됩니다.
예:
abcd efgh ijkl mnop
앱 비밀번호는 생성될 때 한 번만 표시됩니다.
SMTP 프로그램에는 공백을 제외하거나 포함한 형태로 입력할 수 있지만, 일반적으로 다음처럼 공백 없이 저장합니다.
abcdefghijklmnop
일반 Google 계정 비밀번호가 아니라 반드시 생성된 앱 비밀번호를 사용해야 합니다.
앱 비밀번호의 보안 안내
앱 비밀번호 화면에는 다음과 같은 경고 문구가 표시될 수 있습니다.
앱 비밀번호는 최신 보안 표준을 사용하는 앱 및 서비스보다 보안 수준이 낮습니다.
이 문구는 앱 비밀번호 자체가 위험하거나 계정에 문제가 있다는 뜻은 아닙니다.
앱 비밀번호는 웹브라우저에서 사용하는 다음과 같은 최신 로그인 방식을 사용할 수 없는 프로그램을 위한 기능입니다.
- 패스키
- 생체 인증
- Google 로그인 화면
- 2단계 인증 확인
- OAuth 2.0
SMTP 프로그램은 보통 사용자 이름과 비밀번호 방식으로 로그인하기 때문에, Google이 SMTP용으로 별도의 앱 비밀번호를 제공하는 것입니다.
앱 비밀번호의 장점
- 실제 Google 계정 비밀번호를 프로그램에 입력하지 않아도 됩니다.
- 특정 프로그램에만 별도의 비밀번호를 사용할 수 있습니다.
- 비밀번호가 노출되면 해당 앱 비밀번호만 삭제할 수 있습니다.
- Google 계정의 기본 비밀번호를 변경할 필요가 없습니다.
- 앱별로 서로 다른 비밀번호를 만들 수 있습니다.
예를 들어 Python SMTP용 앱 비밀번호가 노출되었다면 Google 계정의 앱 비밀번호 화면에서 해당 비밀번호를 삭제하면 됩니다.
다만 앱 비밀번호를 가진 사람은 해당 계정의 SMTP 기능을 이용할 수 있으므로 일반 비밀번호처럼 안전하게 관리해야 합니다.
운영 서비스나 보안 요구 수준이 높은 시스템에서는 앱 비밀번호보다 OAuth 2.0 인증 방식이 더 적합할 수 있습니다. 교육용 프로그램이나 개인 자동화에서는 앱 비밀번호 방식이 구현하기 쉽습니다.
5. Gmail SMTP 서버 정보
STARTTLS 방식
항목 설정값
| SMTP 서버 | smtp.gmail.com |
| 포트 | 587 |
| 인증 | 사용 |
| STARTTLS | 사용 |
| 사용자 이름 | Gmail 주소 |
| 비밀번호 | 앱 비밀번호 |
일반적으로 포트 587과 STARTTLS 방식을 권장합니다.
SSL 방식
항목 설정값
| SMTP 서버 | smtp.gmail.com |
| 포트 | 465 |
| SSL | 사용 |
| 사용자 이름 | Gmail 주소 |
| 비밀번호 | 앱 비밀번호 |
587과 465를 혼합해서 설정하면 SSL 오류가 발생할 수 있으므로 한 가지 방식만 선택해야 합니다.
6. Python에서 메일 발송하기
Python의 기본 라이브러리인 smtplib와 email을 사용하면 별도의 패키지 설치 없이 메일을 발송할 수 있습니다.
import smtplib
from email.message import EmailMessage
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 587
GMAIL_USERNAME = "example@gmail.com"
GMAIL_APP_PASSWORD = "abcdefghijklmnop"
message = EmailMessage()
message["Subject"] = "Gmail SMTP 발송 테스트"
message["From"] = GMAIL_USERNAME
message["To"] = "receiver@example.com"
message.set_content("Python에서 발송한 테스트 메일입니다.")
try:
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as smtp:
smtp.starttls()
smtp.login(GMAIL_USERNAME, GMAIL_APP_PASSWORD)
smtp.send_message(message)
print("메일 발송이 완료되었습니다.")
except smtplib.SMTPAuthenticationError:
print("SMTP 인증에 실패했습니다. Gmail 주소와 앱 비밀번호를 확인하세요.")
except smtplib.SMTPException as error:
print(f"메일 발송 중 SMTP 오류가 발생했습니다: {error}")
except Exception as error:
print(f"메일 발송 중 오류가 발생했습니다: {error}")
SMTP 로그인 정보는 다음과 같이 사용됩니다.
사용자 이름 = Gmail 전체 주소
비밀번호 = 16자리 앱 비밀번호
일반 Google 계정 비밀번호는 입력하지 않습니다.
7. 인증정보를 소스 코드에서 분리하기
교육 초기에는 소스 코드에 값을 직접 입력할 수 있지만, 실제 프로젝트에서는 앱 비밀번호를 소스에 작성하지 않는 것이 좋습니다.
환경변수 설정 예시
GMAIL_USERNAME=example@gmail.com
GMAIL_APP_PASSWORD=abcdefghijklmnop
Python에서는 다음과 같이 읽습니다.
import os
GMAIL_USERNAME = os.getenv("GMAIL_USERNAME")
GMAIL_APP_PASSWORD = os.getenv("GMAIL_APP_PASSWORD")
if not GMAIL_USERNAME or not GMAIL_APP_PASSWORD:
raise ValueError("Gmail SMTP 인증정보가 설정되지 않았습니다.")
.env 파일을 사용할 경우에는 해당 파일을 GitHub에 올리지 않아야 합니다. .gitignore 파일에 다음 내용을 추가합니다.
.env
8. 네트워크 및 방화벽 확인
메일을 발송하는 PC나 서버에서 다음 주소와 포트에 접속할 수 있어야 합니다.
smtp.gmail.com:587
또는 SSL 방식을 사용한다면:
smtp.gmail.com:465
회사 네트워크나 서버 환경에서는 보안 정책으로 외부 SMTP 포트가 차단될 수 있습니다.
인증정보가 정확한데도 연결 시간 초과가 발생한다면 다음 사항을 확인합니다.
- 인터넷 연결 상태
- 회사 방화벽 정책
- 서버의 아웃바운드 포트 제한
- 보안 프로그램의 SMTP 차단 여부
- DNS에서 smtp.gmail.com을 조회할 수 있는지
9. 메일 발송 테스트 순서
처음부터 여러 수신자에게 발송하지 말고 다음 순서로 테스트하는 것이 좋습니다.
1. 발신 Gmail → 동일한 Gmail 계정
2. 발신 Gmail → 다른 Gmail 계정
3. 발신 Gmail → Outlook 또는 다른 외부 메일
4. 발신 Gmail → 회사 메일
메일이 도착하지 않으면 받은편지함뿐 아니라 스팸함도 확인합니다.
10. 자주 발생하는 오류
인증 실패
SMTPAuthenticationError
Username and Password not accepted
확인할 내용:
- 일반 Google 비밀번호를 입력하지 않았는지
- 16자리 앱 비밀번호를 사용했는지
- Gmail 주소 전체를 사용자 이름으로 입력했는지
- 앱 비밀번호를 복사하면서 일부 문자가 빠지지 않았는지
- 앱 비밀번호를 삭제한 적이 없는지
연결 시간 초과
Connection timed out
확인할 내용:
- 인터넷 연결
- 방화벽
- smtp.gmail.com 접속 가능 여부
- 포트 587 또는 465 허용 여부
SSL 또는 TLS 오류
SSL error
TLS error
Wrong version number
다음 설정 조합을 확인합니다.
포트 587 → smtplib.SMTP() + starttls()
포트 465 → smtplib.SMTP_SSL()
포트 465에서 starttls()를 사용하거나, 포트 587에서 처음부터 SMTP_SSL()을 사용하면 오류가 발생할 수 있습니다.
11. 앱 비밀번호 관리
앱 비밀번호는 Google 계정의 앱 비밀번호 화면에서 관리할 수 있습니다.
다음과 같은 경우에는 기존 앱 비밀번호를 삭제하고 새로 만드는 것이 좋습니다.
- 비밀번호가 외부에 노출된 경우
- GitHub에 실수로 등록한 경우
- 사용하지 않는 프로그램의 비밀번호인 경우
- 어느 프로그램에서 사용하는 비밀번호인지 알 수 없는 경우
- 프로그램이나 서버를 폐기한 경우
앱 비밀번호를 삭제하면 해당 비밀번호를 사용하던 SMTP 프로그램은 더 이상 로그인할 수 없습니다.
최종 체크리스트
- [ ] Gmail 계정을 준비했다.
- [ ] Google 계정에서 2단계 인증을 활성화했다.
- [ ] 메뉴가 보이지 않을 경우 검색창에서 앱 비밀번호를 검색했다.
- [ ] 앱 비밀번호를 생성했다.
- [ ] SMTP 사용자 이름에 Gmail 전체 주소를 입력했다.
- [ ] 일반 계정 비밀번호 대신 앱 비밀번호를 입력했다.
- [ ] SMTP 서버를 smtp.gmail.com으로 설정했다.
- [ ] 포트 587과 STARTTLS를 사용했다.
- [ ] 인증정보를 환경변수로 관리했다.
- [ ] .env 파일을 Git 저장소에서 제외했다.
- [ ] 방화벽에서 SMTP 접속이 가능한지 확인했다.
- [ ] 테스트 메일 발송을 완료했다.
- [ ] 노출된 앱 비밀번호는 즉시 삭제하고 다시 생성했다.
'파이썬' 카테고리의 다른 글
| 공공데이터 API 연동 샘플 만들기: 기상청 단기예보 API를 Python으로 호출하고 Gmail로 공유하기 (0) | 2026.08.04 |
|---|---|
| 공공데이터포털 오픈 API 신청 및 활용 가이드 (0) | 2026.08.04 |
| 텔레그램 봇으로 Google Calendar 일정 관리하기 (0) | 2026.07.25 |
| 파이썬으로 텔레그램 Echo Bot 만들기 (0) | 2026.07.25 |
| 텔레그램 봇으로 Google Calendar 일정 등록하기 (0) | 2026.07.25 |