все что связано с моей работой
Главная » Програмирование » SendMail. Часть 4

SendMail. Часть 4

Дописали программку, полный код в конце заметки.

ВНИМАНИЕ! код не тестировался и не проверялся!

ЭТО просто решение поставленной задачи в лоб. Чем оно плохо? Да тем, что код, достаточно востребованный, а повторно использовать его нельзя. Вернее возможно все, но сколько времени надо потратить на подгонку/переделку. Поэтому в следующий раз оформим это через класс.

program sendmail;
{$mode objfpc}{$H+}
uses
  Classes, SysUtils,
  getopts,  // проверка параметров ком. строки
  smtpsend, // отправка почты
  mimemess, // обработка писем с вложениями
  mimepart  // обработка вложений
  { you can add units after this };

var
   Server,UserName,Password,From,
   Subject,Body,BodyFileName:string;
   Reciepient,AttachedFileName:TStrings;
   Msg:TMimeMess;
   ErrCode:longint;
   ErrMsg:string;

//  получить параметры
function Init:boolean;
begin
  Result:=true;
  try
    From:='';
    Server:='smtp.yandex.ru';
    UserName:='';
    Password:='';
    Subject:='';
    Body:='';
    BodyFileName:='';
//    Port:=25;
    Reciepient:=TStringList.Create;
    AttachedFileName:=TStringList.Create;
    ErrCode:=0;
    ErrMsg:='';
  except
    on E:Exception do begin
      Result:=false;
      ErrCode:=errInit;
      ErrMsg:=E.Message;
    end;
  end;
end;

//  проверить доступность файлов, наличие обязательных параметров
function Validate:boolean;
var i:longint;
begin
  Result:=true;
  i:=0;
  while i0;
end;

//  составить письмо
function CreateMsg:boolean;
var sl:TStrings;
    Root:TMimePart;
    i:integer;
begin
  Result:=true;
  try
    Msg:=TMimeMess.Create;
    sl:=TStringList.Create;
    try
      Msg.Header.From:=From;
      Msg.Header.ToList.Assign(Reciepient);
      Msg.Header.Subject:=Subject;
      Root:=Msg.AddPartMultipart('mixed',nil);
      if (Length(BodyFileName)>0) and FileExists(BodyFileName) then
        sl.LoadFromFile(BodyFileName)
      else
        sl.Text:=Body;
      if sl.Count>0 then Msg.AddPartMess(sl,Root);
      for i:=0 to AttachedFileName.Count-1 do
        Msg.AddPartBinaryFromFile(AttachedFileName[i],Root);
    finally
      FreeAndNil(sl);
    end;
  except
    on E:Exception do begin
      Result:=false;
      ErrCode:=errCreateMsg;
      ErrMsg:=E.Message;
    end;
  end;
end;

// отправить письмо
function Send:boolean;
begin
  if Msg=nil then exit;
  Result:=true;
  try
    Msg.EncodeMessage;
    Result:=SendToRaw(From,Reciepient.CommaText,Server,Msg.Lines,UserName,Password);
  except
    on E:Exception do begin
      Result:=false;
      ErrCode:=errSend;
      ErrMsg:=E.Message;
    end;
  end;
end;

// очистить созданные объекты
function Done:boolean;
begin
  Result:=true;
  if Reciepient<>nil then FreeAndNil(Reciepient);
  if AttachedFileName<>nil then FreeAndNil(AttachedFileName);
  if Msg<>nil then FreeAndNil(Msg);
end;

// распечатать help параметров ком.строки
procedure Help;
begin
  writeln('usage sendmail ');
  writeln('Param:');
  writeln('-S str'#9'Server SMTP сервер');
  writeln('-U str'#9'Имя пользователя');
  writeln('-P str'#9'пароль');
  writeln('-p digit'#9'Порт');
  writeln('-r str'#9'Получатель (кому). может быть несколько');
  writeln('-s str'#9'Тема сообщения');
  writeln('-b str'#9'Тело письма, одной строкой');
  writeln('-f FileName'#9'Тело письма вставляемое из текстового файла');
  writeln('-a FileName'#9'Имя файла, который вкладываем в письмо');
end;

{$IFDEF WINDOWS}{$R sendmail.rc}{$ENDIF}
//  Тело программы
begin
  ErrCode:=0;
  if Init then
  try
    if Validate then
      if CreateMsg then
        Send;
  finally
    Done;
  end;
  if ErrCode<>0 then writeln('Error: ',ErrMsg);
  if (ErrCode>=errValidate) and (ErrCode

Комментариев нет

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.