#34414: Connection to SMTP server not closed after exception
---------------------------------------+------------------------
               Reporter:  chamalsl     |          Owner:  nobody
                   Type:  Bug          |         Status:  new
              Component:  Core (Mail)  |        Version:  4.1
               Severity:  Normal       |       Keywords:
           Triage Stage:  Unreviewed   |      Has patch:  0
    Needs documentation:  0            |    Needs tests:  0
Patch needs improvement:  0            |  Easy pickings:  0
                  UI/UX:  0            |
---------------------------------------+------------------------
 Django EmailMessage class does not close connection to SMTP server, when
 an exception is raised.


 {{{
      email_msg = EmailMessage(subject="Topic\n", body="Body",
 from_email="[email protected]",
                              to=["[email protected]"])
      email_msg.send()
 }}}


 Above Django/python code sends an email. But the email's subject contains
 a new line.
 So Django will raise a BadHeaderError. But the connection to the SMTP
 server is not closed.


 == Steps

 1. Create a Django app.
  Add this method to a view.
  {{{
    def email(request):
      email_msg = EmailMessage(subject="Topic\n", body="Body",
 from_email="[email protected]",
                              to=["[email protected]"])
      email_msg.send()
      return HttpResponse("Sent")
 }}}

    * Note: There is a new line character in the email subject.

 2. Install aiosmtpd
 {{{
  python3 -m pip install aiosmtpd
 }}}

 3. Run smtpd server
    This will start a SMTP server on port 8025
 {{{
  python3 -m aiosmtpd -n
 }}}

 4. Add these lines to settings.py of your Django app.
 {{{
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = 'localhost'
    EMAIL_PORT = 8025
 }}}

 5. Open attached send_emails.py
    Change URL in this line to match your application's URL.
 {{{
  requests.get('http://localhost:8080/file/email')
 }}}

 6. Run send_emails.py
    This script will make 10 requests to send email.
 {{{
 python3 send_emails.py
 }}}

 7. Check connections to port 8025 (SMTP server)
 {{{
 netstat -at | grep 8025
 }}}
 You can see some connections are in ESTABLISHED state.

 8. Remove the new line character inside the "def email" method.
    Run send_emails.py.
    Then run
 {{{
  netstat -at | grep 8025.
 }}}
 You will see all connections are in TIME_WAIT state.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34414>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070186e05d5794-69befccb-6db4-49db-9fc6-e66907f213f0-000000%40eu-central-1.amazonses.com.

Reply via email to