Электронные письма усекаются при отправке HTML-сообщения с использованием smtplib.SMTP.sendmail

У меня странная проблема, когда последние 10-20 символов моего электронного письма усекаются.

Код, который отправляет электронное письмо, выглядит следующим образом:

#Get the runtime arguments.
subject = args[0]
content = str(args[1]).replace("\\n","<br/>") #Python automatically escapes the backslash in runtime arguments, so "\n" turns into "\\n".

#Create the email message.
msg = MIMEText(content, 'html')
msg['From']=sender
msg['To']=",".join(recipients)
msg['Subject']=subject

print "Sending email with subject \""+subject+"\" to: " + ",".join(recipients)

print "Content: \n" + content;
print "\n\n"
print "msg.as_string(): \n" + msg.as_string()

#Set the SMPTP server, and send the email.
s = smtplib.SMTP(server)
s.sendmail(sender,recipients,msg.as_string())
s.quit()

Как вы можете видеть в коде, я вывожу на экран как содержимое, так и финальное сообщение, и оба они печатаются правильно. Но когда электронное письмо получено получателем, оно усекается. Я не уверен на 100%, усекается ли он на определенное количество символов или после определенного количества символов, но я подозреваю, что это позже.

Как ни странно, электронные письма отправляются нормально, если они отправляются в текстовом формате, а не в формате HTML. Но, к сожалению, большинство получателей используют Outlook, который думает, что лучше меня знает, куда вставлять новые строки в письмах с открытым текстом...

Любое понимание будет оценено.

Изменить: я также должен упомянуть, что это неправильный HTML. По сути, я просто заменяю новые строки на

<br/>

Я не уверен, что это изменит ситуацию. Помимо тормозных тегов, нет ничего, что хотя бы отдаленно напоминало HTML-тег, поэтому проблема не в том, что неожиданный тег испортил форматирование.


person Morglor    schedule 02.04.2012    source источник


Ответы (2)


Если вы удалите все символы новой строки из сообщения электронной почты, у вас возникнут проблемы. SMTP-серверы обычно не принимают строки длиннее 1000 символов. Если вы хотите отправить данные в произвольной форме, инкапсулируйте их во что-то вроде Quoted-Printable (где вы можете поместить «невидимые» разрывы строк, которые будут удалены клиентом — позаботьтесь о том, чтобы правильно QP-кодировать само сообщение, хотя ).

In quoted printable (RFC 2045), you can hex-encode any =22special=22 chara=
cter, like this (or=20in=20fact,=20any=20character=20at=all), and add line=
 breaks where you see fit by prefixing them with an equals sign.  Of cours=
e, you also have to encode any literal equals sign, like this: =3D.  Bette=
r use a library which understands the details of this format than write yo=
ur own encoder, though.

Если вы укажете Content-Transfer-Encoding: binary, теоретически вы можете передавать строки произвольной длины, но лучше и безопаснее придерживаться того, что позволяет 7bit, и использовать подходящее Content-Transfer-Encoding, например quoted-printable или (если вы хотите по-настоящему сойти с ума) base64.

person tripleee    schedule 02.04.2012
comment
Спасибо. Теперь я заменяю \\n на \n‹br/›, и все работает правильно. - person Morglor; 02.04.2012
comment
Я только что добавил оператор новой строки \n при объединении длинной строки. Это решило проблему усечения электронной почты. - person Tasneem Hyder; 14.12.2016
comment
Это полумера, которая работает только до тех пор, пока ни одна строка HTML не длиннее примерно 1000 байт. Опять же, правильным решением является выбор кодировки, которая инкапсулирует необработанное сообщение в форму, безопасную для SMTP, и декодирует исходное сообщение на другом конце. - person tripleee; 20.10.2018

Чтобы уточнить ответ tripleee, вот как вы это сделаете на практике:

import quopri

#Create the email message.
content = quopri.encodestring(content)
msg = MIMEText(content, 'html')
msg.replace_header('content-transfer-encoding', 'quoted-printable')
...
person Srini    schedule 13.03.2018