로컬 Python SMTP 서버를 사용하여 Python에서 이메일 보내기

로컬 Python SMTP 서버를 사용하여 Python에서 이메일 보내기

Python을 사용하여 이메일을 보내려는 Raspbian Jessie를 실행하는 서버가 있습니다. smtpd및 를 포함하여 작동할 수 있는 두 개의 모듈을 보았습니다 smtplib.

나는 smtp.gmail.com및 를 포함한 많은 예를 보았습니다 localhost. 특정 도메인 이름으로 이메일을 보내고 싶습니다. 예를 들어: [email protected] 저는 SMTP를 처음 사용하는데 오류만 많이 받았습니다. 실제로 이메일을 보내기 위해 SMTP 서버 코드를 어떻게 작성합니까?

Traceback (most recent call last):
  File "C:\Users\Josua\Desktop\smtp_test.py", line 42, in <module>
    s = smtplib.SMTP('sigsmileyface.ddns.net')
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 251, in __init__
    (code, msg) = self.connect(host, port)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 336, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 307, in _get_socket
    self.source_address)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\socket.py", line 724, in create_connection
    raise err
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\socket.py", line 713, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

답변1

부인 성명

아래 정보 중 적어도 일부는 귀하에게 중복될 것으로 예상됩니다. 양해해 주시기 바랍니다. =)

smtplib 대 smptd

Python에는 이메일을 처리하기 위한 두 가지 모듈이 있습니다 —smtplib그리고smtpd. 둘의 차이점은 smtplib이메일을 보내는 데 사용되는 반면 smptd이메일을 받는 데 사용된다는 것입니다. 이 경우 이메일을 보내려면 을 사용해야 합니다 smtplib.

Python 3.6 smtplib를 사용한 이메일

내 도메인 이름을 통해 이메일을 보내고 싶습니다(예:[이메일 보호됨]).

소스 스크립트를 제공하지 않았으므로 참조용으로 작동하는 Python 3.6 메일 스크립트를 아래에 나열했습니다.

# Python mail script with smtplib, email.utils and email.mime.text.

# --- imports ---

import smtplib
import email.utils
from email.mime.text import MIMEText

# --- create our message ---

# Create our message. 
msg = MIMEText('The body of your message.')
msg['To'] = email.utils.formataddr(('Recipient Name', '[email protected]'))
msg['From'] = email.utils.formataddr(('Your Name', '[email protected]'))
msg['Subject'] = 'Your Subject'

# --- send the email ---

# SMTP() is used with normal, unencrypted (non-SSL) email.
# To send email via an SSL connection, use SMTP_SSL().
server = smtplib.SMTP()

# Specifying an empty server.connect() statement defaults to ('localhost', 25).
# Therefore, we specify which mail server we wish to connect to.
server.connect ('mail.example.com', 25)

# Optional login for the receiving mail_server.
# server.login ('[email protected]', 'Password')

# Dump communication with the receiving server straight to to the console.
# server.set_debuglevel(True)  

# '[email protected]' is our envelope address and specifies the return
# path for bounced emails.
try:
    server.sendmail('[email protected]', ['[email protected]'], msg.as_string())
finally:
    server.quit()

개체 이름 으로 "server"를 사용하는 동안 smtplib사용자는 자신의 스크립트에서 "s"(또는 무엇이든)를 계속 자유롭게 사용할 수 있습니다. 마찬가지로,이메일.util그리고이메일.마임모듈은 꼭 필요한 것은 아니지만 최종 메시지를 구성하는 데 도움이 됩니다.

나는 SMTP를 처음 접했고 내가 받은 것은 많은 오류뿐이었습니다.

다른 오류의 원인이 무엇인지 말할 수는 없지만 나열된 출력은 다음과의 연결을 나타냅니다.sigsmileyface.ddns.net포트 25에서 설정할 수 없습니다. 주요 줄은 다음과 같습니다.

  • s = smtplib.SMTP('sigsmileyface.ddns.net'), 기본값은 포트 25입니다.

  • ConnectionRefusedError: [...] the target machine actively refused it방화벽이나 메일 서버 구성 문제를 나타낼 수 있는 마지막 줄 입니다.

문제 해결

메일 서버 및 포트 확인

연결하려는 서버에 활성 메일 서버가 있고 해당 서버가 실행 중인 포트(일반적으로 수신 메일의 경우 포트 25)가 있는지 확인하십시오.

귀하의 경우, 귀하가 다음 사항을 통제할 수 있다면sigsmileyface.ddns.netsendmailPi의 표준 메일 서버 라고 생각합니다 . 또한 포트가 방화벽에 의해 차단되지 않았는지, 필요한 포트 전달이 라우터에 올바르게 설정되었는지 확인해야 합니다.

마찬가지로 메일 서버에 직접 연결한다고 해서 별 차이가 나지는 않지만 다음 주소로 메일을 보내거나 받을 예정이라면 MX 레코드를 설정하는 것이 좋습니다.sigsmileyface.ddns.net.

연결을 확인하세요

smptlib개체에서 지정하든 를 통해 지정하든 관계없이 스크립트에 올바른 연결 값이 있는지 다시 확인해야 합니다 .connect(). 지정하는 호스트 이름은 항상 메일을 보내려는 서버에 대한 직접 연결이거나 사용자를 대신하여 메시지를 전달할 것으로 예상되는 중간 메일 서버(로컬 또는 기타)가 됩니다.

귀하의 경우에는 불가능해 보이지만 수신 서버에 연결하는 데 필요한 사용자 이름이나 비밀번호도 알고 있어야 합니다. 이는 다른 서버를 사용하여 메일을 릴레이할 때 가장 일반적이지만 기억해 둘 가치가 있습니다.

릴레이를 사용해야 하는지 확인하세요

일종의 릴레이를 사용할 필요가 없는지 확인하십시오. 간단히 말해서, 일부 ISP는 처음에 포트 25에서 메시지를 전송하거나 수신하기 위해 특수 메일 서버를 사용해야 하는 스팸을 방지하기 위해 특정 작업을 수행합니다.

예를 들어, 내 홈 서비스의 로컬 ISP는 포트 25를 필터링합니다. 이 포트로 향하는 일반 발신 메일은 ISP SSL 메일 릴레이를 통해 전송됩니다. 동시에 가정 사용자가 이 포트로 들어오는 메시지를 차단합니다.

이는 포트 25에서 이메일을 보내고 받으려면 일반 발신 메일(귀하의 스크립트가 시도하는 메일)을 다음 포트로 전달해야 함을 의미합니다.smtp.isp.com두 번째(타사) 서비스를 사용하여 포트 25에서 들어오는 메일을 포트 XXX(내 메일 서버가 실제로 수신하는 포트)로 라우팅하는 동안 포트 25의 수신자에게 이를 전달합니다.

실제로 메일이 다른 열린 포트(테스트나 개인 용도로는 괜찮을 수 있음)에서 보내거나 받는 것을 방지하지는 않지만 대부분의 메일 서버는 일관성을 위해 포트 25를 사용하므로 장기적으로 릴레이 사용이 필요할 수 있습니다. .


충분히 명확하지 않은 경우 스크립트에 올바른 값을 입력하고 수신 메일 서버를 제어한다는 가정 하에 25 이외의 포트에서 테스트를 수행할 수 있습니다.


관련 정보