0

次のコードを実行すると、エラーが表示されますthe item is moved or deleted

Outlook.Application outlookApp = new Outlook.Application();
Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
mailItem.Subject = mailSubject;
mailItem.To = "";
mailItem.CC = "";
mailItem.Attachments.Add(totalPath);
mailItem.Body = mailBody;
mailItem.Importance = Outlook.OlImportance.olImportanceNormal;
mailItem.Display(true);
//Mail is send succesfully?
Bool sent = true;
if (!mailItem.Sent)
{
   sent = false;
}

mailItem.Sent プロパティを確認すると、エラーが表示されます。

私の質問は、どのように機能し.Sentますか? エンド ユーザーに電子メール メッセージを表示し、電子メールが送信されたかどうかを確認しようとしています。

4

2 に答える 2

1

Display メソッドを呼び出す (true を渡す) と、メール アイテムは存在しなくなる可能性があります。トランスポート プロバイダによるさらなる処理のために、送信ボックス フォルダに移動できます。

Sentプロパティは一度設定され、探しているものではありません。さらに、Display メソッドを呼び出した直後に Sent プロパティの値を確認することはお勧めできません。メール アイテムは、まだ送信されていない状態で、トランスポート プロバイダーによって処理されるようにマークできます。代わりに、コードでItemSendイベントを処理する必要があります。ただし、件名を確認することは安定した解決策ではありません。少なくとも、ユーザーはインスペクタ ウィンドウが表示されている間に事前設定値を変更できます。

MailItem クラスの display メソッドを呼び出す前に、ユーザー プロパティ (独自の ID) を MailItem に追加できます。その後、ItemSendイベント ハンドラーで値をチェックアウトし、必要に応じて削除できます。したがって、アイテムが送信されることを確認できます (実際には送信されません)。

メール アイテムが確実に送信されたことを確認する必要がある場合は、Items クラスのItemAddイベントを処理することをお勧めします (Folder クラスの対応するプロパティを参照してください)。たとえば、Outlook アイテムが送信されると、送信済みのコピーが Outlook の [送信済みアイテム] フォルダーに配置されます。そのフォルダの ItemAdd イベントを処理して、アイテムが確実に送信されたことを確認できます。Outlook アイテムを表示する前にユーザー プロパティを追加し、ItemAdd イベント ハンドラーでそれをチェックして、アイテムを一意に識別することを検討してください。

送信済みメールを配置するカスタム フォルダーを指定できることに注意してください。MailItem クラスのSaveSentMessageFolderプロパティを使用すると、送信後に電子メール メッセージのコピーが保存されるフォルダーを表す Folder オブジェクトを設定できます。そのため、送信済みメールを独自のカスタム フォルダーに移動できます。

于 2015-05-20T13:17:27.483 に答える
0

これが私がこれを解決した方法です:

type
  TOutlookFolderItemsEvent = procedure(ASender: TObject; const Item: IDispatch) of object;
  TOutlookFolderItems = class(TOleServer)
  private
    FIntf: _Items;
    FOnItemAdd: TOutlookFolderItemsEvent;
  protected
    procedure InitServerData; override;
    procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
  public
    procedure Disconnect; override;
    procedure Connect; override;
    procedure ConnectTo(svrIntf: _Items);

    property OnItemAdd: TOutlookFolderItemsEvent read FOnItemAdd write FOnItemAdd;
  end;

  TMyForm = class(TForm)
    OutlookApplication1: TOutlookApplication;
  private
    FMyEntryID: String;
    FItems: TOutlookFolderItems;
    procedure ItemsItemAdd(ASender: TObject; const Item: IDispatch);
    procedure MySendEmail;
  end;

procedure TMyForm.MySendEmail;
var
  Mi: MailItem;
  EntryID: TGUID;
begin
  OutlookApplication1.Disconnect;
  OutlookApplication1.Connect;
  OutlookApplication1.Application.ActiveExplorer.WindowState := olMaximized;

  CreateGuid(EntryID);
  FMyEntryID:= GUIDToString(EntryID);
  Mi.UserProperties.Add('MyEntryID', olText, True, olText).Value := FMyEntryID;

  Mi.Save;
  Mi.Display(0);

  // Add the following code to OutlookApplication's OnItemSend
  // to get a more accurate SaveSentMessageFolder
  // (as it may change when selecting from different From accounts)
  FItems := TOutlookFolderItems.Create(Self);
  FItems.ConnectTo(Mi.SaveSentMessageFolder.Items);
  FItems.OnItemAdd := ItemsItemAdd;
end;

procedure TMyForm.ItemsItemAdd(ASender: TObject; const Item: IDispatch);
var
  S: String;
  I: MailItem;
  P: UserProperty;
begin
  I := Item as MailItem;

  P := I.UserProperties.Find('MyEntryID', True);

  if (P = nil) or (P.Value <> FMyEntryID) then Exit; // Not the email we're waiting for

  // MailItem is known to be sent and in SentFolders here.
  // Add here any relevant code.
end;

{ TOutlookFolderItems }

procedure TOutlookFolderItems.Connect;
begin
end;

procedure TOutlookFolderItems.ConnectTo(svrIntf: _Items);
begin
  Disconnect;
  FIntf := svrIntf;
  ConnectEvents(FIntf);
end;

procedure TOutlookFolderItems.Disconnect;
begin
  if Fintf <> nil then
  begin
    DisconnectEvents(FIntf);
    FIntf := nil;
  end;
end;

procedure TOutlookFolderItems.InitServerData;
const
  CServerData: TServerData = (
    ClassID:   '{00063052-0000-0000-C000-000000000046}';
    IntfIID:   '{00063041-0000-0000-C000-000000000046}';
    EventIID:  '{00063077-0000-0000-C000-000000000046}';
    LicenseKey: nil;
    Version: 500);
begin
  ServerData := @CServerData;
end;

procedure TOutlookFolderItems.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
  case DispID of
    -1: Exit;  // DISPID_UNKNOWN
    61441: if Assigned(FOnItemAdd) then
         FOnItemAdd(Self, Params[0] {const IDispatch});
  end;
end;
于 2016-06-29T05:02:11.700 に答える