У нас есть служба Windows, написанная на Delphi 7, которая отправляет электронные письма, содержащие HTML. Это работало отлично, прежде чем я добавил вложения. После добавления вложений HTML больше не отображается как HTML, а отображается как обычный текст.
После некоторых исследований я обнаружил, что мне нужно установить тип содержимого почты на multipart/mixed
, однако это, похоже, ничего не меняет. Я также нашел несколько статей, показывающих, что я должен использовать MessageParts
при добавлении нескольких типов контента, таких как следующие:
Для вложений у меня есть следующий код, который отлично работает.
for I := 0 to slAttachments.Count -1 do
begin
with TIdAttachment.Create(MailMessage.MessageParts, slAttachments[I]) do
begin
ContentType := 'application/pdf';
end;
end;
Использование TIdText, как показано ниже, оставляет тело письма пустым после отправки. Отладка показывает, что sMsg
содержит правильный HTML, но не отправляется вместе с письмом.
MailText := TIdText.Create(MailMessage.MessageParts, nil);
MailText.ContentType := 'text/html';
MailText.Body.Text := sMsg;
Если я напрямую установлю тело MailMessage
, html будет отображаться как обычный текст.
MailMessage.Body.Text := sMsg;
Полный код:
//setup mail message
MailMessage.From.Address := msFromAddress;
MailMessage.Recipients.EMailAddresses := sToAddress;
MailMessage.Subject := sSubject;
MailMessage.ContentType := 'multipart/mixed';
// Add Attachments
for I := 0 to slAttachments.Count -1 do
begin
with TIdAttachment.Create(MailMessage.MessageParts, slAttachments[I]) do
begin
ContentType := 'application/pdf';
end;
end;
// Add HTML
MailText := TIdText.Create(MailMessage.MessageParts, nil);
MailText.ContentType := 'text/html';
MailText.Body.Text := sMsg;
Как я могу отправлять вложения и одновременно отображать HTML-код? Тот же код правильно работает в Delphi 10. Я не могу обновить этот проект до Delphi 10 из-за некоторых зависимостей. Indy также нельзя обновить из-за критических изменений.
Вы читали HTML-сообщения на сайте Инди? Использование TIdMessage.MessageParts
и 'multipart/mixed'
правильно, и на первый взгляд код выглядит нормально, однако почему вы добавляете PDF-файлы перед HTML, а не за ним? Теоретически это должно сработать, но на практике я бы вместо этого поместил HTML впереди.
Я прочитал часть этого да, но не так, как должен был. Вот где я получил код для вложений и т. д. Я не понимаю, как должно быть структурировано электронное письмо, содержащее вложения и HTML. Попробую поменять, посмотрим что получится. Я тоже прочитаю всю статью.
@RemyLebeau Кажется, я понял это. Я не уверен, почему это работает. Итак, как вы предложили, я сначала поместил HTML, а затем вложения. Это ничего не изменило. Все еще получил пустое электронное письмо с только вложениями. Затем я добавил обычный текст TIdText с телом «Test Message» и после слов еще один TIdText, но на этот раз HTML. Глядя на электронное письмо, похоже, что первый TIdText не добавляется и не отправляется. Только второй. Я подозреваю, что это была ошибка Indy9, которая была исправлена в Indy10.
Кажется, это ошибка в Indy9, когда первый TIdText игнорируется при добавлении вложений. Добавление простого TIdText, кажется, решило эту проблему.
Протестированный и рабочий код ниже. Первый TIdText, содержащий обычный текст, кажется, игнорируется, однако при его удалении игнорируется html.
// Set content type for the mail message
MailMessage.ContentType := 'multipart/mixed';
// Plain text body
With TIdText.Create(MailMessage.MessageParts, nil) do
begin
ContentType := 'text/plain';
Body.Text := 'This gets ignored for some reason'; // Doesn't have to be empty
end;
// HTML (HTML body to send)
With TIdText.Create(MailMessage.MessageParts, nil) do
begin
ContentType := 'text/html';
Body.Text := '<h1>Hello World</h1>';
end;
// Attachments
for I := 0 to slAttachments.Count -1 do
begin
with TIdAttachment.Create(MailMessage.MessageParts, slAttachments[I]) do
begin
ContentType := 'application/pdf';
end;
end;
// Send the mail
smtp.Send(MailMessage);
Delphi 7 использует Indy ver. 9 по умолчанию, что очень старо. Вы можете попробовать исключить Indy 9 из стандартной установки Delphi 7 и установить последнюю версию Indy 10 в Delphi 7. Ожидайте серьезных изменений.