Django를 통해 이메일을 보내는 방법은 무엇입니까?


153

내에 settings.py는 다음이 있습니다.

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

# Host for sending e-mail.
EMAIL_HOST = 'localhost'

# Port for sending e-mail.
EMAIL_PORT = 1025

# Optional SMTP authentication information for EMAIL_HOST.
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False

내 이메일 코드 :

from django.core.mail import EmailMessage
email = EmailMessage('Hello', 'World', to=['user@gmail.com'])
email.send()

물론을 통해 디버깅 서버를 설정하면 python -m smtpd -n -c DebuggingServer localhost:1025터미널에서 이메일을 볼 수 있습니다.

그러나 실제로 이메일을 디버깅 서버가 아닌 user@gmail.com으로 보내려면 어떻게해야합니까?

답을 읽은 후에 바로 무언가를 얻으십시오.

  1. localhost (simple ubuntu pc)를 사용하여 이메일을 보낼 수 없습니까?

  2. 장고 1.3 send_mail()에서는 다소 사용되지 않으며 EmailMessage.send()대신 사용 된다고 생각했습니다 .


2
1. SMTP 서버가 실행중인 경우 localhost를 사용할 수 있습니다 . 2. 정확한 메커니즘은 중요하지 않습니다. 중요한 부분은 SMTP 서버가 있다는 것입니다.
Ignacio Vazquez-Abrams

postfix를 설치하면 이메일을주고받을 수 있습니까? 이를 위해 postfix를 어떻게 설정합니까?
데릭

6
이 질문은이 사이트의 범위를 벗어납니다.
Ignacio Vazquez-Abrams


4
그러나 SEO는 우리를 이그나시오 (Ignacio) 페이지로 안내합니다.
Phlip

답변:


53

이메일을 실제 SMTP 서버로 보냅니다. 직접 설정하지 않으려는 경우 Google과 같이 회사를 운영하는 회사를 찾을 수 있습니다.


3
신난다, 나는 단지 나 자신에게 이메일을 보낸다! miku가 언급 한 위의 기사는 완벽했습니다. 기사의 의견에서 작은 오타 수정에 주목하십시오. (그리고 방금 일반 컴퓨터 / 로컬 호스트를 사용했습니다. 미리 설정 한 것이 없습니다.)
user984003

166

Django의 SMTP 서버로 Gmail을 사용합니다. postfix 또는 다른 서버를 다루는 것보다 훨씬 쉽습니다. 저는 이메일 서버를 관리하지 않습니다.

settings.py에서 :

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'me@gmail.com'
EMAIL_HOST_PASSWORD = 'password'

참고 : 2016 년에 Gmail은 기본적으로 더 이상이를 허용하지 않습니다. Sendgrid와 같은 외부 서비스를 사용하거나 Google의이 자습서를 따라 보안을 낮추지 만 https://support.google.com/accounts/answer/6010255 옵션을 허용 할 수 있습니다.


8
비밀번호를 평문으로 남겨 두는 대안이 있습니까?
ritratt

1
Mandrill과 같은 이메일 서비스를 사용하면 암호를 대신 사용할 수 있지만 더 도움이 될지는 모르겠습니다. 서버에 설치된 암호화 키를 사용하여 EMAIL_HOST_PASSWORD = my_decrypt ( 'abi304hubaushl9rchy2y9fd29')
Jordan

27
환경 변수에 넣으십시오. 그런 다음 EMAIL_HOST_PASSWORD = os.environ [ 'MY_PASSWORD_THAT_YOU_CANT_KNOW']
Drew Shafer

1
나는 당신의 코드를 그대로 사용했습니다. 며칠 후에 내 Gmail 계정이 차단되었습니다. 내 서버는 하루에 20 개 미만의 전자 메일을 보냈을 것입니다. Google과 비슷한 문제가있는 사람이 있습니까?
eugene

8
SMTPAuthenticationError가 발생하고 " 최신 보안 표준을 충족하지 않는 앱에서 " 로그인 시도가 차단되었습니다. "라는 이메일이 표시 됩니다. 이것 처럼 보입니다 . "에 의해 해결 보안 수준이 낮은 앱에 대한 액세스를 켜기 ". 그리고 그것은 효과가 있었다 .
Bob Stein이

40
  1. 프로젝트를 작성하십시오. django-admin.py startproject gmail
  2. 아래 코드를 사용하여 settings.py를 편집하십시오.

    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_USE_TLS = True
    EMAIL_HOST = 'smtp.gmail.com'
    EMAIL_HOST_USER = 'youremail@gmail.com'
    EMAIL_HOST_PASSWORD = 'email_password'
    EMAIL_PORT = 587
  3. 대화식 모드를 실행하십시오. python manage.py shell

  4. EmailMessage 모듈을 가져 오십시오.

    from django.core.mail import EmailMessage
  5. 이메일을 보내십시오 :

    email = EmailMessage('Subject', 'Body', to=['your@email.com'])
    email.send()

자세한 내용 은 문서의 확인 send_mailEmailMessage기능을 참조하십시오 .

Gmail 업데이트

또한 Gmail을 통해 이메일을 보내는 데 문제가있는 경우 Google 에서이 가이드 를 확인하십시오 .

Google 계정 설정에서 Security > Account permissions > Access for less secure apps 에서이 옵션으로 활성화하십시오.

또한 귀하의 Gmail 앱의 특정 암호를 생성 하면 한 후에 켜져 2 단계 검증 그것을 위해.

그런 다음 설정에서 앱 비밀번호 를 사용해야 합니다 . 따라서 다음 줄을 변경하십시오.

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

또한 HTML 이메일을 보내려면 이 내용을 확인하십시오 .


귀하의 단계를 따르고, 보낼 수 없으며, 이메일을받을 수 없습니다 /
qg_java_17137

무엇을 할 것이다 EMAIL_HOST 에 대한 outlookoffice365 ?
Antu

14

내 사이트가 호스팅되고 Godaddy개인 이메일이 동일하게 등록되어 있습니다. 이들은 나를 위해 일한 설정입니다.

settings.py에서 :

EMAIL_HOST = 'mail.domain.com'
EMAIL_HOST_USER = 'abc@domain.com'
EMAIL_HOST_PASSWORD = 'abcdef'
DEFAULT_FROM_EMAIL = 'abc@domain.com'
SERVER_EMAIL = 'abc@domain.com'
EMAIL_PORT = 25
EMAIL_USE_TLS = False

쉘에서 :

from django.core.mail import EmailMessage
email = EmailMessage('Subject', 'Body', to=['def@domain.com'])
email.send()

그런 다음 O / P 즉 성공으로 "1"을 받았습니다. 그리고 메일도 받았습니다. :)

  • domain.com의 의미는 무엇입니까?

감사합니다, 즉 오래된 프로젝트를위한 가장 쉬운 방법 <장고 1.4
프랑수아 정수

13

Django 버전 1.7의 경우 위의 솔루션이 작동하지 않으면 다음을 시도하십시오.

에서 settings.py 추가

#For email
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

EMAIL_USE_TLS = True

EMAIL_HOST = 'smtp.gmail.com'

EMAIL_HOST_USER = 'sender@gmail.com'

#Must generate specific password for your app in [gmail settings][1]
EMAIL_HOST_PASSWORD = 'app_specific_password'

EMAIL_PORT = 587

#This did the trick
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

마지막 줄은 django 1.7의 트릭을 수행했습니다.


이것은 어떤 이유로 든 나를 위해 작동하지 않았습니다. 암호가 잘못되어 계속 오류가 발생합니다. Mailgun에서 직접 자격 증명을 얻었 기 때문에 이상합니다.
Alex Stewart

10

settings.py에서 백엔드smtp 를 사용해야합니다.

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

백엔드를 콘솔로 사용하면 콘솔에서 출력을받습니다.

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

또한 아래 설정 또한

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'urusername@gmail.com'
EMAIL_HOST_PASSWORD = 'password'

이를 위해 gmail 을 사용하는 경우 2 단계 인증애플리케이션 비밀번호를 설정 하고 해당 비밀번호를 EMAIL_HOST_PASSWORD 값 이상으로 복사하여 붙여 넣습니다.


5

Django로 이메일을 보내는 가장 쉬운 방법은 SendGrid를 사용하는 것입니다. 작동 방식은 다음과 같습니다.

  1. SendGrid 계정을 만들고 이메일을 확인하십시오.
  2. 에 다음을 추가하십시오 settings.py. EMAIL_HOST = 'smtp.sendgrid.net' EMAIL_HOST_USER = '<your sendgrid username>' EMAIL_HOST_PASSWORD = '<your sendgrid password>' EMAIL_PORT = 587 EMAIL_USE_TLS = True

그리고 당신은 모두 설정되었습니다!

이메일을 보내려면 :

from django.core.mail import send_mail
send_mail('<Your subject>', '<Your message>', 'from@example.com', ['to@example.com'])

500 내부 서버 오류가 발생할 때마다 Django에서 이메일을 보내려면 다음을 추가하십시오 settings.py.

DEFAULT_FROM_EMAIL = 'your.email@example.com'
ADMINS = [('<Your name>', 'your.email@example.com')]

SendGrid로 이메일을 보내는 것은 한 달에 최대 12k 개의 이메일을 무료로받습니다.


1
... 우수하지만, 간단한 센드 메일에 대한 설명서에 따라 사용자 이름 및 SendGrid 목록으로 apiKey에 당 세 수십 권한 구성을 'apiKey에'를 사용하여 작업에 그것을 얻을 수없는이
SYK

3

나는 실제로 Django에서 잠시 전에 이것을했습니다. 합법적 인 Gmail 계정을 열고 여기에 자격 증명을 입력하십시오. 여기 내 코드가 있습니다-

from email import Encoders
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart

def sendmail(to, subject, text, attach=[], mtype='html'):
    ok = True
    gmail_user = settings.EMAIL_HOST_USER
    gmail_pwd  = settings.EMAIL_HOST_PASSWORD

    msg = MIMEMultipart('alternative')

    msg['From']    = gmail_user
    msg['To']      = to
    msg['Cc']      = 'you@gmail.com'
    msg['Subject'] = subject

    msg.attach(MIMEText(text, mtype))

    for a in attach:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(open(attach, 'rb').read())
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition','attachment; filename="%s"' % os.path.basename(a))
        msg.attach(part)

    try:
        mailServer = smtplib.SMTP("smtp.gmail.com", 687)
        mailServer.ehlo()
        mailServer.starttls()
        mailServer.ehlo()
        mailServer.login(gmail_user, gmail_pwd)
        mailServer.sendmail(gmail_user, [to,msg['Cc']], msg.as_string())
        mailServer.close()
    except:
        ok = False
    return ok

1
smtplib직접 사용할 필요는 없습니다 . Django가 해당 부분을 처리합니다.
Ignacio Vazquez-Abrams

아! 어떻게 되겠 어? 여기에 나는 완전히 기본 장고 바이 패스 send_mail기능 및 내 자신을 사용하여 ...
Srikar Appalaraju

1
send_mail()당신이 어떻게 할 것입니다. 여전히 메시지를 직접 어셈블해야하지만 SMTP 비트에 대해 걱정할 필요는 없습니다.
Ignacio Vazquez-Abrams

2

늦었지만

받는 사람 또한 DEFAULT_FROM_EMAIL수정 다른 사람이 언급 한 계정에 액세스하기 위해 낮은 보안 응용 프로그램을 허용, 나는로 이동했다 https://accounts.google.com/DisplayUnlockCaptcha 마지막으로 인증하기 위해 장고를 얻을 수 문제의 계정으로 로그인 한 상태 .

IP 주소가 동일한 지 확인하기 위해 SSH 터널을 통해 웹 서버로 해당 URL로갔습니다. 그것이 필요한지 완전히 확신하지 못하지만 상처를 줄 수는 없습니다. ssh -D 8080 -fN <username>@<host>다음 과 같이 할 수 있습니다. 그런 다음 웹 브라우저를 localhost:8080SOCKS 프록시 로 사용하도록 설정하십시오 .


2

당신은 사용할 수 있습니다 "Test Mail Server Tool" 을 사용하여 컴퓨터 나 로컬 호스트에서 이메일 전송을 테스트 . Google에서 "Test Mail Server Tool"을 다운로드하여 설정하십시오.

그런 다음 settings.py에서 :

EMAIL_BACKEND= 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25

쉘에서 :

from django.core.mail import send_mail
send_mail('subject','message','sender email',['receipient email'],    fail_silently=False)

1

대한 SendGrid - 장고 특히 :

SendGrid Django Docs here

이 변수를

settings.py

EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'sendgrid_username'
EMAIL_HOST_PASSWORD = 'sendgrid_password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

views.py에서

from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.