【发布时间】:2016-09-05 00:51:04
【问题描述】:
我们的应用程序中有以下功能,可以在 Outlook 中打开一条新消息,以便用户可以通过 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.
这多年来一直运行良好......自从几天前客户端切换到 Office365 以来。 当从 Outlook 创建新消息时,它工作正常,当它从我们的应用程序创建时,它无法发送消息。
在 Outlook 2010 中,错误消息是: “无法完成操作。一个或多个参数值无效。”
在 Outlook 2016 中,错误消息是: “抱歉,出了点问题。您可能想再试一次”。
我还注意到,当从我们的应用程序创建新消息时,它无法保存到草稿中,并且会引发相同的错误。
该过程会打开新的邮件窗口,但是当按下发送邮件时,Outlook 无法发送它。 我能做些什么来解决这个问题?我需要在调用 Display 之前设置一些属性吗?
更新:感谢 David 的坚持,我缩小了范围。当 ToAddress 参数为空(或空格)时,Outlook 会产生错误。 所以添加以下代码似乎可以解决问题。
if Trim(ToAddress) <> '' then begin
MailItem.Recipients.Add(ToAddress);
end;
有人有更好的主意吗?
【问题讨论】:
-
你能不能提供一个minimal reproducible example
-
任何拥有 Outlook(设置为使用 office365)的人都可以将程序复制粘贴到按钮中并调用它。我不明白还能做什么。
-
如果我们有一个完整的程序,工作量就会减少。我们必须确保我们指定了必要的使用条款。我们可以粘贴的完整控制台应用程序对我们来说工作量会减少,而且我们会确保我们运行的代码与您相同。大概您自己拥有 Office 365?你有没有做过任何调试?哪一行代码导致错误?
-
感谢您的编辑。我将其进一步发展为一个完整的程序。我们现在可以粘贴它并直接运行它,而不会造成混淆。如果我是你,我会去掉代码,看看你是否能找出一条不会发生错误的行。
-
我不确定您是否解决了问题。如果
ToAddress为空,为什么要添加MailItem.Recipients.Add(ToAddress);?