составной / смешанный тип содержимого и границы отклонены Амависом

Я пишу сценарий Ruby, который отправляет электронную почту SMTP. Электронное письмо разделено на 3 части: заголовки, тело и вложение. К сожалению, я изо всех сил пытаюсь удовлетворить требование Amavis: правильно написать границу инкапсуляции.

Этот заголовок, добавленный Amavis, обнаружил проблему:

X-Amavis-Alert: BAD HEADER SECTION, MIME error: error: multipart boundary is missing, or contains CR or LF

Я прочитал раздел 7_2 RFC 1341 , который определяет синтаксис multipart.

Обратите внимание, что граница инкапсуляции должна находиться в начале строки, то есть после CRLF, и что этот начальный CRLF считается частью границы инкапсуляции, а не частью предыдущая часть. За границей должны сразу следовать либо другой CRLF и поля заголовка для следующей части, либо два CRLF, в этом случае нет полей заголовка для следующей части (и поэтому предполагается, что это текст Content-Type /

  • граница инкапсуляции должна следовать за границей инкапсуляции CRLF
  • , за границей инкапсуляции сразу же должен следовать другой CRLF + поля заголовка следующей части

Я считаю, что мой сценарий соблюдает эти два правила, однако некоторые почтовые клиенты не распознает привязанность. Вот необработанное электронное письмо (обратите внимание, что перед каждой границей инкапсуляции идет CRLF):

From: from@domain.tld\nTo: to@domain.tld\nSubject: =?UTF-8?B?RMOpY2xhcmF0aW9uIHNpbXBsaWZpw6llIGRlIHZpb2xlbmNl?=\nDate: 2020-12-17 15:59:14 +0100\nMIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=_3c7d2a21904930ec7ff47d0cb268c6605a8d06c02dc50e0c5498926371fae06a68d7\r\n--_3c7d2a21904930ec7ff47d0cb268c6605a8d06c02dc50e0c5498926371fae06a68d7\r\nContent-Type: text/html;charset=\"utf-8\"\nContent-Transfer-Encoding:utf8\r\n\nEMAIL BODY CONTENT HERE\r\n--_3c7d2a21904930ec7ff47d0cb268c6605a8d06c02dc50e0c5498926371fae06a68d7\r\nContent-Type: multipart/mixed; name = \"declaration_171220_155914166.pdf\"\nContent-Transfer-Encoding:base64\nContent-Disposition: attachment; filename = declaration_171220_155914166.pdf\n\nJVBERi0xLjMKJf///...(<- Base64 encoded attachment)...\r\n--_3c7d2a21904930ec7ff47d0cb268c6605a8d06c02dc50e0c5498926371fae06a68d7--

Что я делаю не так? Как вы думаете, что мешает нетерпимым клиентам показывать вложение?


Если это может кому-то помочь, вот мой Ruby-скрипт
require 'base64'

module Reports
  module SMTP
    BOUNDARY = '_3c7d2a21904930ec7ff47d0cb268c6605a8d06c02dc50e0c5498926371fae06a68d7'

    def self.send_report(file_path)
      file_content    = File.binread(file_path)
      encoded_content = [file_content].pack('m')   # Base64
      email_content   = headers + attachment(file_path, encoded_content) + body

      begin
        Net::SMTP.start('groupware.sdis21.org', 25, 'HELO FQDN', 'username', 'password', :plain) do |smtp|
          smtp.send_message(email_content, 'from@domain.tld', ['to@domain.tld'])
        end
      rescue => e
        puts e.inspect, e.backtrace
      end
    end

    def self.headers
      <<~EOF
        From: from@domain.tld
        To: to@domain.tld
        Subject: =?UTF-8?B?#{Base64.strict_encode64('Déclaration simplifiée de violence')}?=
        Date: #{Time.now.to_s}
        MIME-Version: 1.0
        Content-Type: multipart/mixed; boundary=#{BOUNDARY}\r
        --#{BOUNDARY}\r
      EOF
    end

    def self.body
      <<~EOF
        Content-Type: text/html;charset="utf-8"
        Content-Transfer-Encoding:utf8

        EMAIL BODY CONTENT HERE\r
        --#{BOUNDARY}\r
      EOF
    end

    def self.attachment(file_path, encoded_content)
      file_path = file_path.split('/').last
      <<~EOF
        Content-Type: multipart/mixed; name = "#{file_path}"
        Content-Transfer-Encoding:base64
        Content-Disposition: attachment; filename = #{file_path}

        #{encoded_content}\r
        --#{BOUNDARY}--\r
      EOF
    end
  end
end
0
задан 17 December 2020 в 17:15
1 ответ

Проблема заключалась в том, что используемый нами веб-клиент ожидает правильный заголовок Content-Type для вложения:

Content-Type: application/pdf; name="filename.pdf"

Чтобы выяснить это, я просмотрел некоторые электронные письма, которые я получил с постфиксного сервера (/var/spool/imap/our_domain/... ) и сравнил их с необработанным электронным письмом, которое я создаю с помощью своего скрипта. Самым заметным отличием был этот заголовок.

1
ответ дан 17 December 2020 в 14:59

Теги

Похожие вопросы