我在outlook公共文件夹中有大约200 000封电子邮件。
导出到pst有点快,但我不知道psts是否可靠。完美解码它(附件)变得非常头疼。 python lib不保存附件。 Java lib不为所有电子邮件导入html正文。
所以,我想保存到postgresql db。
我正在使用Npgsql,但它很慢(我正在使用它的方式)。
我当前的缓慢方式:
sql = "insert into tablename (a,b,c) values (:aa, :bb, :cc)";
cmd = (sql, con) #I am skipping full commands as I am reading from mind, dont think I made mistake in my code.
NpgsqlParameter pa = new NpgsqlParameter(":aa", sometype)
#same for other 3
pa.value = somevalue
cmd.Parameters.Add(pa)
#add others also
如果我评论数据库保存部分,它真的很快(比如10秒内的1000封邮件),但是对于数据库部分它是大约10封邮件,持续2秒。
我认为原因是,我有10个列(htmlbody,body,headerstring等),我正在为这10个列创建新的NpgsqlParameter,为每个邮件设置值,这让我感觉很慢。
我无法像
一样"...values('"+htmlbody+"', '"+header_string+"'..
因为错误
syntax error at or near..so I started using npgsqlparameter.
另外,我只是在解析header_string失败的情况下保存在字段下面(对于某些电子邮件而言,特别是那些在headerstring开头有'microsoft ..version 2'的电子邮件失败了)。它们是否足以表示完整的电子邮件,以防万一,headertring无用?
sender_entry_id
foldername text,
subject text,
headerstring text,
num_of_attachments int,
body text,
body_html text,
bcc text,
tooo text,
frm text,
cc text,
conversation_id text,
conversation_index text,
conversation_topic text,
message_class text,
senton timestamp
另外,我收到此错误
System.Runtime.InteropServices.COMException (0x80040304): The operation failed.
at Microsoft.Office.Interop.Outlook.PropertyAccessorClass.GetProperty(String SchemaName)
将一些附件保存为byte []变量。这是代码:
const string PR_ATTACH_DATA_BIN =
"http://schemas.microsoft.com/mapi/proptag/0x37010102";
byte[] attachmentData =
(byte[])attachment.PropertyAccessor.GetProperty(
PR_ATTACH_DATA_BIN); #attachment is Outlook.Attachment
答案 0 :(得分:1)
PropertyAccessor类的GetProperty方法无法读取大的PT_BINARY值(> 64kB)。这就是你在代码中得到异常的原因。
您可以使用低级代码(扩展MAPI)以IStream打开附件数据:
IAttach::OpenProperty(PR_ATTACH_DATA_BIN, IID_IStream).
答案 1 :(得分:1)
您可以先将附件保存到临时文件(Attachment.SaveAsFile),然后读取其数据。
正如Eugene所提到的,您可以使用扩展MAPI将附件数据作为IStream访问,但是在C#中无法访问它,只能在C ++或Delphi中访问。
如果使用Redemption是一个选项,则可以使用RDOAttachment和Attachment对象公开的AsText和AsArray属性(由Safe * Item对象返回)。