Отправить электронное письмо с текстом rtf в delphi

Я хотел бы выполнить следующую задачу: преобразовать содержимое TRichEdit (текст в формате rtf) в тело сообщения электронной почты, не являющееся обычным текстом.

MAPI не поддерживает rtf, но есть ли способ сделать это с помощью Indy?

Проблема в том, что rtf — это rtf, а электронные письма — это обычный текст или HTML.

Может кто подскажет трюк? Можно ли преобразовать rtf в текст с помощью TWebBrowser?

В основном сценарий следующий:
1) Пользователь пишет электронное письмо в форме delphi,
2) Затем электронное письмо отправляется с помощью MAPI почтовому клиенту по умолчанию (поэтому создается новое окно электронной почты, а тело сообщения является то же самое у меня было в форме delphi)
3) Пользователь отправляет письмо из почтового клиента

В любом случае MAPI принимает только обычный текст.

ОБНОВИТЬ:

Пытаясь с Indy, я написал это, но все равно это не работает, поскольку я отправляю письмо на свою учетную запись gmail, я получаю сообщение с пустым телом и фальшивым вложением NONAME.

uses IdMessageBuilder;


procedure SendMail;
var
  MBuilder: TIdMessageBuilderRtf;
  MyMemoryStream: TMemoryStream;
begin
  try
    MBuilder := TIdMessageBuilderRtf.Create;
    MyMemoryStream := TMemoryStream.Create;
    MBuilder.RtfType := idMsgBldrRtfRichtext;
    // RichEdit1 has PlainText set to False
    // at design time I pasted some formatted text onto it
    RichEdit1.Lines.SaveToStream(MyMemoryStream);
    MBuilder.Rtf.LoadFromStream(MyMemoryStream);
    MBuilder.FillMessage(IdMessage1);
    IdSMTP1.Connect;
    IdSMTP1.Send(IdMessage1);
    IdSMTP1.Disconnect;
  finally
    MyMemoryStream.Free;
    MBuilder.Free;
  end;
end;

person LaBracca    schedule 22.07.2010    source источник


Ответы (3)


Indy поддерживает отправку электронных писем в формате RTF. Отправьте электронное письмо так же, как вы бы отправили электронное письмо в формате HTML, просто используйте тип контекста «text/rtf», «text/enriched» или «text/richtext» и отправьте необработанные коды RTF, которые генерируются TRichEdit, когда его свойство PlainText имеет значение false. Кроме того, если вы используете Indy 10, посмотрите на его класс TIdMessageBuilderRtf, чтобы правильно настроить структуру TIdMessage.

person Remy Lebeau    schedule 22.07.2010
comment
есть ли пример, который показывает, как это сделать? Я пробовал это, но получаю неправильное сообщение: procedure SendMailRtf; var MBuilder: TIdMessageBuilderRtf; начать MBuilder := TIdMessageBuilderRtf.Create; MBuilder.RtfType := idMsgBldrRtfRichtext; MBuilder.Rtf := RichEdit1.Lines; // получаем rtf из reichedit MBuilder.FillMessage(IdMessage1); MBuilder.Free; ИдентификаторSMTP1.Connect; ИдSMTP1.Отправить(ИдСообщение1); ИдSMTP1.Отключить; конец; - person LaBracca; 23.07.2010
comment
Пытался найти пример для вас. Не получил, но получил один обходной путь, предоставленный кому-то, кто искал то же решение. Взгляните на nldelphi.com/forum/showthread.php?t=15822< /а> . (На голландском языке: Google Translate может быть вашим другом). Они также упоминают jvRichEditToHTML. - person Tobiasopdenbrouw; 23.07.2010
comment
Свойство TRichEdit.Lines не предоставляет доступ к кодам RTF, которые необходимы для электронной почты в формате RTF. Установите для свойства TRichEdit.PlainText значение False и вместо этого вызовите метод TRichEdit.SaveToStream(), а затем передайте полученный TStream методу TIdMessageBuilderRtf.RTF.LoadFromStream(). - person Remy Lebeau; 24.07.2010
comment
Я попытался, как вы предложили, с идеей TStream, но мне это не удалось. Не могли бы вы сказать мне, что не так в моем коде? (Я обновил свой вопрос, добавив код). Кстати, я использовал TRichEdit.Lines.SaveToStream, а не TRichEdit.SaveToStream (которого не существует). - person LaBracca; 27.07.2010
comment
@user193655: user193655: вы не устанавливаете для свойства Position потока значение 0 после вызова SaveToStream(), поэтому LoadFromStream() нечего загружать. - person Remy Lebeau; 28.07.2010

По-видимому (сам погуглил, так как я отправляю некоторые из Delphi, но не в этом случае), опция PR_RTF_COMPRESSED (расширенного) MAPI может помочь вам здесь. Также посмотрите на это.

person Tobiasopdenbrouw    schedule 22.07.2010
comment
Я бы не хотел использовать MAPI, я бы предпочел отправлять электронные письма напрямую через idSMTP - person LaBracca; 20.02.2015

Можно ли преобразовать rtf в текст с помощью TWebBrowser?

Вы можете конвертировать RTF в текст с помощью TRichEdit, но, очевидно, при этом теряется все форматирование:

Использование TRichEdit во время выполнения без определения родителя

2: Вы можете найти несколько конвертеров RTF в HTML онлайн - некоторые бесплатные, некоторые нет. Как это:

http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvRichEditToHtml https://www.habarisoft.com/scroogexhtml_delphi.html http://www.easybyte.com/products/rtf2html.html

http://www.sautinsoft.com/products/rtf-to-html/index.php

3: Вы можете переименовать вложение noname как NONAME.MHT, после чего его можно будет открыть в Internet Explorer.

Однако вы можете рассмотреть возможность использования элемента управления редактирования HTML, а не TRichEdit. Тогда вам не о чем беспокоиться. Что-то вроде этого вопроса: -

Компонент HTML-редактора WYSIWYG для Delphi

person Roddy    schedule 19.02.2015
comment
@ user193655 - Ах, да :) Я думаю, ваша проблема в том, что gmail (и многие другие клиенты) не поддерживают RTF в электронных письмах, поэтому преобразование в HTML - единственный способ. Вы смотрели на любой из этих конвертеров RTF в HTML? - person Roddy; 20.02.2015
comment
Полезно знать о gmail и rtf, так что rtf — это способ отказаться. Преобразователи, которые вы linekd, являются .net, я бы предпочел компонент VCL или библиотеку win32. Вероятно, rtf в html - мое единственное решение. - person LaBracca; 23.02.2015