Как программа Delphi может отправлять электронную почту с вложениями через почтовый клиент DEFAULT?

В моей программе я создаю электронную почту для отправки, используя программное обеспечение почтового клиента по умолчанию, установленное на компьютере пользователя.

Я составил почтовый адрес, тему, многокомпонентное тело, и у меня есть несколько вложений.

Я почти получил это с помощью mailto и ShellExecute следующим образом:

  Message := 'mailto:[email protected]'
    + '?subject=This is the subjectBehold Error Report'
    + '&body=This is line 1' + '%0D%0A'
    + 'This is line 2' + '%0D%0A'
    + 'This is line 3'
    + '&Attach=c:\file1.txt';
  RetVal := ShellExecute(Handle, 'open', PChar(Message), nil, nil, SW_SHOWNORMAL);
  if RetVal <= 32 then
    MessageDlg('Cannot find program to send e-mail.', mtWarning, [mbOK], 0);

Используя Delphi 2009 на компьютере с Windows Vista, откроется окно «Создание почты» в Microsoft Mail, в котором поля «Кому», «Тема» и «Тело» заполнены правильно. Однако файл не прикрепляется.

Когда я исследовал это, я заметил некоторые комментарии, утверждающие, что этот метод работает не со всеми почтовыми клиентами. Однако большинство комментариев довольно старые, так как я понимаю, что это очень старая техника.

Тогда я обнаружил, чтоСказал Зарко Гаджич что «этот подход в порядке, но вы не можете отправлять вложения таким образом».

Я также видел Windows Simple Mail API (MAPI), но Зарко говорит, что это работает, только если у конечного пользователя есть MAPI-совместимое почтовое программное обеспечение. Существуют хорошо документированные методы использования MAPI с Delphi (например,Отправка электронной почты с помощью mapi), но все они имеют отказ от ответственности, что MAPI не всегда устанавливается с Windows.

Кроме того, я действительно хочу, чтобы сообщение появилось первым в почтовой программе пользователя по умолчанию, поэтому они будут иметь его в своих записях электронной почты, и они смогут его редактировать и решать, когда и когда они захотят его отправить. Я не уверен, как работает MAPI и будет ли он это делать.

Итак, мои требования:

Поднять электронную почту в почтовой программе пользователя.

Чтобы разрешить одно или несколько вложений.

Работать (надеюсь) со всеми почтовыми клиентами на любом компьютере с Windows от XP (т.е. XP, Vista или 7).

Есть ли такое животное? Или, может быть, кто-то знает, как получить вложения для работы с техникой mailto / ShellExecute?

Что делает большинство людей?

Редактировать:

Было несколько ответов с решениями MAPI и даже с решением Indy.

Проблема с ними в том, что они не обязательно используют почтовый клиент по умолчанию. Например, на моем компьютере с Vista я установил Windows Mail в качестве клиента по умолчанию. Когда я отправляю MAPI, он не вызывает Почту Windows, но вместо этого вызывает и настраивает электронную почту в Outlook. Я не хочу этого

Двое из моих пользователей моей программы жаловались:

Ваша процедура отладки не может отправить файл, так как она пытается запустить почту Windows по какой-то известной ей причине, а не с помощью почтового клиента по умолчанию (в моем случае thunderbird)

Я попытался заполнить отчет об исключении, но сдался, когда запросил этот сервер, этот сервер! Затем я был действительно раздражен, потому что он запустил Outlook - я никогда, никогда не использую его или не хочу его использовать.

Мне не нужен код для MAPI или Indy. Они легко доступны. Но если вы предложите MAPI или Indy, то мне действительно нужен способ найти клиента по умолчанию и убедиться, что именно он передан по электронной почте для отправки.

Также мне нужно знать, универсален ли сейчас MAPI. 5 лет назад не было гарантированно работать на всех машинах, потому что он не был установлен как часть операционной системы. Это все еще правда, или MAPI теперь поставляется с Windows XP, Vista и 7 по умолчанию?

Те же вопросы относятся к Indy или любым другим предлагаемым решениям. Может ли он работать с клиентом по умолчанию и будет ли он работать практически на всех компьютерах с Windows XP и более поздними версиями?

Причина, по которой решение "mailto" так приятно, заключается в том, что все машины должны поддерживать его для обработки HTML-оператора mailto, найденного на веб-страницах. Теперь, если бы я мог использовать его для добавления вложений ...

Вероятное решение найдено: mjustin указал на альтернативу, которая использует команду sendto операционной системы. Скорее всего, это путь.

Mailto не был ограничен 256 символами, как HTML mailto, но я был опустошен, узнав, что он ограничен 2048 символами. К счастью, несколько часов спустя Мюстин дал свой ответ.

Если реализация этого пойдет хорошо, его ответ сделает это за меня. Если нет, я добавлю свои комментарии здесь.

Нет. Как оказалось, решение sendto не всегда открывает программу электронной почты по умолчанию. На моей машине он открывает Outlook, когда мой почтовый по умолчанию Windows Mail. Жаль. Мне пришлось вернуться к методу mailto, несмотря на ограничение в 2048 символов.

Я нашел, однако, в статье:SendTo получатель почты это:

На этом этапе вы могли бы заменить :: ShellExecute продуманным вызовом :: WinExec, используя фактическую командную строку mailto, объявленную в реестре, и нацелить на текущий почтовый клиент (например, «% ProgramFiles% \ Outlook Express \ msimn» .exe "/ mailurl:% 1). Но тогда ограничение составляет 32 КБ. В заключение, нет способа отправить электронную почту размером более 32 КБ с использованием протокола mailto.

но тогда я должен был бы определить, кем является почтовый клиент в каждом случае. Я ожидаю, что это приведет к дальнейшим осложнениям.

Еще одна вещь, которую я обнаружил, заключается в том, что mailto позволяет устанавливать «to», «cc», «bcc», «subject» и «body», но без вложений. Принимая во внимание, что sendto ТОЛЬКО разрешает вложения, а затем устанавливает электронное письмо по умолчанию с сообщением по умолчанию, и вы не можете устанавливать различные поля и текст.

Ответы на вопрос(5)

Ваш ответ на вопрос