Program Tip

이메일 서버없이 이메일 보내기 테스트

programtip 2020. 11. 12. 20:04
반응형

이메일 서버없이 이메일 보내기 테스트


이메일을 보내는 Django 애플리케이션이 있습니다. 프로덕션 서버에는 이메일 서버가 있지만 내 로컬 박스에는 없습니다. 로컬에서 이메일 전송을 테스트하고 싶습니다. django가 이메일 서버를 통해 보내지 않고 파일이나 콘솔로 인쇄하도록 할 수있는 방법이 있습니까?


이메일을 보내기 위해 콘솔 백엔드를 사용하도록 애플리케이션을 구성 할 수 있습니다 . 전자 메일을 보내는 대신 표준 출력에 기록합니다.

다음 행을 포함하도록 settings.py를 변경하십시오.

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

프로덕션을 위해 제거하는 것을 잊지 마십시오.


파이썬에는 약간의 SMTP 서버가 내장되어 있습니다. 다음 명령을 사용하여 두 번째 콘솔에서 시작할 수 있습니다.

python -m smtpd -n -c DebuggingServer localhost:1025

이것은 단순히 localhost:1025콘솔에서 보낸 모든 메일을 인쇄합니다 .

이 서버를 사용하려면 Django를 구성해야합니다 settings.py.

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025

이메일을 보내는 대신 임시 파일에 이메일을 쓰도록 애플리케이션을 구성 할 수 있습니다 (Daniel Hepper의 답변과 유사).

EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = 'tmp/email-messages/'

이렇게하면 각각의 새 메시지가 별도의 파일로 저장됩니다. 많은 양의 이메일을 보내고 있고 스크롤 백을 사용할 필요가없는 경우에 유용합니다.


테스트가 django.test.testcases.TestCase에서 확장되면 아무것도 수행 할 필요가 없습니다. Django는 EmailBackend를 "특별한"것으로 대체합니다. 그런 다음 다음과 같이 전송 된 내용을 테스트 할 수 있습니다.

def testMethodThatSendAEmail(self):
    ...
    from django.core import mail
    object.method_that_send_email(to='me@example.com')
    self.assertEqual(len(mail.outbox), 1)
    self.assertEqual(mail.outbox[0].to, ['me@example.com'])
    ...#etc

발신 함 객체는 python manage.py 테스트가 실행될 때 메일에 삽입되는 특수 객체입니다.


caktus https://github.com/caktus/django-email-bandit에 의해 멋진 앱 이 있습니다. settings.py 파일에 다음을 추가하십시오.

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = 'your_email@example.com'

이메일 설정 외에도 모든 이메일은 'your_email@example.com'으로 우회됩니다.

행복한 코딩 ...


이것은 Benjamin의 답변에 대해 자세히 설명합니다. postfix, sendmail 또는 exim과 같은 로컬 이메일 서버가 설치되어 있지 않은 경우 이메일을 테스트하는 한 가지 방법은 Python 이메일 서버를 실행하는 것입니다. sudo를 사용하여 포트 25에서 실행하거나 포트> 1024 (예약 된 포트)를 사용할 수 있습니다.

python -m smtpd -n -c DebuggingServer localhost:1025
#sudo python -m smtpd -n -c DebuggingServer localhost:25

현재 django 앱 코드로 테스트하려면 settings.py를 일시적으로 변경하여 botom에 포함 할 수 있습니다.

EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD = 'localhost', 1025, None, None

이제 이메일을 테스트하거나 다음과 같이 다른 터미널 창의 ./manage.py 셸에서이를 수행 할 수 있습니다.

python manage.py shell

이메일을 보내려면이 코드를 붙여 넣으세요.

from django.core.mail import send_mail​
send_mail('Subject here', 'Here is the message.', 'messanger@localhost.com',['any@email.com'], fail_silently=False)

터미널에서 모든 것을 볼 수 있으므로 실제 이메일을 사용할 필요가 없습니다. 추가 테스트를 위해 .html과 같은 적절한 컨테이너에 덤프 할 수 있습니다.

참고URL : https://stackoverflow.com/questions/4642011/test-sending-email-without-email-server

반응형