切换到office365后,Outlook新消息不起作用

时间:2016-05-10 07:23:13

标签: email delphi outlook ole

我们的应用程序中有以下功能,它在Outlook中打开一条新消息,以便用户可以通过Outlook发送电子邮件。

var selection = '';//your selection string
var selObj = window.getSelection(); 
var selRange = selObj.getRangeAt(0);
var nextElem;

// Get start of the 
selection += selObj.startContainer.getText().substr(selObj.startOffset);    
nextElem = selObj.startContainer;
while(true) {

  nextElem = nextElem.nextElem; // Get this somehow
  selection += nextElemr.getText();
  if(condition) {
     break;
  }
}

it's all greek to me

这种情况多年来一直很好......自从几天前客户端切换到Office365以来。 当从outlook创建新消息时,它可以正常工作,当它从我们的应用程序创建时,它无法发送消息。

在Outlook 2010中,错误消息是: "无法完成操作。一个或多个参数值无效。"

在Outlook 2016中,错误消息是: "抱歉出了问题。您可能想再试一次" outlook 2016 error

我还注意到,当从我们的应用程序创建新消息时,它无法保存到草稿中,并且会抛出相同的错误。

该过程将打开新的消息窗口,但是当按下“发送邮件”时,Outlook无法发送它。 我该怎么办,解决这个问题?在调用Display之前,是否需要设置一些属性?

更新:由于大卫的持续性,我已将其缩小范围。当ToAddress参数为空(或空格)时,Outlook会产生错误。 因此,添加以下代码似乎可以解决问题。

program SO_37131815;
{$APPTYPE CONSOLE}

uses
  Classes, ActiveX, ComObj, Variants, SysUtils;

procedure OutlookMail(ToAddress, Subject: string);
var
  OutlookProgram: OLEVariant;
  MailItem: Variant;
begin
  try
    OutlookProgram := GetActiveOleObject('Outlook.Application');
  except
    OutlookProgram := CreateOleObject('Outlook.Application');
  end;

  MailItem := OutlookProgram.CreateItem(0);

  if ToAddress = '' then begin
    ToAddress := ' ';
  end;
  MailItem.Recipients.Add(ToAddress);
  MailItem.Subject := Subject;

  try
    MailItem.Display(False); //.Display(Modal)
  except
    //don't worry...
  end;

  OutlookProgram := Unassigned;
end;

begin
  CoInitialize(nil);
  OutlookMail('', 'blah');
end.

有没有人有更好的主意?

1 个答案:

答案 0 :(得分:4)

ToAddress参数为空时,不应将空格(或空字符串)参数传递给MailItem.Recipients.Add方法。

所以解决方案是避免上述情况:

if Trim(ToAddress) <> '' then
  MailItem.Recipients.Add(ToAddress);