Gửi Email Outlook với Delphi

Oct 05 2020

Tôi có thể gửi thành công email bằng OLE giữa Delphi 10.4 và Outlook 365.

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

try
  MailItem:= Outlook.CreateItem(olMailItem) ;

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

  EmailTo:= '[email protected]';
  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;

Điều này đang hoạt động tốt. Nhưng tôi muốn gửi email trực tiếp mà không cần hiển thị trình chỉnh sửa email

Khi tôi đang sử dụng cái này

MailItem.Send;

Tôi hiểu rồi

EOleSysError: The parameter is incorrect

Chuyện gì vậy ? Làm cách nào để bỏ qua trình chỉnh sửa và chỉ gửi email? Bất kì lời đề nghị nào ?

Cảm ơn

Trả lời

2 fiveloop Oct 15 2020 at 19:26

Hôm nay có thể là ngày may mắn của bạn, Bob!

Tôi duy trì một ứng dụng sử dụng Mô hình Đối tượng Outlook để gửi email. Mã để gửi email đã không thay đổi trong vài năm và hàng nghìn người dùng đã sử dụng nó thành công.

Trong vài tuần qua, một số người dùng đã nâng cấp lên phiên bản mới nhất của Office 365 và bắt đầu gặp phải lỗi "Tham số không chính xác" giống hệt nhau khi gọi MailItem.Send. Tất cả những người dùng đó đều có những điểm chung giống nhau:

  1. Họ KHÔNG nâng cấp ứng dụng của chúng tôi (họ vẫn đang chạy cùng một phiên bản hoạt động tốt trong nhiều năm)
  2. Họ DID nâng cấp Office 365.

Với hai điểm trên, không cần một nhà khoa học tên lửa nào kết luận rằng Microsoft hẳn đã thay đổi điều gì đó trong các phiên bản Office 365 mới nhất và sự thay đổi đó gây ra lỗi này.

Tôi đã mở một trường hợp với Nhóm hỗ trợ Office 365 của Microsoft và như có thể mong đợi, trường hợp này đã xảy ra xung quanh mà không có Microsoft cung cấp bất kỳ giải pháp nào.

Điều ngu ngốc về thông báo lỗi "Tham số không chính xác" là MailItem.Send không nhận bất kỳ tham số nào!

Dù sao, tôi đã từ bỏ Nhóm hỗ trợ Office 365 của Microsoft và bắt đầu mày mò với mã, mã này đã không được thay đổi trong nhiều năm.

Sau nhiều lần mày mò, tôi phát hiện ra rằng, vì một số lý do không xác định và không có giấy tờ, lệnh gọi tới MailItem.GetIns Inspector dường như gây ra cuộc gọi tiếp theo tới MailItem.Send để phát sinh lỗi. Khi tôi nhận xét về MailItem.GetIns Inspector, MailItem.Send hoạt động hoàn hảo và không gây ra lỗi.

Nhưng đối với tôi, nhận xét MailItem.GetIns Inspector không phải là một lựa chọn lâu dài bởi vì tôi sử dụng Thanh tra để thực hiện một số thao tác với nội dung email.

Vì vậy, tôi đã đọc tài liệu cho đối tượng Thanh tra và tìm thấy phương thức Đóng. Tôi đã thêm một cuộc gọi tới Inspector.Close sau khi thao tác nội dung email và trước cuộc gọi tới MailItem.Send. Chơi lô tô! Điều đó đã sửa lỗi !!!!

Đây là một số mã mẫu VBA hoạt động. Tôi đã thử nghiệm nó trong 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 = "[email protected]"
    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: " & Err.Number & ": " & Err.Description
End Sub

Bob, vui lòng trả lời lại cho tôi biết nếu Inspector.Close đã sửa lỗi cho bạn.