我正在创建一个程序来自动生成来自电子邮件附件的报告,除了一个区域外几乎完成.传入的电子邮件会自动过滤到文件夹中,以区分它们来自哪个客户端和服务器.我无法弄清楚如何从电子邮件项目中获取文件夹的路径.
我正在使用该NewMailEx事件调用下面的方法,this.AppNamespace并this.ReportFolder确认可以正确实例化.
void AppClass_NewMailEx(string EntryIDCollection)
{
Outlook.MailItem Item = (Outlook.MailItem)this.AppNamespace.GetItemFromID(EntryIDCollection, this.ReportFolder.StoreID);
string FolderName = ""; //How do I get this?
}
Run Code Online (Sandbox Code Playgroud)
MSDN就MailItem在这里.我错过了什么或接近这个错误的方式?
请耐心等待,我的MAPI知识很少,而且我的C++技能基本......
我有一个程序,使用MAPI从Exchange服务器读取所有可能的日历约会.除了一种奇怪的情况外,情况正常.
如果定期约会有大量异常,那么似乎我从MAPI获取的RecurrenceState属性已被截断为1200字节.我可以在OutlookSpy中看到实际上有1400个字节.(奇怪的巧合,两个数字都是100的倍数?)
通过为10个特定属性设置称为SizedSPropTagArray的东西来访问约会,其中一个属性是RecurrenceState,然后执行QueryRows操作.当我访问该属性的Value.bin.cb字段时,它通常是正确的,但是当它应该是1400时,这个特定属性显然包含1200.
希望有人有一个建议 - TIA.
编辑:
德米特里,你说"在你读取属性值之前,你检查类型是否仍然是PT_BINARY?还是变为PT_ERROR?"
我看不出我应该怎么做.我正在做一个QueryRows,一次最多可以达到100个约会.然后我遍历LPSRowSet来处理查询的结果,即最多100个SRow对象.因此,为了处理RecurrenceState,我使用了sRow.lpProps [columnIndex],它提供了一个SPropValue.现在,这里似乎没有任何东西表明返回属性的类型..ulPropTag字段正确包含RecurrenceState属性的id,而.Value.bin.cb提供了一个长度,通常是正确的,但是当数据很长时,它是一个较低的值.我应该测试什么来查看您所描述的错误是否已经发生?谢谢.
编辑2:
德米特里,我非常感谢你的帮助,我相信你的基本想法一定是正确的.但不幸的是,当发生错误情况时,我无法进行任何测试.
我现在能够在我们自己的Exchange服务器上重现这种情况,唯一的区别是对于我们的Exchange服务器,RecurrenceState数据的限制显然是510字节,而不是我们客户安装时看到的1200字节.
以下是在Visual Studio调试器下运行时程序中数据的一些复制和粘贴捕获.正常重复约会中的第一个,其异常数据不会被截断:
sRow.lpProps[recurrenceInfoIndex].ulPropTag = 0x818b0102
sRow.lpProps[recurrenceInfoIndex].Value = {i=0x01da l=0x000001da ul=0x000001da ...}
Run Code Online (Sandbox Code Playgroud)
下一个是有许多例外的约会,RecurrenceState数据被截断:
sRow.lpProps[recurrenceInfoIndex].ulPropTag = 0x818b0102
sRow.lpProps[recurrenceInfoIndex].Value = {i=0x01fe l=0x000001fe ul=0x000001fe ...}
Run Code Online (Sandbox Code Playgroud)
请注意.ulPropTag与OK约会相同,数据长度为0x1fe = 510,但我知道它实际上更多.
我想知道,是否可能有一些开关我应该设置表明我想要这种错误的反馈?
或者还有其他我误解的东西?
谢谢.
如何使用带有HTML正文的MAPI发送邮件?我需要在消息正文中创建表。我正在使用vb6和MAPI控件。有任何想法吗?
Function MailSend(sSendTo As String, sSubject As String, sText As String) As Boolean
On Error GoTo ErrHandler
With MAPISession1
If .SessionID = 0 Then
.DownLoadMail = False
.LogonUI = True
.SignOn
.NewSession = True
MAPIMessages1.SessionID = .SessionID
End If
End With
With MAPIMessages1
.Compose
.RecipAddress = sSendTo
.AddressResolveUI = True
.ResolveName
.MsgSubject = sSubject
.MsgNoteText = sText
.Send False
End With
MailSend = True
Exit Function
ErrHandler:
'MsgBox Err.Description
MailSend = False
End Function
Run Code Online (Sandbox Code Playgroud) 有没有办法判断Outlook 2007中的当前检查器窗口是读取窗口还是"撰写"窗口?
我知道我们可以捕获事件,并在其上设置标志,但我不想捕获新的/回复/转发事件.有没有办法从Inspector对象中告诉它?任何财产?任何MAPI属性?
将赞赏正确方向的指针.
问候,
我尝试了许多版本的 MAPISend,但每次都在一处出错。MAPILogon 返回错误代码 1。
dwRet := MapiLogon(Handle,
nil,
nil,
MAPI_DIALOG or MAPI_NEW_SESSION,
0, @MAPI_Session);
Run Code Online (Sandbox Code Playgroud)
我尝试使用“MAPISend 组件”,这段代码:
http://prog.hu/tudastar/60044-6/Delphi-Email+csatolt+file+thunderbird.html
和另外 2 个。
有趣的是,Acrobat Reader 可以使用具有附加到电子邮件功能的 MAPI,并且“发送”“邮件中”上下文菜单也可以工作。
我不明白为什么它不起作用,在我的机器(Win7)中它工作正常。
然后我失败的机器有WinXP操作系统,他们使用Thunderbird。
我可以做什么才能成功登录 MAPI?
谢谢:dd
我有一个问题,我们需要从Embarcadero Delphi 2010控制Outlook.
我们今天使用了一些第三方组件来打开邮件发送窗口,这工作了一些时间.但现在它似乎在较新的Outlook版本上失败了.
是否有任何组件专门用于控制Delphi的Outlook,或者是否有任何MAPI客户端可以作为更好的替代品.
我们需要做的基本上是:1.在Outlook中启动新消息(发送收件人作为参数)2.接收发送的消息,以便我们可以存储它3.将消息从outlook拖放到我们的应用程序.
如果最终用户不使用outlook,那么正常MAPI就足以作为替换.
我在哪里可以找到一个很好的组件来为我做这样的工作?
我正在使用Delphi XE3,以下是我的示例应用程序:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function Send(const FromAddr, ToAddr, Subject: String; const AttachFiles: array
of string; const MsgBody: String): boolean;
end;
var
Form1: TForm1;
implementation
uses Winapi.Mapi;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Send('', 'lmengyew@gmail.com', 'test', [], '');
end;
function TForm1.Send(const FromAddr, ToAddr, Subject: String; const
AttachFiles: array of string; const MsgBody: String): boolean;
var Msg: TMapiMessage;
lpSender, lpRecipient: …Run Code Online (Sandbox Code Playgroud) 我正在编写一个 python 代码,从 Outlook 中未读的电子邮件中下载特定的附件,并将这些电子邮件标记为已读。我已经完成了 90%,即我可以进行迭代以打开未读电子邮件并下载带有特定电子邮件的附件。但是,我有两个问题。
我正在下载同名附件,如果有两个同名附件,它只保存从上次迭代中提取的附件。我尝试在文件名末尾附加时间戳,但效果相同。任何帮助,将不胜感激。这不是强制性要求,因为邮件按规定的时间间隔发送,我可以编写单独的 python 代码来重命名它,但我想将所有内容打包在这封电子邮件中。
我想在下载附件后将电子邮件标记为已读。我不知道这个命令。我附上了代码供您参考。
PS这是我的第一个真正的python代码。这也是我在这里的第一篇文章。如果已经在其他地方问过这个,请道歉。
import win32com.client
import os
import time
date_time_stamp = time.strftime("%Y%m%d-%H%M%S")
#set custom working directory
os.chdir('C:\\Users\user_name\Desktop\')
print(os.getcwd())
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
main_inbox = outlook.GetDefaultFolder(6)
subfolder = main_inbox.Folders.Item("my_child_folder_under_inbox")
subfolderitems = subfolder.Items
message = subfolderitems.GetFirst()
attachment_name = 'my_attachment_name'
#Loop to pick messages that are unread
for message in subfolderitems:
if message.Unread == True:
print("New Mail Found... Downloading Attachment...")
#Loop to check if the attachment name is the same
for attachments in message.Attachments:
if attachments.Filename …Run Code Online (Sandbox Code Playgroud) 在传统的vb6程序中,我使用下面的代码使用完整版本的outlook(而不是outlook express)发送电子邮件.效果很好.
现在,用户希望'from:'地址对于不同的用途是不同的,以便在回复电子邮件时,响应将显示在Outlook中的用户收件箱中.目前,电子邮件来自主要的企业电子邮件地址.
我觉得这很容易解决; 我只需要在OutMail对象中设置.from属性,但是看起来OutMail对象中没有'.from'属性.(它可能被称为其他东西?)
所以在这一点上我想知道它现在是如何工作的,没有.from指定,我假设用户在outlook中设置了多个电子邮件帐户,它使用主要电子邮件用于业务,而不是单个用户.
如何使用此技术指定来自电子邮件地址?
Dim mOutlookApp As Object
Set mOutlookApp = GetObject("", "Outlook.application")
Dim olNs As Object
Set olNs = mOutlookApp.GetNamespace("MAPI")
olNs.Logon
Dim OutMail As Object
Set OutMail = mOutlookApp.CreateItem(0)
'Set the To and Subject lines. Send the message.
With OutMail
.To = txtTo
.CC = txtCC
.Subject = txtSubjext
.HTMLBody = txtBody & vbCrLf
Dim myAttachments As Object
Set myAttachments = .Attachments
vAttach = Split(mAttachments, ",")
For i = 0 To UBound(vAttach)
myAttachments.add vAttach(i)
Next i …Run Code Online (Sandbox Code Playgroud) 我收到lib\MAPI.lib:致命错误LNK1136:无效或损坏的文件.可以为此做些什么?
我尝试清理解决方案并尝试搜索此文件,但没有一个工作.可以为这个问题做些什么?
mapi ×10
outlook ×4
delphi ×3
c# ×2
vb6 ×2
add-in ×1
automation ×1
c++ ×1
delphi-xe3 ×1
email ×1
html ×1
outlook-2007 ×1
python ×1
send ×1
thunderbird ×1