ascii codec 오류 개요
ascii codec can’t encode characters in position 14-16, 최근 Python을 사용하여 Gmail SMTP 서버를 통해 이메일을 보내는 프로젝트를 진행하면서 다음과 같은 에러 메시지를 받았습니다.
Failed to send email: 'ascii' codec can't encode characters in position 14-16: ordinal not in range(128)
이 글에서는 이 에러가 발생하는 원인과 해결 방법을 설명합니다.
※ 본 포스팅은 ChatGPT의 도움을 받아 작성하였음
ascii codec can’t encode 에러 원인 분석
에러 메시지에서 중요한 부분은 'ascii' codec can't encode characters
입니다. 이는 Python의 smtplib
모듈이 인코딩하는 과정에서 ASCII 범위를 벗어나는 문자를 발견했을 때 발생합니다. 결론부터 말씀드리자면, 본문에는 한글이 전혀 없는데도 에러가 발생해 갈피를 못 잡고 있다가. 컴퓨터의 호스트명에 한글이 포함되어 있어 이 문제가 발생했습니다.
해결 방법
이 문제를 해결하려면 호스트명을 ASCII 문자로 변환해주어야 합니다. 다음은 이를 해결한 방법입니다.
1. 호스트명 인코딩
Python의 socket
모듈을 사용하여 호스트명을 가져온 후, ASCII로 인코딩하고 디코딩하는 과정을 추가했습니다.
import socket
hostname = socket.gethostname().encode('ascii', 'ignore').decode('ascii')
2. 수정된 전체 코드
이제 SMTP 서버와 통신하는 전체 코드를 보여드리겠습니다.
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import socket
def send_email(subject, body, to_email, from_email, password):
smtp_server = 'smtp.gmail.com'
smtp_port = 587
msg = MIMEMultipart()
msg['From'] = from_email
msg['To'] = to_email
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain'))
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.set_debuglevel(1)
hostname = socket.gethostname().encode('ascii', 'ignore').decode('ascii')
server.ehlo(hostname)
server.starttls()
server.ehlo(hostname)
server.login(from_email, password)
server.sendmail(from_email, to_email, msg.as_string())
server.quit()
print('Email sent successfully!')
except Exception as e:
print(f'Failed to send email: {e}')
# Example usage
subject = 'Test Email'
body = 'This is a test email sent from Python.'
to_email = 'recipient@example.com'
from_email = 'your_email@gmail.com'
password = 'your_app_password'
send_email(subject, body, to_email, from_email, password)
상세 설명
- SMTP 서버 설정: Gmail SMTP 서버와 포트 번호를 설정합니다. Gmail SMTP 설정 문서를 참조하세요.
- 이메일 메시지 생성: 이메일 발신자, 수신자, 제목 및 본문을 설정합니다. (Gmail 앱비밀번호 생성)
- 호스트명 인코딩:
socket.gethostname()
으로 호스트명을 가져오고 ASCII로 인코딩합니다. - SMTP 서버와 연결:
smtplib.SMTP
를 사용하여 서버와 연결하고 EHLO 명령을 보냅니다. - TLS 보안 연결:
starttls()
를 사용하여 TLS 보안 연결을 시작합니다. - 이메일 전송:
sendmail()
을 사용하여 이메일을 전송합니다.
결론
이 글에서는 Python을 사용하여 Gmail SMTP 서버를 통해 이메일을 전송할 때 발생하는 'ascii' codec can't encode characters
에러를 해결하는 방법을 설명했습니다. 핵심은 본문이 아니라 PC의 호스트명에 한글이 들어가 있다는 점이었습니다. 이를 통해 유사한 문제를 겪고 있는 다른 개발 공부를 하시는 분들에게 도움이 되길 바랍니다.