Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python mail inserts space every 171 characters

I am trying to write a python script to send an email that uses html formatting and involves a lot of non-breaking spaces. However, when I run it, some of the &nbsp strings are interrupted by spaces that occur every 171 characters, as can be seen by this example:

#!/usr/bin/env python
import smtplib
import socket
from email.mime.text import MIMEText

emails = ["[email protected]"]
sender = "test@{0}".format(socket.gethostname())

message = "<html><head></head><body>"
for i in range(20):
        message += "&nbsp;" * 50
        message += "<br/>"
message += "</body>"
message = MIMEText(message, "html")
message["Subject"] = "Test"
message["From"] = sender
message["To"] = ", ".join(emails)
mailer = smtplib.SMTP("localhost")
mailer.sendmail(sender, emails, message.as_string())
mailer.quit()

The example should produce a blank email that consists of only spaces, but it ends up looking something like this:

         &nbsp ;                                    


                       &nb sp;                      


                                     & nbsp;        






             &nbs p;                                


                           &n bsp;          

Edit: In case it is important, I am running Ubuntu 15.04 with Postfix for the smtp client, and using python2.6.

like image 903
Program man Avatar asked Jun 24 '15 00:06

Program man


2 Answers

I can replicate this in a way but my line breaks come every 999 characters. RFC 821 says maximum length of a line is 1000 characters including the line break so that's probably why.

This post gives a different way to send a html email in python, and i believe the mime type "multipart/alternative" is the correct way. Sending HTML email using Python

like image 99
timoh Avatar answered Oct 23 '22 00:10

timoh


I'm the developer of yagmail, a package that tries to make it easy to send emails.

You can use the following code:

import yagmail
yag = yagmail.SMTP('[email protected]', 'mypassword')

for i in range(20):
    message += "&nbsp;" * 50
    message += "<br/>"

yag.send(contents = message)

Note that by default it will send a HTML message, and that it also adds automatically the alternative part for non HTML browsers.

Also, note that omitting the subject will leave an empty subject, and without a to argument it will send it to self.

Furthermore, note that if you set yagmail up correctly, you can just login using yag.SMTP(), without having to have username & password in the script (while still being secure). Omitting the password will prompt a getpass.

Adding an attachment is as simple as pointing to a local file, e.g.:

yag.send(contents = [message, 'previously a lot of whitespace', '/local/path/file.zip']

Awesome isn't it? Thanks for the allowing me to show a nice use case for yagmail :)

If you have any feature requests, issues or ideas please let me know at github.

like image 2
PascalVKooten Avatar answered Oct 22 '22 23:10

PascalVKooten