掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ファイル化したメールを表示するには? (ID:1897)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
上の件は{$R *.DFM}の下に書いて解決しました。 でも今度は以下の事を実行しようと記述をしたらエラーが発生しました。 >UidlSplitは、メールを取得するときにも使います。 >保存していなくて、かつ、サーバに存在するメッセージのUIDLと、現在読み込もう>としているメッセージのUIDLを比較するためです。 >ループに >for Count := 1 to No do >としていますが、これを、 >for Count := 1 to nowUidl.Count - 1 doに変更し、 >その中で、UidlSplit(nowUidl[Count], no, uidl);と、noとuidlに分解。 >そのループ内で、countを渡していたところに、StrToInt(no)を渡します。 これを実装したコードは以下の通りです。 // POP3からのメール受信 procedure TMainForm.AddMailList(S: TSocket); var No, Count: integer; // メールの件数用変数 Subject: array [0..HEADER_MAX] of Char; // 件名を配列で定義 Date: array [0..HEADER_MAX] of Char; // 時刻を配列で定義 From: array [0..HEADER_MAX] of Char; // 差出人を配列で定義 Header: PChar; // ヘッダ用変数 I: TListItem; // リスト用変数 DataName: String; // NMLファイルのファイル名 Seq: Integer; // シーケンス番号 Body: PChar; // Bodyのデータ用 BodySize: Integer; // Bodyのファイルサイズ Fs: TFileStream; // ファイルストリーム strDate: String; // 日付の取得 strUIDL: array [0..HEADER_MAX] of Char; // UIDLのリスト UIDLFs: TFileStream; // ファイルストリーム strMUIDL: array [0..HEADER_MAX] of Char; // メモリ用のリスト格納 UIDLMs: TMemoryStream; // メモリストリーム SavedUIDL: TStringList; // 保存したUIDLの格納 NowUIDL: TStringList; // メモリ側の新しいUIDLの格納 sUIDL: String; // 分解したUIDLの格納 begin // メール本文表示をクリア BodyMemo.Lines.Clear; // ListView もクリア HeaderDataClear; MailListView.Items.Clear; // POP3 サーバに接続する S := NMailPop3Connect(PChar(Pop3Name)); // ソケットがエラーでない時はPOP3受信の準備 if S <> INVALID_SOCKET then begin // ユーザ名またはパスワードが空白の時は入力ダイアログを表示 if (Id = '') or (Password = '') then begin // ユーザ名とパスワード入力 if InputForm.ShowModal = mrOk then // 入力ダイアログのOKボタンが押された時 begin // IDとPasswordにユーザ名とパスワードを設定する Id := InputForm.IdEdit.Text; Password := InputForm.PasswordEdit.Text; end; end; // メールの数を得る(APOP対応なの〜) No := NMailPop3Authenticate(S, PChar(Id), PChar(Password), ApopFlag); // 保存したUIDLをTStringListに格納する SavedUIDL := TStringList.Create; NowUIDL := TStringList.Create; try // 保存したUIDL.lstをSavedUIDLに格納 SavedUIDL.LoadFromFile('uidl.lst'); except ; // 何もしない? end; // 新しいUIDLのテキストにstrUIDLの内容を代入する NowUidl.Text := StrPas(strUIDL); // 新しいUIDLと比較して古いUIDLの情報を削除する UidlDelete(nowUidl, savedUidl); // メールの件数が0件以上の場合 if No >= 0 then begin for Count := 1 to NowUidl.Count - 1 do // Countが1からnowUidl.Count - 1までループ begin // UIDLのリストを切り分ける UidlSplit(NowUidl[Count], No, sUIDL); // 順番にヘッダの内容を読み、ListView に追加 GetMem(Header, HEADER_MAX); NMailPop3GetMailStatus(S, StrToInt(No), Subject, Date, From, Header, False); // strDateにDateの内容を渡す(NMLファイルの名前に使用する) strDate := StrPas(Date); // DataNameにNMLYYYYMMDDHHMMSSを格納する(例NML20021101091022) DataName := 'NML' + Copy(strDate, 1, 4) // yyyy + Copy(strDate, 6, 2) // mm + Copy(strDate, 9, 2) // dd + Copy(strDate, 12, 2) // hh + Copy(strDate, 15, 2) // mm + Copy(strDate, 18, 2); // ss // Seqに0を代入する Seq := 0; // 受信フォルダに同名のファイル(例NML20021101091022_0.nml)が // 存在する場合はSeq番号を1インクリメントする(例NML20021101091022_1.nml) while FileExists(RcvFolder + 'RcvMail\' + DataName + '_' + IntToStr(Seq) + '.nml') do Inc(Seq); try // 本文の大きさを取得してBodySizeに格納する BodySize := NMailPop3GetMailSize(S, StrToInt(No)); GetMem(Body, BodySize); // BodySize分のメモリを確保する // POP3からメールを受信する NMailPop3GetMail(S, StrToInt(No), Subject, Date, From, Header, Body, nil, nil); // DataName + _ + seq + .nmlファイルを作成する(例NML20021101091022_0.nml) Fs := TFileStream.Create(RcvFolder + 'RcvMail\' + DataName + '_' + IntToStr(Seq) + '.nml', fmCreate); Fs.WriteBuffer(Header^, StrLen(Header)); // ヘッダをファイルに書き出す Fs.WriteBuffer(#13#10, StrLen(#13#10)); // \r\nをファイルに書き出す Fs.WriteBuffer(Body^, StrLen(Body)); // 本文をファイルに書き出す finally I := MailListView.Items.Add; // リストビューに表示する準備 I.Caption := StrPas(Subject); // 件名をリストに表示 I.SubItems.Add(StrPas(Date)); // 時刻をリストに追加 I.SubItems.Add(StrPas(From)); // 差出人をリストに追加 // メールをサーバに残すチェックボタンがチェックされていない時は // Noのメールをサーバから削除する if DeleteFlag = False then NMailPop3DeleteMail(S, No); // FsがNULLの時はFsを解放する if Fs <> nil then Fs.Free; // BodyがNULLの時はBodyのメモリを解放する if Body <> nil then FreeMem(Body); end; end; // Countのループの終わり // 終了時に新しいUIDLを保存する(一時的に処理をコメント行化) {UIDLFs := nil; try NMailPop3GetUidl(S, NMAIL_GET_UIDL_ALL, strUIDL, Length(strUIDL)); UIDLFs := TFileStream.Create('uidl.lst', fmCreate); UIDLFs.WriteBuffer(strUIDL[0], StrLen(strUIDL)); finally if UIDLFs <> nil then UIDLFs.Free; end;} end else // 接続できなかった場合 begin // サーバーからのエラーメッセージを取得 NMailGetMessage(NMAIL_GET_ERROR_MESSAGE, Subject, HEADER_MAX); MessageDlg('POPサーバに接続できませんでした。' + #13#10 + StrPas(Subject), mtError, [mbOK], 0); end; // POP3サーバから切断する NMailPop3Close(S); // SocketをINVALID_SOCKETにする S := INVALID_SOCKET; end; end; そしてエラー内容は以下の通りです。 [エラー] testmain.pas(406): 変数実パラメータと変数仮パラメータとは同一の型でなければなりません [エラー] testmain.pas(410): 'String' と 'Integer' には互換性がありません [エラー] testmain.pas(432): 'String' と 'Integer' には互換性がありません [エラー] testmain.pas(436): 'String' と 'Integer' には互換性がありません [致命的エラー] nmail.dpr(11): 'testmain.pas' ユニットはコンパイルできませんでした
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.