unit frmail;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdMessage, IdBaseComponent, IdComponent, IdTCPConnection, ComCtrls,
  IdTCPClient, IdMessageClient, IdSMTP, Menus, StdCtrls, Buttons, ExtCtrls,
  shellapi, inifiles;type
  TFrmSendMail = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    OpenFiles: TSpeedButton;
    MailTitle: TEdit;
    MailContent: TMemo;
    ListFile: TListBox;
    StaticText1: TStaticText;
    ListMail: TListBox;
    Panel2: TPanel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    vSmtp: TEdit;
    vPort: TEdit;
    vServer: TCheckBox;
    vUser: TEdit;
    vPass: TEdit;
    vEmail: TEdit;
    InputMail: TSpeedButton;
    OutMail: TSpeedButton;
    SendMail: TSpeedButton;
    BreakSend: TSpeedButton;
    SaveSetup: TSpeedButton;
    ExitSystem: TSpeedButton;
    StaticText2: TStaticText;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    OpenMail: TOpenDialog;
    SaveMail: TSaveDialog;
    OpenFile: TOpenDialog;
    IdSMTP1: TIdSMTP;
    IdMessage1: TIdMessage;
    StatusBar1: TStatusBar;
    procedure ListFileKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure InputMailClick(Sender: TObject);
    procedure OutMailClick(Sender: TObject);
    procedure OpenFilesClick(Sender: TObject);
    procedure vServerClick(Sender: TObject);
    procedure SendMailClick(Sender: TObject);
    procedure BreakSendClick(Sender: TObject);
    procedure SaveSetupClick(Sender: TObject);
    procedure ExitSystemClick(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    function SendEmail(aAddr: string): boolean;
    { Private declarations }
  public
    { Public declarations }
  end;var
  FrmSendMail: TFrmSendMail;implementation{$R *.dfm}procedure TFrmSendMail.ListFileKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=VK_DELETE then
     listfile.DeleteSelected;//按下键盘Delete键时删除所选的附件
end;procedure TFrmSendMail.InputMailClick(Sender: TObject);
begin
  if not OpenMail.Execute then Exit;//如果没有选择文件则退出
  ListMail.Items.LoadFromFile(OpenMail.FileName);//导入储存邮件地址的文本文件
end;procedure TFrmSendMail.OutMailClick(Sender: TObject);
begin
  if ListMail.Items.Count = 0 then exit;
  if SaveMail.Execute then
  ListMail.Items.SaveToFile(SaveMail.FileName+'.txt');//将邮件地址保存到文本文件
end;procedure TFrmSendMail.OpenFilesClick(Sender: TObject);
begin
  if openfile.Execute then
     listfile.items.Add(openfile.filename);
end;procedure TFrmSendMail.vServerClick(Sender: TObject);
begin
  if vServer.Checked=true then
  begin
    vUser.Enabled:=true;
    vPass.Enabled:=true;
    label6.Enabled:=true;
    label7.Enabled:=true;
  end
  else
  begin
    vUser.text:='';
    vPass.text:='';
    vUser.Enabled:=false;
    vPass.Enabled:=false;
    label6.Enabled:=false;
    label7.Enabled:=false;
  end;
end;procedure TFrmSendMail.SendMailClick(Sender: TObject);
var
  i: integer;
begin
  if ListMail.Items.Count = 0 then
  begin
    showmessage('请添加收件地址!');
    exit;//邮件地址不能为空
  end;
  if MailTitle.Text = '' then
  begin
    showmessage('请输入邮件主题!');
    exit;//要求用户必须输入邮件主题
  end;  sendmail.Enabled:=False;
  if vServer.Checked then //系统进行验证服务器
  begin
    IdSMTP1.AuthenticationType:=atLogin;
    IdSMTP1.Username:=vUser.Text;
    IdSMTP1.Password:=vPass.Text;
  end else
  begin
    IdSMTP1.AuthenticationType:=atNone;
  end;
  IdSMTP1.Host:=vSmtp.Text;
  IdSMTP1.Port:=StrToIntDef(vPort.Text, 25); //发送邮件的默认端口为25  IdSMTP1.Connect; //连接
  try
    Tag:=1; //设置中断标志
    for i:=0 to Listmail.Items.Count-1 do
    begin //循环发送邮件
      if Tag = 0 then exit; //如果中断则退出发送邮件
      SendEmail(ListMail.Items.Strings[i]);
      IdSMTP1.Send(IdMessage1);
      ListMail.ItemIndex := i;
      StatusBar1.SimpleText := Format('正在发送邮件... (%d/%d) %s', [i, ListMail.Items.Count - 1, ListMail.Items.Strings[i]]);
      Application.ProcessMessages;
    end;
  finally
    Tag := 0;
    IdSMTP1.Disconnect;
    sendmail.Enabled:=True;
  end;
  StatusBar1.SimpleText:='邮件发送完成...';
end;procedure TFrmSendMail.BreakSendClick(Sender: TObject);
begin
  Tag := 0; //用FrmSendMail的Tag属性作为发送中断的标志
end;
function TfrmSendmail.SendEmail(aAddr: string): boolean;
var
  j:integer;
begin
  IdMessage1.Body.Assign(MailContent.Lines);
  IdMessage1.From.Text := vEmail.Text;
  IdMessage1.ReplyTo.EMailAddresses := vEmail.Text;
  IdMessage1.Recipients.EMailAddresses := aAddr;
  IdMessage1.Subject := MailTitle.Text;
  for j:=0 to listfile.Items.Count-1 do
  begin
    listfile.ItemIndex:=j;
    if FileExists(listfile.Items.strings[j]) then
       TIdAttachment.Create(IdMessage1.MessageParts,listfile.Items.strings[j]);
  end;
  //listfile.Clear;
end;procedure TFrmSendMail.SaveSetupClick(Sender: TObject);
begin
  //写入配置文件sendmail.ini
  with TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config.ini') do
  begin
    WriteString('setup', 'smtp', vSmtp.Text);
    WriteString('setup', 'port', vPort.Text);
    WriteBool('setup', 'check', vServer.Checked);
    WriteString('setup', 'user', vUser.Text);
    WriteString('setup', 'pass', vPass.Text);
    WriteString('setup', 'email', vEmail.Text);
  end;
end;procedure TFrmSendMail.ExitSystemClick(Sender: TObject);
begin
  close;
end;procedure TFrmSendMail.N1Click(Sender: TObject);
begin
  if not OpenMail.Execute then Exit;
  //如果没有选择文件则退出
  ListMail.Items.LoadFromFile(OpenMail.FileName);
end;procedure TFrmSendMail.N2Click(Sender: TObject);
begin
  if ListMail.Items.Count = 0 then exit;
  if SaveMail.Execute then
  //选择了保存文件
  ListMail.Items.SaveToFile(SaveMail.FileName+'.txt');
end;procedure TFrmSendMail.N4Click(Sender: TObject);
var
  s: string;
begin
  s := InputBox('系统对话框', '请输入邮件地址:', '@');
  if (Length(s) > 5) and (Pos('@', s) < Pos('.', s)) then
    ListMail.Items.Add(s);
end;procedure TFrmSendMail.N6Click(Sender: TObject);
begin
  ListMail.DeleteSelected;
end;procedure TFrmSendMail.N7Click(Sender: TObject);
begin
  ListMail.Clear;
end;procedure TFrmSendMail.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  action:=cafree;
end;procedure TFrmSendMail.FormCreate(Sender: TObject);
begin
  //读取配置文件sendmail.ini
  with TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config.ini') do
  begin
    vSmtp.Text := ReadString('setup', 'smtp', '');
    vPort.Text := ReadString('setup', 'port', '25');
    vServer.Checked := ReadBool('setup', 'check', False);
    vUser.Text := ReadString('setup', 'user', '');
    vPass.Text := ReadString('setup', 'pass', '');
    vEmail.Text := ReadString('setup', 'email', '');
  end;
end;end.
[Warning] frmail.pas(201): Return value of function 'TFrmSendMail.SendEmail' might be undefined
[Fatal Error] frmail.pas(278): Could not create output file 'E:\SendMail\frmail.dcu'

解决方案 »

  1.   

    [Fatal Error] Could not create output file 'E:\SendMail\frmail.dcu'
    是不是 路径不对?SendEmail 函数 没看到代码部分……
    帖出 frmail.pas 部分
      

  2.   

    警告:是因为你的SendEmail函数定义了返回值是boolean,而函数体中没有返回值。Could not create output file 'E:\SendMail\frmail.dcu' 
    你的路径不存在,或者有了frmail.dcu文件,有保护,不能覆盖。