Django में परीक्षण ईमेल भेजना [बंद]


90

मुझे यह परीक्षण करने की आवश्यकता है कि मेरा Django एप्लिकेशन सही सामग्री के साथ ई-मेल भेजता है। जब से मैं वास्तविक ई-मेल सेवा का परीक्षण नहीं कर रहा हूं, मैं बाहरी प्रणालियों (जैसे एक तदर्थ जीमेल खाते) पर भरोसा नहीं करना चाहता हूं।

मुझे लगता है कि हो सकता है, ईमेल को स्थानीय रूप से संग्रहीत करें, जैसे ही वे भेजे जाते हैं। इसे प्राप्त करने के बारे में कोई टिप?


मॉडरेटर: कृपया इस प्रश्न को लॉक करें। स्पैम के बहुत सारे जवाबों में जोड़ा जा रहा है, ऐसे समाधानों का प्रस्ताव करना जो केवल बाहरी सेवाओं को बढ़ावा देने के लिए हास्यास्पद रूप से जटिल हैं।
nemesisdesign

जवाबों:


43

आप ईमेल भेजने के लिए एक फ़ाइल बैकएंड का उपयोग कर सकते हैं जो विकास और परीक्षण के लिए एक बहुत ही उपयोगी समाधान है; ईमेल नहीं भेजे जाते हैं, लेकिन एक फ़ोल्डर में संग्रहीत किया जाता है जिसे आप निर्दिष्ट कर सकते हैं!


1
ईमेल बैकएंड के बारे में अधिक जानकारी: docs.djangoproject.com/en/dev/topics/email/#email-backends । कभी-कभी साधारण कंसोल बैकेंड भी पर्याप्त होता है ..
जेविस

1
लेकिन क्या (स्वचालित) परीक्षण के दौरान उत्पन्न ईमेल तक पहुंचने का एक तरीका है?
Overdrivr

182

Django परीक्षण ढांचे में कुछ ई-मेल सेवा के परीक्षण में आपकी सहायता करने के लिए सहायकों का निर्माण किया गया है ।

डॉक्स (लघु संस्करण) से उदाहरण:

from django.core import mail
from django.test import TestCase

class EmailTest(TestCase):
    def test_send_email(self):
        mail.send_mail('Subject here', 'Here is the message.',
            'from@example.com', ['to@example.com'],
            fail_silently=False)
        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(mail.outbox[0].subject, 'Subject here')

3
+1 अच्छा जवाब। लेकिन यह जटिल मामलों के लिए उपयोगी नहीं है, जब send_mailइसका उपयोग नहीं किया जा सकता है।
संतियागोबसुल्तो

3
अधिक सटीक रूप से डॉक्टर यहां है: docs.djangoproject.com/en/1.8/topics/email/#in-memory-backend
nimiq

2
यदि आपका परीक्षण एक फ़ंक्शन जो send_mail को कॉल करता है और आप इसलिए एक्सेस नहीं कर सकते हैं तो आप यह कैसे करेंगे mail?
मैट डी

3
@MatthewDrill आप तब भी एक्सेस कर सकते हैं mail.outboxजब send_mailकिसी अन्य फ़ंक्शन में कॉल किया जाता है।
pymarco

2
@pymarco यदि आप कोर से मेल आयात करते हैं, तो mail.outbox[0].bodyयह आपको भेजे गए ईमेल को दिखाएगा भले ही वह send_mailकहीं और किया गया हो।
रोब

17

यदि आप यूनिट-टेस्टिंग में हैं, तो सबसे अच्छा उपाय यह है कि django द्वारा उपलब्ध कराए गए इन-मेमोरी बैकेंड का उपयोग करें ।

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

इसका उपयोग py.test स्थिरता के रूप में करें

@pytest.fixture(autouse=True)
def email_backend_setup(self, settings):
    settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'  

प्रत्येक परीक्षण में, mail.outboxसर्वर के साथ रीसेट किया जाता है, इसलिए परीक्षणों के बीच कोई दुष्प्रभाव नहीं होते हैं।

from django.core import mail

def test_send(self):
    mail.send_mail('subject', 'body.', 'from@example.com', ['to@example.com'])
    assert len(mail.outbox) == 1

def test_send_again(self):
    mail.send_mail('subject', 'body.', 'from@example.com', ['to@example.com'])
    assert len(mail.outbox) == 1

8

MailHog का उपयोग करें

MailCatcher द्वारा प्रेरित, स्थापित करने में आसान।

गो के साथ निर्मित - MailHog कई प्लेटफार्मों पर स्थापना के बिना चलता है।


इसके अलावा, इसमें जिम , मेलहॉग कैओस बंदर नामक एक घटक है , जो आपको विभिन्न समस्याओं के साथ ईमेल भेजने का परीक्षण करने में सक्षम बनाता है:

जिम क्या कर सकता है?

  • कनेक्शन अस्वीकार करें
  • दर सीमा कनेक्शन
  • प्रमाणीकरण अस्वीकार करें
  • प्रेषकों को अस्वीकार करें
  • प्राप्तकर्ताओं को अस्वीकार करें

इसके बारे में यहाँ और पढ़ें ।


(मूल मेलकैचर के विपरीत, जो इमोजी के साथ ईमेल भेजते समय मुझ पर विफल रहा, UTF-8 में एन्कोड किया गया और यह WASN'T वास्तव में वर्तमान रिलीज़ में तय नहीं किया गया, MailHog सिर्फ काम करता है।)


5

किसी भी परियोजना के लिए जो अटैचमेंट भेजने की आवश्यकता नहीं होती है, मैं django-mailer का उपयोग करता हूं , जिसमें सभी आउटबाउंड ईमेलों का लाभ एक कतार में समाप्त होता है जब तक कि मैं उनके भेजने को ट्रिगर नहीं करता, और यहां तक ​​कि उनके भेजे जाने के बाद भी, वे तब लॉग इन होते हैं - यह सब व्यवस्थापन में दिखाई देता है, जिससे यह पता लगाना आसान हो जाता है कि आप जो ईमेल कोड देख रहे हैं वह इंटरब्यूट में आग लगाने की कोशिश कर रहा है।


इसके अलावा, django-mailer द्वारा बनाई गई संदेश ऑब्जेक्ट्स का मतलब है कि आप उन्हें (और उनकी सामग्री का निरीक्षण कर सकते हैं) यूनिट परीक्षणों में भी कर सकते हैं (मुझे पता है कि डमी मेलबॉक्स के लिए टेस्ट सूट में आउटबाउंड मेलबॉक्स समर्थन है, लेकिन django-mailer doesn का उपयोग करना मेल तब तक मेल न भेजें जब तक कि प्रबंधन कमांड इसे न भेज दे, जिसका अर्थ है कि आप उस मेलबॉक्स ऑब्जेक्ट का उपयोग नहीं कर सकते हैं)
स्टीव जालिम

अपडेट करें, मेरे मूल उत्तर से उम्र: github.com/SmileyChris/django-mailer-2 संलग्नक का समर्थन करता है,
स्टीव जालिम

4

Django में एक इन-मेमोरी ईमेल बैकएंड भी है। इन-मेमोरी बैकएंड के तहत डॉक्स में अधिक विवरण । यह Django 1.6 में मौजूद नहीं है यकीन है कि अगर यह कुछ भी पहले से मौजूद है।



1

यहाँ कुछ टुकड़ों को एक साथ बांधना, यहाँ पर एक सीधा सेटअप है filebased.EmailBackend। यह व्यक्तिगत लॉग फ़ाइलों से लिंक होने वाली सूची दृश्य प्रस्तुत करता है, जिसमें सुविधाजनक रूप से टाइमस्टैम्प फाइलनाम हैं। सूची में एक लिंक पर क्लिक करने से ब्राउज़र में वह संदेश प्रदर्शित होता है (कच्चा):

समायोजन

EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend"
EMAIL_FILE_PATH = f"{MEDIA_ROOT}/email_out"

राय

import os

from django.conf import settings
from django.shortcuts import render

def mailcheck(request):

    path = f"{settings.MEDIA_ROOT}/email_out"
    mail_list = os.listdir(path)

    return render(request, "mailcheck.html", context={"mail_list": mail_list})

खाका

{% if mail_list %}
  <ul>
  {% for msg in mail_list %}
    <li>
      <a href="{{ MEDIA_URL }}email_out/{{msg}}">{{ msg }}</a>
    </li>
  {% endfor %}
  </ul>
{% else %}
  No messages found.
{% endif %}

यूआरएल

path("mailcheck/", view=mailcheck, name="mailcheck"),

0

क्यों नहीं अपने खुद के सरल SMTP सर्वर को इनहेरिट से शुरू करें smtpd.SMTPServerऔर threading.Thread:

class TestingSMTPServer(smtpd.SMTPServer, threading.Thread):
    def __init__(self, port=25):
        smtpd.SMTPServer.__init__(
            self,
            ('localhost', port),
            ('localhost', port),
            decode_data=False
        )
        threading.Thread.__init__(self)

    def process_message(self, peer, mailfrom, rcpttos, data, **kwargs):
        self.received_peer = peer
        self.received_mailfrom = mailfrom
        self.received_rcpttos = rcpttos
        self.received_data = data

    def run(self):
        asyncore.loop()

जब भी आपके SMTP सर्वर को एक मेल रिक्वेस्ट मिलती है, आपको process_message कहा जाता है, आप जो चाहें कर सकते हैं।

परीक्षण कोड में, कुछ इस तरह से करें:

smtp_server = TestingSMTPServer()
smtp_server.start()
do_thing_that_would_send_a_mail()
smtp_server.close()
self.assertIn(b'hello', smtp_server.received_data)

बस याद फोन करके asyncore पाश (सुनने से सर्वर बंद) समाप्त करने के लिए।close()asyncore.dispatchersmtp_server.close()


0

यदि आपके पास एक टॉमकैट सर्वर उपलब्ध है, या अन्य सर्वलेट इंजन है, तो एक अच्छा तरीका "पोस्ट हॉक" है जो एक छोटा सर्वर है जो एप्लिकेशन को बिल्कुल एसएमटीपी सर्वर जैसा दिखता है, लेकिन इसमें एक उपयोगकर्ता इंटरफ़ेस शामिल है जो आपको देखने की अनुमति देता है। भेजे गए ईमेल संदेशों का निरीक्षण करें। यह खुला स्रोत है और स्वतंत्र रूप से उपलब्ध है।

इसे यहां पाएं: पोस्ट Hoc GitHub साइट

ब्लॉग पोस्ट देखें: PostHoc: ईमेल भेजने वाले परीक्षण ऐप्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.