Письма, усеченные при отправке HTML-сообщения с помощью smtplib.SMTP.sendmail - PullRequest
2 голосов
/ 02 апреля 2012

У меня странная проблема, когда усекаются последние 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-тег, поэтому проблема не в том, что неожиданный тег портит форматирование.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

Если вы удаляете все новые строки из сообщения электронной почты, у вас возникнут проблемы. 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.

0 голосов
/ 13 марта 2018

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

import quopri

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