Я пишу скрипт Python для настройки сокета для отправки многостраничной электронной почты с изображением из моей учетной записи Gmail через SMTP. Я не использую smtplib или email.mime для образовательных целей. Я использую ssl и сокет и обертываю TCP-сокет с помощью ssl.wrap_socket.SMTP to Gmail: изображение повреждено добавлением CRLF
Все работает нормально, и сообщение электронной почты приходит как с текстом, так и с прикрепленным изображением. Однако приложенное изображение JPEG повреждено.
Сравнивая исходное изображение и поврежденное изображение в шестнадцатеричном редакторе, я вижу, что все байты 0x0D и 0x0A в jpeg были заменены на 0x0D0x0A. Эти байты будут представлять CR и LF в тексте, поэтому представляется, что в какой-то момент CR и LF заменяются CRLF некорректно в моих двоичных данных.
Бинарные данные выглядят правильными, если я пишу их в файл непосредственно перед отправкой в сокет ssl. По-видимому, Gmail корректно интерпретирует Content-type, поскольку он отображает поврежденное изображение в качестве изображения.
Любые идеи, в которых замена CRLF может быть ползущей в данные двоичного изображения?
Решение:
Соответствующий код решение для заголовка кодирования:
b'Content-Transfer-Encoding: base64\r\n' +\
И для самого base64 кодирования:
clientSocketSSL.sendall(base64.b64encode(msgImage))
Возможно, вам следует использовать модули более высокого уровня, если вы не хотите изучать все детали протокола и позволить ему делать «правильные вещи». Если вы хотите использовать сокеты, то вставьте MIME RFC. – Cans