用SakeMail编写收邮件程序时,我如何把每一封邮件保存成一个eml文件?(100分)

  • 主题发起人 主题发起人 vivee
  • 开始时间 开始时间
它没这功能,去年我就研究过了。
 
那我该如何实现这个功能呢?!谢谢了!!!
 
其实我研究了一下电子邮件的格式,其实在SakeMail控件中实现这个功能并不是很难!

因为我没有改写组件的经验,谁可以帮我改写一下!!

怎么在控件中添加过程?谁能帮我!!
 
我可以借用一个mail2000的控件才保存成eml文件的,给你看一段把邮件通过mail2000保存成eml的例子
//Óʼþ±¸·Ý

procedure TServiceForm.BackupMail;
var
MailSeq: Integer;
MailMessage: TMailMessage2000;
OaId: string;
AttachedFileName: string;
TmpLst: TStrings;
Directory: string;
Contenttype: string;
Loop: Integer;
begin
//±¸·ÝÓʼþ
Memo.Lines.Add(StringOfChar('*', 80));
Memo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:mm:ss', Now) + ' ¿ªÊ¼¼ì²éÓʼþ±¸·Ý...');
Memo.Lines.Add(StringOfChar('*', 80));
ADOQueryBackupTask.Active := True;
//È¡±¸·ÝÈÎÎñ
while not ADOQueryBackupTask.Eof do
begin
OaId := ADOQueryBackupTask.FieldByName('oaid').AsString;
Directory := ADOQueryBackupTask.FieldByName('backupdirectory').AsString;
//Èç¹ûĿ¼²»´æÔÚ£¬Ôò½¨Á¢±¸·ÝĿ¼
if Directory[Length(Directory)] <> '/' then
Directory := Directory + '/';
if not DirectoryExists(Copy(Directory, 1, Length(Directory) - 1)) then
ForceDirectories(Copy(Directory, 1, Length(Directory) - 1));

ADOQueryBackupLst.Active := False;
ADOQueryBackupLst.Parameters.ParamByName('foaid').Value := OaId;
ADOQueryBackupLst.Active := True;

Memo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:mm:ss', Now) + ' ¿ªÊ¼¼ì²é ' + OaId + ' µÄÓʼþ±¸·Ý...');
while not ADOQueryBackupLst.Eof do
begin
//È¡¸ÃoaÓû§Òª±¸·ÝµÄÓʼþmailseq
MailSeq := AdoQueryBackupLst.FieldByName('mailseq').AsInteger;

ADOQueryBackupMailbox.Active := False;
ADOQueryBackupMailbox.Parameters.ParamByName('mailseq').Value := MailSeq;
ADOQueryBackupMailbox.Active := True;
TmpLst := TStringList.Create;
//È¡ÓʼþÁбí
while not ADOQueryBackupMailbox.Eof do
begin
MailMessage := TMailMessage2000.Create(nil);
//Éú³ÉÓʼþÍ·
MailMessage.SetFrom(ADOQueryBackupMailbox.FieldByName('ffrom').AsString, '');
MailMessage.SetReplyTo(ADOQueryBackupMailbox.FieldByName('freplyto').AsString, '');
MailMessage.Subject := ADOQueryBackupMailbox.FieldByName('fsubject').AsString;
//û°ì·¨´¦Àíʱ¼ä¸ñʽ£¬Ö»ÄÜÓõ±Ç°Ê±¼äÀ´´úÌæ
MailMessage.Date := StrToDateTime(ADOQueryBackupMailbox.FieldByName('fdate').AsString);
MailMessage.AddTo(ADOQueryBackupMailbox.FieldByName('fsendto').AsString, '');
MailMessage.AddCc(ADOQueryBackupMailbox.FieldByName('fcc').AsString, '');
MailMessage.AddBcc(ADOQueryBackupMailbox.FieldByName('fbcc').AsString, '');
//×Ö·û¼¯Ç¿ÖÆʹÓÃÖÐÎÄ
MailMessage.Charset := 'GB2312';
//ʹÓÃÓʼþ×Ô¼ºµÄ×Ö·û¼¯
//MailMessage.Charset:=AdoQueryMailBox.FieldByName('fcharset').AsString;

//Éú³ÉÓʼþÌå

Contenttype := ADOQueryBackupMailbox.FieldByName('fcontenttype').AsString;
TmpLst.Text := ADOQueryBackupMailbox.FieldByName('ftext').Value;

if Pos('TEXT/HTML', Contenttype) = 0 then

//µ±×÷htmlÓʼþ
MailMessage.SetTextHTML(TmpLst)
else
//µ±×÷textÓʼþ
MailMessage.SetTextPlain(TmpLst);

//Èç¹ûÓи½¼þ
if ADOQueryBackupMailbox.FieldByName('fattachedfiles').AsString = '0' then
begin
//Éú³É¸½¼þ±í

ADOQueryBackupAttachedFiles.Active := False;
ADOQueryBackupAttachedFiles.Parameters.ParamByName('mailseq').Value := MailSeq;
ADOQueryBackupAttachedFiles.Active := True;


//Éú³ÉÓʼþ¸½¼þ²¿·Ö
while not ADOQueryBackupAttachedFiles.Eof do
begin
AttachedFileName := ADOQueryBackupAttachedFiles.FieldByName('attchedfilename').AsString;
//Èç¹û¸½¼þÊÇ´æÔÚµÄ,ÔòÉú³ÉMessage¸½¼þ
if FileExists(AttachedFileName) then
begin
//Ôö¼Ó¸½¼þ
MailMessage.AttachFile(AttachedFileName);
//½âÂë
for Loop := 0 to MailMessage.AttachList.Count - 1 do
if MailMessage.AttachList[Loop].Decoded.Size = 0 then
MailMessage.AttachList[Loop].Decode;
end;
ADOQueryBackupAttachedFiles.Next;
end;
ADOQueryBackupAttachedFiles.Active := False;
//Ôö¼Ó¸½¼þºóÖØÐÂÉú³Ébody
MailMessage.RebuildBody;
end;
MailMessage.SaveToFile(Directory + FormatDateTime('yyyymmddhhmmss', Now) + '.eml');
MailMessage.Free;
ADOQueryBackupMailbox.Next;
end;
ADOQueryBackupMailbox.Active := False;
TmpLst.Free;
Memo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:mm:ss', Now) + ' ½áÊø¼ì²é ' + OaId + ' µÄÓʼþ±¸·Ý...');
ADOQueryBackupLst.Next;
end;
ADOQueryBackupLst.Active := False;

//ɾ³ý±¸·ÝÓʼþÁбí
ADOQueryDelBackupLst.Active := False;
ADOQueryDelBackupLst.Parameters.ParamByName('oaid').Value := OaId;
ADOQueryDelBackupLst.ExecSQL;

//±êÖ¾¸Ã±¸·ÝÈÎÎñÊÇ·ñÒÑÍê³É
ADOQueryBackupTask.Edit;
ADOQueryBackupTask.FieldByName('Flag').Value := '0';
ADOQueryBackupTask.Post;

ADOQueryBackupTask.Next;
end;
ADOQueryBackupTask.Active := False;

//ɾ³ý±¸·ÝÈÎÎñÖÐÒѾ­½øÐйý±¸·ÝµÄÈÎÎñ
ADOQueryDelBackupTask.Active := False;
ADOQueryDelBackupTask.Parameters.ParamByName('flag').Value := '0';
ADOQueryDelBackupTask.ExecSQL;
Memo.Lines.Add(StringOfChar('*', 80));
Memo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:mm:ss', Now) + ' ½áÊø¼ì²éÓʼþ±¸·Ý... ');
Memo.Lines.Add(StringOfChar('*', 80));
end;

 
sorry啊,我copy过来竟然显示不了中文,惨啊
 
不知道为何显示不了中文,不过如果你要代码的话,我可以发给你:delphi6@163.com
 
这是记事本和浏览器兼容的问题,我也碰到过

我的邮箱是:zyz_nj@21cn.com

能否把你完整的project发给我,谢谢了!!!!

我现在在分析sakemail的源码,准备改写她来实现保存的问题。。。。。。。

应该可以的!!我改好后也给你看看:)
 
其实sakemail的代码中有一句保存的语句,但不知为何作者把它注释掉了
 
你把它添加上不行吗?!

我怎么没有发现?!

能告诉我在那个文件里面吗?!我来试一下!!

有QQ吗?这样交流更方便写:)my qq is:59225848
 
mail2000的確是可以滿足你的需求。直的好用﹐而且是開源的﹐你可以看看它的代碼
 
在那行注释的地方,好像作者写着不知道怎么原因会导致异常之类的话吧,我以前看源码的时候好像看过
 
好像是这一段代码,被作者注释掉了,不知道啥原因,我的sakemail是3.01的
{procedure TSakMsg.SaveToFile( fn: string);
--> commented out, as is not saving attachs and many things ...
begin
with TFileStream.Create( fn, fmCreate) do
try
WriteComponent (Self);
finally
Free;
end;
end;}
 
非常感谢你的源码!
我现在在用Mail2000来收邮件,可以保存!

但是我仍然相信可以稍微改动一下SakMail的代码来实现保存邮件!
我下午找3.01版本的SakMail研究一下被作者注释掉的代码!
 
honghs:

我再问一个问题:我怎么把得到的邮件中的html中的部分用webbrowser显示出来呀?!
 
后退
顶部