- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从我的 Delphi 程序中,我希望能够从我的 OutLook 中的某个文件夹中检索所有邮件并将它们保存为文件。
我需要检索发件人、主题、日期和消息 ID,以便将信息保存在表格中(如果可能,更多部分)
我希望将每封邮件保存在一个文件中,以便以后可以访问它们。
最佳答案
这是完全可能的。您需要的是 Outlook 自动化。可以是普通的 Vanilla 类型,也可以是使用 Delphi 附带的 COM 服务器包装器的那种。如果您使用的是较新版本的 Delphi 之一,则可能必须安装相应的软件包才能在您的调色板中找到它们。见 How to get TExcelWorksheet (the 64-bit version) in XE2?了解更多信息。
有关如何使 Outlook 自动化的更多信息,请直接访问源:有关 Outlook COM 对象模型和 API 的文档的 MSDN:http://msdn.microsoft.com/en-us/library/ms268893(v=vs.80).aspx
另一个来源是 Deborah Pate 的 COM 编程站点。可能很久没更新了,但是里面的信息还是不错的,相关的:http://www.djpate.freeserve.co.uk/Automation.htm
示例代码
单元包含两个类来读取特定文件夹中的邮件。它使用 Delphi 形式的 Outlook COM 服务器包装器(一个非常旧的版本),但您不需要将它们放在调色板上,因为它们是在代码中实例化的。当然,您确实需要在搜索路径上有 COM 包装器单元。
像这样实例化 TSiteMailList 类:
FMailList := TSiteMailList.Create('MAPI', 'Folder1', 'Folder2');
TSiteMailList = class(TObject)
private
FShowUnreadOnly: boolean;
FMails: TObjectList;
FOutlook: TOutlookApplication;
FNameSpace: NameSpace;
FNewMailsFolder: MAPIFolder;
FProcessedMailsFolder: MAPIFolder;
function FindFolder(FolderPath: string): MAPIFolder;
procedure LoadMails;
function GetSiteMail(idx: integer): TSiteMail;
function GetShowUnreadOnly: boolean;
procedure SetShowUnreadOnly(const Value: boolean);
protected
function GetCount: integer;
public
constructor Create(MAPINameSpace: string; NewMailsFolder, ProcessedMailsFolder:
string);
destructor Destroy; override;
procedure MarkAsProcessed(SiteMail: TSiteMail);
procedure Reload;
property ShowUnreadOnly: boolean read GetShowUnreadOnly write SetShowUnreadOnly;
property Count: integer read GetCount;
property SiteMail[idx: integer]: TSiteMail read GetSiteMail;
end;
constructor TSiteMailList.Create(MAPINameSpace: string; NewMailsFolder,
ProcessedMailsFolder: string);
begin
FOutlook := TOutlookApplication.Create( nil );
FOutlook.ConnectKind := ckNewInstance;
FOutlook.Connect;
FNameSpace := FOutlook.GetNameSpace( MAPINameSpace );
FNameSpace.Logon( '', '', False, False );
FNewMailsFolder := FindFolder( NewMailsFolder );
FProcessedMailsFolder := FindFolder( ProcessedMailsFolder );
FShowUnreadOnly := false;
FMails := TObjectList.Create( true );
LoadMails;
end;
destructor TSiteMailList.Destroy;
begin
FMails.Free;
if FNameSpace <> nil then begin
FNameSpace.Logoff;
end;
FOutlook.Disconnect;
FOutlook.Free;
inherited;
end;
procedure ExtractFolderFromPath(var path, folder: string);
var
i: integer;
begin
folder := '';
if path[1] = '\' then begin
path := Copy( path, 2, Length( path ) - 1 );
end;
i := Pos( '\', path );
if i > 0 then begin
folder := Copy( path, 1, i - 1 );
path := Copy( path, i + 1, Length( path ) - i );
end else begin
folder := path;
path := '';
end;
end;
function TSiteMailList.FindFolder(FolderPath: string): MAPIFolder;
var
path: string;
foldername: string;
xFolder: MAPIFolder;
begin
path := FolderPath;
ExtractFolderFromPath( path, foldername );
if foldername <> '' then begin
xFolder := FNameSpace.Folders.Item( foldername );
end;
while path <> '' do begin
ExtractFolderFromPath( path, foldername );
xFolder := xFolder.Folders.Item( foldername );
end;
Result := xFolder;
end;
procedure TSiteMailList.LoadMails;
var
i: integer;
GeneralItem: IDispatch;
MI: MailItem;
begin
FMails.Clear;
for i := 1 to FNewMailsFolder.Items.Count do begin
GeneralItem := FNewMailsFolder.Items.Item( i );
if Sysutils.Supports(GeneralItem, MailItem, MI) then begin
if not FShowUnreadOnly
or ( FShowUnreadOnly and ( MI.Unread = true ) )
then begin
FMails.Add( TSiteMail.Create( i, MI ) );
end;
end;
end;
end;
TSiteMail = class(TObject)
private
FOutlookIdx: integer;
FMailItem: MailItem;
function GetIsRead: boolean;
procedure SetIsRead(const Value: boolean);
protected
function GetBody: string;
function GetFileCount: integer;
function GetFileName(idx: integer): string;
function GetReceived: TDateTime;
function GetSender: string;
function GetSubject: string;
public
constructor Create(idx: integer; MI: MailItem);
destructor Destroy; override;
function IndexOfFileName(Name: string): integer;
procedure MoveToFolder(Folder: MAPIFolder);
procedure SaveFile(idx: integer; FileName: string);
property Body: string read GetBody;
property FileCount: integer read GetFileCount;
property FileName[idx: integer]: string read GetFileName;
property IsRead: boolean read GetIsRead write SetIsRead;
property Received: TDateTime read GetReceived;
property Sender: string read GetSender;
property Subject: string read GetSubject;
end;
constructor TSiteMail.Create(idx: integer; MI: MailItem);
begin
FOutlookIdx := idx;
FMailItem := MI;
end;
destructor TSiteMail.Destroy;
begin
FMailItem := nil; // Release interface
inherited;
end;
function TSiteMail.GetBody: string;
begin
Result := FMailItem.Body;
end;
function TSiteMail.GetFileCount: integer;
begin
Result := FMailItem.Attachments.Count;
end;
function TSiteMail.GetFileName(idx: integer): string;
begin
Result := FMailItem.Attachments.Item( idx + 1 ).FileName;
end;
function TSiteMail.GetIsRead: boolean;
begin
Result := not FMailItem.UnRead;
end;
function TSiteMail.GetReceived: TDateTime;
begin
Result := FMailItem.ReceivedTime;
end;
function TSiteMail.GetSender: string;
begin
Result := FMailItem.SenderName;
end;
function TSiteMail.GetSubject: string;
begin
Result := FMailItem.Subject;
end;
function TSiteMail.IndexOfFileName(Name: string): integer;
var
idx: integer;
begin
Result := -1;
for idx := 1 to FMailItem.Attachments.Count do begin
if CompareText( Name, FMailItem.Attachments.Item( idx ).FileName ) = 0 then begin
Result := idx - 1;
break;
end;
end;
end;
procedure TSiteMail.MoveToFolder(Folder: MAPIFolder);
begin
FMailItem.Move( Folder );
end;
procedure TSiteMail.SaveFile(idx: integer; FileName: string);
begin
FMailItem.Attachments.Item( idx + 1 ).SaveAsFile( FileName );
end;
procedure TSiteMail.SetIsRead(const Value: boolean);
begin
FMailItem.UnRead := not Value;
end;
关于delphi - 将邮件从 OutLook 拉到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9750127/
我试图让我的 jQuery 脚本从单击的链接中提取 url,然后将其插入到我的视频标签中。有什么建议吗? 我试过拼接我从 .html() 中得到的内容,但引号总是搞砸了。
我遇到了 docker 的问题。 场景是这样的:我们使用Codebuild+Packer+docker创建AMI,用于deploy。在这一步中,我们从 Artifactory 中提取图像,并且除了提取
我目前正在学习 RxJS。 在文档中,我找到了这个数组。 我尝试在谷歌上搜索“pull and push javascript”,但我什至不知道如何调用这些实体/概念。我不明白那是什么意思?我假设 S
Title 在小屏幕上,我首先需要标题,然后是文本字段,但在中等以上的屏幕上,我需要相反的方式 - 我已经尝试过推和拉,但它们无法工作 - 有什么想法吗? 最佳答案 根据 Swa
zmq 的某些部分未以可预测的方式运行。 我正在使用 VS2013 和 zmq 3.2.4。为了不在我的 pubsub 框架中“丢失”消息 [旁白:我认为这是一个设计缺陷。我应该能够首先启动我的订阅者
我正在编写一个使用嵌套 Bootstrap 列的页面。我正在使用推/拉让列在移动设备上切换位置,而且效果很好。但是,在桌面上我遇到了一些奇怪的间距问题。嵌套列偏移到父列的右侧。 我设置了一个 fidd
在拉取一些 docker 镜像(但不是全部)时出现此错误: failed to register layer: Error processing tar file(exit status 1): op
我创建了一个 Kubernetes 集群,并为每个节点安装了 docker。 当我尝试使用 docker push local_registry_addr:port/image_id 将图像拉取或推送
没有明确地推/拉单个书签,书签何时从 repo 复制/更新到 repo? 在我对两个本地存储库的测试中,我无法推断出一致的行为。有时从 A 到 B 或 B 到 A 的推/拉会复制/更新书签,有时不会。
在 Bootstrap 3 文档中,他们给出了以下使用 push 和 pull 类更改列顺序 (http://getbootstrap.com/css/#grid-column-ordering) 的
从这个问题开始Three column Bootstrap layout with left sidebar at bottom我了解了 Bootstrap 列推拉。 下面的代码片段几乎可以得到我想要
许多 Repo 函数的签名包括 **kwargs,其中文档说,您可以将参数传递给底层包装的 git 命令。但是,*args 没有位置。为了传递类似标志的参数,如 --all。我原以为它们会像 my_r
如果您将大文件推送/拉到设备上,这真的很烦人,现在无法知道它有多远。是否可以运行 adb push 或 adb pull 并使用“bar”实用程序获取进度条? 这里的主要问题是我认为 adb 需要两个
当我尝试使用 Gitkrakent 向/从 Heroku 推/拉时,GitKraken 告诉我: "Please log in to continue" 请求的“用户/登录”是什么? (我个人 Her
我在 docker 容器中有一个 Jenkins 2.150.1。要安装这个 Jenkins,我只需使用 jenkinsci/blueocean:1.9.0图片。 我创建了一个管道,然后尝试使用我的
我想使用 Jenkins 做下一步: 1- docker pull 2- docker run -i -t 我已经在jenkins上安装了docker插件,但是这可行吗? docker plugi
如果我正在处理一些我不想提交的文件,我只需保存它们。然后我有其他文件想要推送到服务器,但是如果其他人对存储库进行了更改,并且我将它们拉下来,它会要求我 merge 或 rebase ..但是这些选项中
无论出于何种原因,我在 FB 上共享链接时尝试使用的图像都无法加载。给出的确切错误是: 提供了og:image,无法下载。发生这种情况的原因有多种,例如您的服务器使用不受支持的内容编码。爬虫接受 de
今天我买了三星 Galaxy Note 3,它配备了 Android 4.3。由于它太新了,我找不到根植我设备的方法,所以我尝试使用 adb 连接……我失败了。 所以,我用了这个 D:\android
我尝试通过 airflow cli test 命令测试 2 个任务` 第一个任务运行,自动将最后一个控制台推送到 xcom,我按预期在 Airflow GUI 中看到了值 some value 当我通
我是一名优秀的程序员,十分优秀!