Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Посылка E-mail


Автор: Ярик 19.5.2006, 20:51
ПОМОГИТЕ ПОЖАЛУЙСТА! Надо быстро послать Email, только не через какие-то почтовые проги, и не надо громоздких алгоритмов! Надо послать одну строчку!  smile  

Автор: Poseidon 20.5.2006, 11:47
Посылка одной строчки не отличается от посылки поэмы!

http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=main_panel&section=1046 

Автор: drkot 20.5.2006, 12:29
sendmail(message); 

Автор: Ярик 21.5.2006, 14:30
А если нужно отослать пару слов текста и адрес получателя всего лищь...

если есть возможность использовать "sendmail(message);", то можно пример!!! smile  

Автор: Albinos_x 21.5.2006, 15:54
пользуемся поиском:
http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=1505f5c1070e32a44e7368a68304ba6d&search_in=posts&result_type=topics&flag=search&debug=&highlite=email&skipped= 

Автор: ConstantinXXX 27.5.2006, 12:49
Интересная тема. У меня проблемма с SMTP. Не могу найти нормальный. smile  

Автор: drkot 29.5.2006, 16:53
Цитата(ConstantinXXX @  27.5.2006,  12:49 Найти цитируемый пост)
Не могу найти нормальный.

это как? все глючные или что другое? 

Автор: Aleksiem 30.5.2006, 23:56
Если нужно послать одну строчку, то использовать целый компонент это по-моему слишком, проще отправить через сокеты по протоколу SMTP. Вообщем RFC-821(по-моему) форева. Хотя если размер не критичен... 

Автор: RazIv 31.5.2006, 06:50
Код

IdMessage1.Subject:='Тема';
IdMessage1.ReceipRecepient.Addres:='куда';
IdMessage1.ReceipRecepient.Name:='кому';
IdMessage1.From.Name:='от кого';
IdMessage1.From.Addres:='от куда';
IdMessage1.Body:='тело пистма';
IdSMTP1.Conect();
IdSMTP1.Autentificate;
IdSMTP1.SendMsg(IdMessage1);
IdSMTP1.Disconect;
 

Автор: LadyOfWood 31.5.2006, 21:22
Небольшой код, отсылает в потоке, использует Indy.
Код

unit EMailThread;

interface

uses
  {VCL} Windows, Messages, SysUtils, Classes,
  {Indy} IdMessage, IdEMailAddress, IdAttachment, IdAttachmentMemory, IdText, 
  IdCoderHeader, IdCharsets, IdSMTP, IdSMTPRelay;

const
  WM_EMAILSENDSUCCESS = WM_USER + $1000;
  WM_EMAILSENDERROR = WM_USER + $1001;
  WM_EMAILTHREADDESTROY = WM_USER + $1002;

type
  TEMailThread = class(TThread)
  private
    FMessage: TIdMessage;
    FError: string;
    FMailAgent: string;
    FServers: TStringList;
    FHandle: HWnd;
  protected
    function SendMail: Boolean;
    procedure IdMessageInitializeISO(var VTransferHeader: TTransfer;
      var VHeaderEncoding: Char; var VCharSet: String);
  public
    constructor Create(AHandle: Hwnd; AFromMail, AFromName, AFromOrganization: string;
    ASubject: string; ACharset: TIdCharSet; ABody: TStrings; ARecipMail,
    ARecipName: string; ACCMail, ACCName: TStrings; AIsAttach: boolean;
    AAttachFile: string; AAttachStream: TMemoryStream);
    destructor Destroy; override;
    procedure Execute; override;
  end;

implementation

uses
  {ATD Base API} TestVersion;

function GetDNSList: TStringList;
type
  PIP_Addr = ^TIP_Addr;
  TIP_Addr = packed record
    Next: PIP_Addr;
    IpAddress: array[0..15] of char;
    Unused: array[0..19] of byte; // Unused bytes.
  end;

  PDNSInfo = ^TDNSInfo;
  TDNSInfo = packed record
    Unused0: array[0..267] of byte; // Unused bytes.
    DNSList: TIP_Addr;
    Unused1: array[0..275] of byte; // Unused bytes.
  end;
var
  IpHlpModule: THandle;
  DNSInfo: PDNSInfo;
  Size: DWord;
  PDNS: PIP_Addr;
  err: Integer;
  GetNetworkParams: function(Info: PDNSInfo; pLen: PDWord): DWord; stdcall;

  function IsValidDNS(const IP: string): Boolean;
  begin
    Result := (Trim(IP) <> '0.0.0.0') and (Trim(IP) <> '');
  end;

  procedure AddDNS(const IP: string);
  begin
    if (IsValidDNS(IP)) then Result.Add(IP);
  end;

begin
  Result := TStringList.Create;
  Size := 0;
  IpHlpModule := LoadLibrary('IPHLPAPI.DLL');
  if (IpHlpModule <> 0) then
  try
    GetNetworkParams := GetProcAddress(IpHlpModule, 'GetNetworkParams');
    if (@GetNetworkParams <> nil) then
    begin
      err := GetNetworkParams(nil, @Size);
      if (err = ERROR_BUFFER_OVERFLOW) then
      begin
        GetMem(DNSInfo, Size);
        try
          err := GetNetworkParams(DNSInfo, @Size);
          if (err = ERROR_SUCCESS) then
            with DNSInfo^ do
            begin
              AddDNS(DNSList.IpAddress);
              PDNS := DNSList.Next;
              while PDNS <> nil do
              begin
                AddDNS(PDNS^.IPAddress);
                PDNS := PDNS.Next;
              end;
            end;
        finally
          FreeMem(DNSInfo);
        end;
      end;
    end;
  finally
    FreeLibrary(IpHlpModule);
  end;
  if Result.Count = 0 then AddDNS('193.121.171.135'); // An alternative DNS server.
end;

{ TEMailThread }

constructor TEMailThread.Create(AHandle: HWnd; AFromMail, AFromName,
  AFromOrganization: string; ASubject: string; ACharset: TIdCharSet; ABody: TStrings;
  ARecipMail, ARecipName: string; ACCMail, ACCName: TStrings; AIsAttach: boolean;
  AAttachFile: string; AAttachStream: TMemoryStream);
var
  I: integer;
  FMail: TIdEMailAddressItem;
  FAttach: TIdAttachmentMemory;
  FText: TIdText;
begin
  inherited Create(false);
  FreeOnTerminate := true;
  FHandle := AHandle;
  FError := '';
  FMailAgent := sATS + ' (version ' + GetATSVerShort + ')';

  FMessage := TIdMessage.Create(nil);
  FMessage.OnInitializeISO := IdMessageInitializeISO;
  FMessage.Encoding := meMIME;
  FMessage.CharSet := IdCharsetNames[ACharset];
  FMessage.ContentTransferEncoding := 'base64';
  FMessage.From.Address := AFromMail;
  FMessage.From.Name := AFromName;
  FMessage.Sender.Address := AFromMail;
  FMessage.Sender.Name := AFromName;
  with FMessage.ReplyTo.Add do
  begin
    Address := AFromMail;
    Name := AFromName;
  end;
  FMessage.Organization := AFromOrganization;
  FMessage.Subject := ASubject;
  FMessage.Priority := mpNormal;

  with FMessage.Recipients.Add do
  begin
    Address := ARecipMail;
    Name := ARecipName;
  end;

  if Assigned(ACCMail) and Assigned(ACCName) and (ACCMail.Count = ACCName.Count) then
    for I := 0 to ACCMail.Count - 1 do
    with FMessage.CCList.Add do
    begin
      Address := ACCMail.Strings[I];
      Name := ACCName.Strings[I];
    end;

  if AIsAttach then
  begin
    FText := TIdText.Create(FMessage.MessageParts, ABody);
    FText.CharSet := IdCharsetNames[ACharset];
    FText.ContentTransfer := 'base64';

    AAttachStream.Position := 0;
    FAttach := TIdAttachmentMemory.Create(FMessage.MessageParts, AAttachStream);
    FAttach.FileName := AAttachFile;
  end
  else
    FMessage.Body.AddStrings(ABody);
end;

procedure TEMailThread.IdMessageInitializeISO(var VTransferHeader: TTransfer;
  var VHeaderEncoding: Char; var VCharSet: String);
begin
  VCharset := FMessage.CharSet;
end;

destructor TEMailThread.Destroy;
begin
  PostMessage(FHandle, WM_EMAILTHREADDESTROY, 0, 0);
  FMessage.Free;
  inherited Destroy;
end;

procedure TEMailThread.Execute;
var
  I: integer;
begin
  FServers := GetDNSList;
  try
    if SendMail then
      PostMessage(FHandle, WM_EMAILSENDSUCCESS, 0, 0)
    else
      SendMessage(FHandle, WM_EMAILSENDERROR, integer(PChar(FError)), 0);
  finally
    FServers.Free;
  end;
end;

function TEMailThread.SendMail: Boolean;
var
  Sender: TIdSMTPRelay;
  I, J: integer;
begin
  Result := false;
  Sender := TIdSMTPRelay.Create;
  try
    with Sender do
    begin
      for I := 0 to FServers.Count - 1 do
      begin
        DNSServer := FServers.Strings[I];
        MailAgent := FMailAgent;
        try
          Connect;
          Send(FMessage);
          Disconnect;
          FError := '';
          Result := true;
          for J := 0 to Sender.StatusList.Count - 1 do
          begin
            Result := Result and Sender.StatusList.Items[J].Sent;
            if not Result then
            begin
              FError := Sender.StatusList.Items[J].ExceptionMessage;
              Break;
            end;
          end;
          if Result then Exit;
        except
          on E : Exception do
          begin
            if Connected then
              try
                Disconnect;
              except
              end;
            Result := false;
            FError := E.Message;
          end;
        end;
      end;
    end;
  finally
    Sender.Free;
  end;
end;

end.

 

Автор: ConstantinXXX 1.6.2006, 03:14
drkot, На все долбанная аунтификация. smile  

Автор: drkot 1.6.2006, 09:54
Протокол SMTP предельно прост почитай rfc.
За это время можно было самому написать  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)