線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1422
推到 Plurk!
推到 Facebook!

idpop3在保存附件进数据库出错

缺席
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-17 10:47:30 IP:218.80.xxx.xxx 未訂閱
代码如下: if TIdAttachment(IdMessage1.MessageParts.Items[i]).SaveToFile        ('C:\Temp.dat') then //运行这句后出错               AdoOAEAttach.Parameters.ParamByName('attach').LoadFromFile('C:\Temp.dat', ftBlob);    报错如图: 有时错有时对,不知道是怎么回事,请帮忙
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-17 11:21:20 IP:202.39.xxx.xxx 未訂閱
http://groups.google.com.tw/groups?hl=zh-TW&lr=&ie=UTF-8&selm=3f4b2f0b%40newsgroups.borland.com&rnum=2
  if (Msg.MessageParts.Count <> 0) OR
     (Pos('multipart/', Msg.ContentType) <> 0) then
  begin
    // try to fix the quoted-printable bug
    with Msg.MessageParts do
      if (Count = 1) and
         (Items[0] is TidText) and
         (Items[0].ContentType = '') then
        Items[0].ContentType := Msg.ContentType;        // this is a multipart mime message msg.body is invalid
    for j := 0 to Msg.MessageParts.Count - 1 do
    begin
      if (Msg.MessageParts.Items[j] is TIdAttachment) then
      begin
        // handle attachments            // take out some special characters
        fName :=
GenerateSaveFileName(TIdAttachment(Msg.MessageParts.Items[j]).Filename);
        att := attachmentPath   '\'   fName;
        att := GenerateUniqueFileName(att);
        try
          TIdAttachment(Msg.MessageParts.Items[j]).SaveToFile(att); 
          attList := attList   ExtractFileName(att)   Chr(13);
        except on e:Exception do
          WriteToLog('EMAIL: exception in domessages: ' e.Message '
while saving to ' att ' of msg nr. ' inttostr(i));
        end; {end try}          end else
        // handle body text
      if Msg.MessageParts.Items[j] is TIdText then
          if Pos('text/plain', Msg.MessageParts[j].ContentType) > 0 then
            // It's a text part...
            for k := 0 to
TIdText(Msg.MessageParts.Items[j]).Body.Count-1 do // save body text
              mensagem := mensagem  
TIdText(Msg.MessageParts.Items[j]).Body.Strings[k]  Chr(13) Chr(10)
          else if Pos('text/html', Msg.MessageParts[j].ContentType) > 0
then
              // It's a HTML part
              for k := 0 to
TIdText(Msg.MessageParts.Items[j]).Body.Count-1 do // save body text
                mensagemHTML := mensagemHTML  
TIdText(Msg.MessageParts.Items[j]).Body.Strings[k]  Chr(13) Chr(10);
    end; { end for }
  end else { end if }
  begin
    // this is a text/* message
    // idMessage.Body contains the entire body
    for j := 0 to Msg.Body.Count-1 do // save body text
      mensagem := mensagem   Msg.Body.Strings[j]   Chr(13) Chr(10);
  end;    
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-17 11:33:48 IP:218.80.xxx.xxx 未訂閱
请教大大: fName := GenerateSaveFileName(TIdAttachment(Msg.MessageParts.Items[j]).Filename); att := attachmentPath '\' fName; att := GenerateUniqueFileName(att); GenerateSaveFileName和attachmentPath 是怎么定义的
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-17 11:47:53 IP:202.39.xxx.xxx 未訂閱
我想重點不在 GenerateSaveFileName 因沒有看過您完整的碼, 所以猜測可能是您沒做 if (Msg.MessageParts.Items[j] is TIdAttachment) 這個檢查 所以有時出錯有時正確
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-17 11:54:36 IP:218.80.xxx.xxx 未訂閱
我的代码如下: IdMessage1.MessageParts.CountParts; if IdMessage1.MessageParts.AttachmentCount > 0 then begin for i := 0 to IdMessage1.MessageParts.Count - 1 do begin if (IdMessage1.MessageParts.Items[i] is TIdAttachment) then begin AdoOAEAttach.Parameters.ParamByName('attachname').Value := Base64Decode(TIdAttachment(IdMessage1.MessageParts.Items[i]).FileName); fName := Base64Decode(TIdAttachment(IdMessage1.MessageParts.Items[i]).Filename); if TIdAttachment(IdMessage1.MessageParts.Items[i]).SaveToFile(fName) then AdoOAEAttach.Parameters.ParamByName('attach').LoadFromFile(fName, ftBlob); AdoOAEAttach.ExecSQL; 请问少了什么?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-17 14:33:14 IP:202.39.xxx.xxx 未訂閱
檢查一下 fName := Base64Decode(TIdAttachment(IdMessage1.MessageParts.Items[i]).Filename); 這句 看出錯時, fName 的值是什麼?
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-17 15:19:59 IP:218.80.xxx.xxx 未訂閱
就是附件的名称(不带路径的) 有时能保存有时就会出错 出错时调用了下面函数: function TIdAttachment.SaveToFile(const FileName: TFileName): Boolean; begin Result := CopyFileTo(StoredPathname, FileName); if not Result then begin raise EIdException.Create(RSTIdMessageErrorSavingAttachment); end; end;
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-18 09:14:56 IP:202.39.xxx.xxx 未訂閱
http://groups.google.com.tw/groups?hl=zh-TW&lr=&ie=UTF-8&th=bf369363981694b9&rnum=1 由這篇回答來看, 檢查幾點: 1.要存檔時所得的 fName 值是不是合法的檔名 2.若是合法的檔名的話, 這個檔是不是已經存在了 3.可以用 GetLastError 來取得實際的錯誤訊息
begin
  IdMessage1.MessageParts.CountParts;
  if IdMessage1.MessageParts.AttachmentCount > 0 then
  begin
    for i := 0 to IdMessage1.MessageParts.Count - 1 do
    begin
      if (IdMessage1.MessageParts.Items[i] is TIdAttachment) then
      begin
        AdoOAEAttach.Parameters.ParamByName('attachname').Value := Base64Decode(TIdAttachment(IdMessage1.MessageParts.Items[i]).FileName);
        fName := Base64Decode(TIdAttachment(IdMessage1.MessageParts.Items[i]).Filename);
        if FileExists(fName) then
          DeleteFile(fName);
        try
          if TIdAttachment(IdMessage1.MessageParts.Items[i]).SaveToFile(fName) then
            AdoOAEAttach.Parameters.ParamByName('attach').LoadFromFile(fName, ftBlob);
           AdoOAEAttach.ExecSQL;
        except
          ShowMessage(SysErrorMessage(GetLastError));
        end;
// ...
end; 
系統時間:2024-06-24 3:20:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!