Отправка электронной почты Outlook с помощью Delphi

#delphi #outlook

#delphi #outlook

Вопрос:

Я могу успешно отправить электронное письмо с помощью OLE между Delphi 10.4 и Outlook 365.

 try
  Outlook:=GetActiveOleObject('Outlook.Application');
except
  Outlook:=CreateOleObject('Outlook.Application');
end;

try
  MailItem:= Outlook.CreateItem(olMailItem) ;

  SubjectLine:= 'Whatver';
  MailItem.Subject:= SubjectLine;

  EmailTo:= 'somebody@somewhere.com';
  MailItem.Recipients.Add(EmailTo);

  MailItem.BodyFormat := olFormatPlain;
  MailItem.GetInspector;

  Attachment:= 'C:File.doc';
  MailItem.Attachments.Add(Attachment);

  MessageBodyStr:= 'Dear Friend';
  MailItem.Body:= MessageBodyStr;

  MailItem.Display(False);

finally
  Outlook := Unassigned;
end;
  

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

Когда я использую это

 MailItem.Send;
  

Я понимаю это

 EOleSysError: The parameter is incorrect
  

Что не так?
Как я могу пропустить редактор и просто отправить электронное письмо?
Есть предложения?

Спасибо

Комментарии:

1. Разве вы не можете просто использовать SMTP-клиент?

2. На самом деле нет. Для моего проекта я также собираю входящие электронные письма для автоматической обработки определенных вложений. Если детали отсутствуют, мне нужно отправить электронное письмо обратно, чтобы запросить дополнительную информацию.

3. Попробуйте MailItem. Отправка электронной почты;

4. Нет. Я получаю еще одну ошибку. Ошибка EOleError: метод ‘SendMail’ не поддерживается объектом автоматизации

Ответ №1:

Возможно, сегодня твой счастливый день, Боб!

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

За последние несколько недель некоторые из этих пользователей обновились до последних версий Office 365 и начали испытывать точно такую же ошибку «Параметр неверен» при отправке по почте.Вызывается функция отправки. У всех этих пользователей были одни и те же общие черты:

  1. Они НЕ обновили наше приложение (они по-прежнему используют ту же версию, которая работала нормально в течение многих лет)
  2. Они обновили Office 365.

Учитывая эти два пункта выше, не нужно быть специалистом по ракетам, чтобы сделать вывод, что Microsoft, должно быть, что-то изменила в последних версиях Office 365, и это изменение вызывает эту ошибку.

Я открыл обращение в службу поддержки Microsoft Office 365, и, как и следовало ожидать, дело продолжалось по кругу, а Microsoft не предоставила никакого решения.

Глупость в сообщении об ошибке «Параметр неверен» заключается в том, что MailItem .Отправка не принимает никаких параметров!

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

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

Но для меня, комментируя MailItem.GetInspector не является долгосрочным вариантом, потому что я использую инспектор для выполнения нескольких манипуляций с телом электронной почты.

Итак, я прочитал документы для объекта Inspector и нашел метод Close. Я добавил вызов Inspector.Закройте после манипуляций с телом письма и перед вызовом MailItem.Send. Бинго! Это исправило ошибку!!!!

Вот пример кода VBA, который работает. Я протестировал его в Excel.

 Sub TestSendEmail()
    Dim app As Outlook.Application
    Dim nameSpace As Outlook.nameSpace
    Dim folder As Outlook.MAPIFolder
    Dim mailItem As Outlook.mailItem
    Dim insp As Outlook.Inspector
    Dim wordDocumentEditor As Word.Document
    
    On Error GoTo errorHandler
    Set app = New Outlook.Application
    Set nameSpace = app.GetNameSpace("MAPI")
    Set folder = nameSpace.GetDefaultFolder(Outlook.olFolderOutbox)
    Set mailItem = app.CreateItem(Outlook.olMailItem)
    mailItem.Subject = "Test Subject"
    mailItem.To = "joe.kelly@binarystream.com"
    Set insp = mailItem.GetInspector
    Set wordDocumentEditor = insp.WordEditor
    wordDocumentEditor.Range(0, 0).InsertBefore ("Test Body")
    insp.Close (olSave)
    MsgBox "Calling Send"
    mailItem.Send
    MsgBox "Send Complete"
Done:
    Exit Sub
errorHandler:
    MsgBox "The following error occurred: " amp; Err.Number amp; ": " amp; Err.Description
End Sub
  

Боб, пожалуйста, ответьте, чтобы сообщить мне, если инспектор.Закрыть исправил ошибку для вас.

Комментарии:

1. Привет, FiveLoop. Извините за поздний отзыв. Я не получил никакого уведомления о вашем ответе. К сожалению, это не мой счастливый день. Я по-прежнему получаю другую ошибку: метод SendMail не поддерживается объектом автоматизации. И, поскольку вы эксперт, у меня есть еще один вопрос. При готовности входящих писем я успешно использую Mail.SenderEmailAddress или Mail.Sender. Адрес с Office 365. Однако при использовании с Outlook 2016 я также получаю сообщение об ошибке «не поддерживается объектом автоматизации». Любой совет?

2. @fiveloop, ты настоящий мужчина! Я был сумасшедшим, пытаясь решить эту проблему «параметр неверен», которая возникла около 1 месяца назад в OL365 при вызове send (). Спасибо!!