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. 私はdjango 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 2015

回答:


53

メールを実際のSMTPサーバーに送信します。独自に設定したくない場合は、Googleのように、自社を運営する会社を見つけることができます。


3
すばらしい、私は自分自身に電子メールを送信します。上記のミクの記事は完璧でした。記事のコメントにある小さなタイプミスの修正に注意してください。(そして、私は自分の通常のコンピューター/ローカルホストを使用しました。事前に何も設定していませんでした。)
user984003 '24 / 10/12

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 2013

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アカウントがブロックされました。私のサーバーはおそらく1日に20通未満の電子メールを送信しました。誰かがグーグルで同様の問題を抱えていましたか?
eugene 2013

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このオプションに移動し て有効にします。

また2段階認証プロセス有効にした、Gmailのアプリ固有のパスワードを作成します

次に、設定でアプリ固有のパスワードを使用する必要があります。したがって、次の行を変更します。

    EMAIL_HOST_PASSWORD = 'your_email_app_specific_password'

また、HTMLメールを送信したい場合は、こちらをご覧ください


私はあなたのステップに従います、私は送信できません、への電子メールは電子メールを受信しません/
qg_java_17137 '30

いくらになるでしょう 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

SendGridを使用すると、Djangoでメール送信を設定する最も簡単な方法であることがわかりました。仕組みは次のとおりです。

  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を使用したメールの送信は、1か月あたり最大12,000通まで無料です。


1
優れていますが、ドキュメントに従ってユーザー名として「apikey」を使用して機能させることはできません。SendGridは、単純なsendmailのapikeyごとに3ダースの権限構成をリストしています...
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がその部分を処理します。
イグナシオバスケスエイブラムス

おお!どうですか?ここでは、デフォルトのdjango send_mail関数を完全にバイパスし、独自の関数を使用しています...
Srikar Appalaraju '16年

1
send_mail()あなたがそれをする方法です。メッセージを自分でアセンブルする必要がありますが、SMTPビットについて心配する必要はありません。
イグナシオバスケスエイブラムス

2

遅いですが:

加えて、DEFAULT_FROM_EMAIL修正他人言及し、しているあまりセキュアアプリがアカウントにアクセスできるように、私はに移動しなければならなかったhttps://accounts.google.com/DisplayUnlockCaptcha問題のアカウントでサインインしながら、Djangoは最終的に認証するために取得するには。

IPアドレスが同じであることを確認するために、WebサーバーへのSSHトンネルを介してそのURLにアクセスしました。それが必要かどうかは完全にはわかりませんが、害はありません。次のように実行できますssh -D 8080 -fN <username>@<host>。次にlocalhost:8080、SOCKSプロキシとして使用するようにWebブラウザを設定します。


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-Djangoの場合:

SendGrid Djangoドキュメントはこちら

これらの変数を

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.