Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка почты без компонентов, Как????? 
:(
    Опции темы
Anarhist
Дата 12.10.2006, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 11.2.2006

Репутация: нет
Всего: нет



Хочу что API приложение отплавляло определенное сообщение на почту, ну и поняно что это нужно сделать без ведома пользователя, т. е. без вызова почтовой программы и каких либо заметных дейчтвий. Сколько не искал везде предлагаются способы с использование компонентов. А как без них??? Я не силен в сетевой практике, поэтому желательно как можно проще, и с исходниками smile !


Заранее спасибо!
PM MAIL   Вверх
Snowy
Дата 12.10.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Проще, но без компонентов и не через почтовик...
Ну это просто несовместимые вещи.
Да ещё и без ведома пользователя.
А, если ещё и за прокси, то никаких простых вариантов, кроме почтовика просто нет.
А, если ещё и файрвол, то никак не без ведома.
Самый простой и эффективный вариант - это через WinInet делать http запрос на заранее заготовленную в инете страницу, которая будет складывать куда-нить полученные данные. Но это не почта, если только на хосте не разрешён SMTP - тогда скрипт на странице уже и будет отправлять.
Можно конечно понадеяться, что у юзер не за прокси, что файрвола у него нет и открыт 25-й порт на бесплатные почтовики.
Вероятность такого процентов 20-25. Но на сокетах писать ты не умеешь, RFC не знаешь. Для таких случаев и сделаны компоненты.
PM MAIL   Вверх
Anarhist
Дата 12.10.2006, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 11.2.2006

Репутация: нет
Всего: нет



Конечно можно сделать и через компоненты, но тогда мне придется скрыть окно, все это будет грузить систему, хоть и очень малое время, программа должна просто считать IP, кинуть его на мыло и закрытся... Вот нашел код
Код

{
smtp - ip адрес smtp сервера
port - порт smtp сервера, по умолчанию 25
from - адрес отправителя
dest - адрес получателя
subject - тема письма
body - текст писма
Возвращает True если письмо было успешно отправленно...
}

function mail(smtp: string; port: integer; from, dest, subject,
  body: string): bool;
const
  cl = #13#10;
var
WSAData: TWSAData;
  Host: TSockAddrIn;
  Sock: TSocket;
  res: Integer;
  buff: array[1..255] of Char;

  { отправляем данные через сокет }
  procedure senddata(str: string);
  var
    i: integer;
  begin
    for i := 1 to Length(str) do
      if send(Sock, str[i], 1, 0) = SOCKET_ERROR then
        exit;
  end;

  { получаем ответ от команды }
  function recvdata(accept: string): bool;
  var
    buff: array[1..255] of Char;
  begin
    res := recv(Sock, buff, SizeOf(buff), 0);
    Result := (Res = SOCKET_ERROR) or (Copy(buff, 1, 3) = accept);
  end;

begin
  try
    result := false;
    { инициализация сокета }
    WSAStartUp(257, WSAData);
    Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if Sock = INVALID_SOCKET then
      Exit;

    { устанавливаем хост и порт сервера }
    res := inet_addr(PChar(smtp));
    if res <= 0 then
      exit;

    Host.sin_family := AF_INET;
    Host.sin_port := htons(port);
    Host.sin_addr.S_addr := res;

    { подключаемся к серверу }
    if connect(Sock, Host, SizeOf(Host)) > 0 then
      Exit;

    { приветствие сервера }
    if not recvdata('220') then
      Exit;

    { EHLO }
    senddata('EHLO' + cl);
    if not recvdata('250') then
      Exit;

    { MAIL FROM: }
    senddata('MAIL FROM:' + from + cl);
    if not recvdata('250') then
      Exit;

    { RCPT TO: }
    senddata('RCPT TO:' + dest + cl);
    if not recvdata('250') then
      Exit;

    { DATA }
    senddata('DATA' + cl);
    if not recvdata('354') then
      Exit;

    { отправляем текст сообщения }
    senddata('Subject:' + subject + cl + cl + body + cl + '.');
    if not recvdata('250') then
      Exit;

    { отключаемся от сервера }
    senddata('QUIT' + cl);

    result := true;
  finally
    { убиваем сокет }
    closesocket(sock);
    WSACleanup;
  end;
end;

{
mail('127.0.0.1',25,'[email protected]' ,'[email protected]', 'subj', 'body text');

p.s.: Тестировалась на e-mail сервере Alt-N Daemond Pro for Windows v6.5.1...
Функция делалась на основе статьи "Простой протокол передачи почты (SMTP)"
}

Какой компонент нужно использовать, а то у меня вылетает немеренное количество ошибок!
PM MAIL   Вверх
Snowy
Дата 12.10.2006, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



uses WinSock;

Добавлено @ 01:04 
Цитата(Anarhist @  12.10.2006,  00:59 Найти цитируемый пост)
но тогда мне придется скрыть окно
Использовать компоненты - не значит "бросать их на форму" smile
Форма для этого вообще не нужна.
PM MAIL   Вверх
Anarhist
Дата 12.10.2006, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 11.2.2006

Репутация: нет
Всего: нет



Ок, разобрался, а как узнать Ip smtp сервера? Того самого Mail.ru?

Это сообщение отредактировал(а) Anarhist - 12.10.2006, 01:29
PM MAIL   Вверх
Snowy
Дата 12.10.2006, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Банальный ответ - ручками прописать.
http://forum.vingrad.ru/index.php?showtopi...st&p=629060
Это стандартный модуль. Его не может не быть.

Добавлено @ 01:34 
Цитата(Anarhist @  12.10.2006,  01:16 Найти цитируемый пост)
Ок, разобрался, а как узнать Ip smtp сервера?
Для начала нужно узнать адрес этого сервера.
Узнать его IP - GetHostByName.
http://forum.vingrad.ru/index.php?showtopi...23&view=all

Цитата(Anarhist @  12.10.2006,  01:16 Найти цитируемый пост)
Того самого Mail.ru?
А это вряд ли.
mail.ru не захочет принимать от тебя почту. Там всё антиспамерской защитой облеплено.
PM MAIL   Вверх
dumb
Дата 12.10.2006, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



Цитата(Anarhist @  12.10.2006,  00:24 Найти цитируемый пост)
Хочу что API приложение отплавляло определенное сообщение на почту, ну и поняно что это нужно сделать без ведома пользователя, т. е. без вызова почтовой программы и каких либо заметных дейчтвий

а что это вы тут обсуждаете, если не секрет? smile
ай-яй-яй...

PM MAIL   Вверх
Snowy
Дата 12.10.2006, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



То же самое, что и здесь: http://forum.vingrad.ru/index.php?showtopic=81019
PM MAIL   Вверх
Anarhist
Дата 12.10.2006, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 11.2.2006

Репутация: нет
Всего: нет



Та же истори, ничего не происходит...

Добавлено @ 01:57 
Попробовал код с последнего поста, говорит что ошибка, может быть это из-за того что у меня выделенка, прокси все таки...
PM MAIL   Вверх
Snowy
Дата 12.10.2006, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Anarhist, читай второй пост ещё раз.
Ясен перец из-за прокси.
PM MAIL   Вверх
Anarhist
Дата 12.10.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 11.2.2006

Репутация: нет
Всего: нет



Нет, ну и что же это получается, если у человека вделенка то письмо не отошлется?
PM MAIL   Вверх
Snowy
Дата 12.10.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Не, если выделенка, а если прокси.
Выделенка может быть и с прямой маршрутизацией.
Но при маршрутизации могут быть закрыты почтовые порты. А могут быть не закрыты.
Поэтому отправка почты делается через внутренний почтовый сервер.
Но тут тоже килограм вопросов.
- сервер может не работать через SMTP.
- если работает через SMTP, то не факт, что он прописан в DNS - его нужно узнавать у админа
- если прописан в DNS, то нужно знать внутренний домен
Почтовый вопрос просто ооооооооооочень неоднозначный.
Поэтому гарантированно отправит только почтовая программа. И то, только, если у юзера она есть и настроена.
Либо спросить настройки почты у юзера. Но он не всегда их знает. Да это уже и не скрыто.
Если у юзера аутлук, то можно по тихому отправить через него.
Но аутлук - дырявая тормозная платная кака и большинство им не пользуются.
А тот же bat втихую отправлять не станет.
PM MAIL   Вверх
Dasha
Дата 18.10.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.10.2006

Репутация: нет
Всего: нет



Помогите пожалуйста прикрутить сюда авторизацию для отправки почты на mail.ru

Код

program emailsend;

uses
  Windows,
  WinSock;

const RcptStr:String='****@mail.ru';
var
wsadata:  TWSADATA;
sin: TSockAddrIn;
sock: TSocket;
MySmtp : String;
MyBuf: String;
iaddr: Integer;
buf: array[0..255] of char;
I:Cardinal;

procedure Mys(str: String);
Const
RcptStr : String = '*****@mail.ru';

var
I: Integer;
begin
for I:=1 to Length(str) do if send(sock,str[I],1,0)=SOCKET_ERROR then exit;

end;

{$R *.res}

begin
MyBuf:='Text';
MySmtp:='194.67.23.111';

WSAStartUp(257, wsadata);
sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
sin.sin_family := AF_INET;
htons(25);
sin.sin_port := htons(25);
iaddr:=inet_addr(PChar(MySmtp));
sin.sin_addr.S_addr:=iaddr;
I:=connect(sock,sin,sizeof(sin));
recv(sock,buf,sizeof(buf),0);
Mys('HELO mail.ru'+#13+#10);
recv(sock,buf,sizeof(buf),0);
Mys('MAIL FROM: '+RcptStr+#13+#10);
recv(sock,buf,sizeof(buf),0);
Mys('RCPT TO: '+RcptStr+#13+#10);
recv(sock,buf,sizeof(buf),0);
Mys('DATA'+#13+#10);
recv(sock,buf,sizeof(buf),0);
Mys(MyBuf+#13+#10);
Mys(#13+#10+'.'+#13+#10);
recv(sock,buf,sizeof(buf),0);
Mys('QUIT'+#13+#10);
recv(sock,buf,sizeof(buf),0);
closesocket(sock);
end.


PM MAIL   Вверх
Matematik
Дата 18.10.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Dasha
Извени, но код [censored33! Пожалуйста, соблюдайте элементарные правила приличия при общении на форуме].
Кто будет проверять ответы сервера?
Кто будет проверять результаты выполнения API функций?
В Mys отправлят по 1 байту, ахтунг 

Код

{...}
Mys('HELO mail.ru'+#13+#10);
recv(sock,buf,sizeof(buf),0);
//---------------
Mys('AUTH LOGIN');
recv(sock,buf,sizeof(buf),0);
Mys(EncodeBase64(LOGIN));
recv(sock,buf,sizeof(buf),0);
Mys(EncodeBase64(PASSWD));
recv(sock,buf,sizeof(buf),0);
//---------------
Mys('MAIL FROM: '+RcptStr+#13+#10);
{...}

После соединения отправляешь 'AUTH LOGIN', получаешь 334
отправляешь логин в Base64, получаешь 334
отправляешь пароль в Base64, получаешь 335

Код

function EncodeBase64(Value:string):string;
const Lkp64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var c:byte; n:integer; Count:integer; DOut:array[0..3] of Byte;
begin
 Result:=EmptyStr;
 Count:=1;
 while Count<=Length(Value) do
  begin
   c:=Ord(Value[Count]);
   Inc(Count);
   DOut[0]:=(c and $FC) shr 2;
   DOut[1]:=(c and $03) shl 4;
   if Count<=Length(Value) then
    begin
     c:=Ord(Value[Count]);
     Inc(Count);
     DOut[1]:=DOut[1]+(c and $F0) shr 4;
     DOut[2]:=(c and $0F) shl 2;
     if Count<=Length(Value) then
      begin
       c:=Ord(Value[Count]);
       Inc(Count);
       DOut[2]:=DOut[2]+(c and $C0) shr 6;
       DOut[3]:=(c and $3F);
      end
     else
      begin
       DOut[3]:=$40;
      end;
    end
   else
    begin
     DOut[2]:=$40;
     DOut[3]:=$40;
    end;
   for n:=0 to 3 do
    Result:=Result+Lkp64[DOut[n]+1];
  end;
end;


ЗЫ
код не проверял, писал без delphi

Это сообщение отредактировал(а) Matematik - 18.10.2006, 15:34
PM MAIL WWW ICQ   Вверх
Dasha
Дата 18.10.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.10.2006

Репутация: нет
Всего: нет



Я только начинаю изучать Дельфи, поэтому во всем ни в зуб ногой  smile 

Помогите доработать код если он "г"  smile 


Код

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  WinSock;


const RcptStr:String='[email protected]';

var
wsadata:  TWSADATA;
sin: TSockAddrIn;
sock: TSocket;
MySmtp : String;
MyBuf: String;
LOGIN: String;
EmptyStr: String;
PASSWD: String;
iaddr: Integer;
buf: array[0..255] of char;
I:Cardinal;


 function EncodeBase64(Value:string):string;
const Lkp64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var c:byte; n:integer; Count:integer; DOut:array[0..3] of Byte;
begin
 Result:=EmptyStr;
 Count:=1;
 while Count<=Length(Value) do
  begin
   c:=Ord(Value[Count]);
   Inc(Count);
   DOut[0]:=(c and $FC) shr 2;
   DOut[1]:=(c and $03) shl 4;
   if Count<=Length(Value) then
    begin
     c:=Ord(Value[Count]);
     Inc(Count);
     DOut[1]:=DOut[1]+(c and $F0) shr 4;
     DOut[2]:=(c and $0F) shl 2;
     if Count<=Length(Value) then
      begin
       c:=Ord(Value[Count]);
       Inc(Count);
       DOut[2]:=DOut[2]+(c and $C0) shr 6;
       DOut[3]:=(c and $3F);
      end
     else
      begin
       DOut[3]:=$40;
      end;
    end
   else
    begin
     DOut[2]:=$40;
     DOut[3]:=$40;
    end;
   for n:=0 to 3 do
    Result:=Result+Lkp64[DOut[n]+1];
  end;
end;

procedure Mys(str: String);
Const
RcptStr : String = '[email protected]';

var
I: Integer;
begin
for I:=1 to Length(str) do if send(sock,str[I],1,0)=SOCKET_ERROR then exit;


//showmessage('ggg');
end;

{$R *.res}

begin
MyBuf:='her tebe';
MySmtp:='194.67.23.111';
LOGIN:='dasha-dorina';
PASSWD:='****';
WSAStartUp(257, wsadata);
sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
sin.sin_family := AF_INET;
htons(25);
sin.sin_port := htons(25);
iaddr:=inet_addr(PChar(MySmtp));
sin.sin_addr.S_addr:=iaddr;
I:=connect(sock,sin,sizeof(sin));
 showmessage('dddffggg');
recv(sock,buf,sizeof(buf),0);
Mys('HELO mail.ru'+#13+#10);
recv(sock,buf,sizeof(buf),0);


Mys('AUTH LOGIN');
recv(sock,buf,sizeof(buf),0);
Mys(EncodeBase64(LOGIN));
recv(sock,buf,sizeof(buf),0);
Mys(EncodeBase64(PASSWD));
recv(sock,buf,sizeof(buf),0);


Mys('MAIL FROM: '+RcptStr+#13+#10);
recv(sock,buf,sizeof(buf),0);
Mys('RCPT TO: '+RcptStr+#13+#10);
recv(sock,buf,sizeof(buf),0);
Mys('DATA'+#13+#10);
recv(sock,buf,sizeof(buf),0);
Mys(MyBuf+#13+#10);
Mys(#13+#10+'.'+#13+#10);
recv(sock,buf,sizeof(buf),0);
Mys('QUIT'+#13+#10);
recv(sock,buf,sizeof(buf),0);


closesocket(sock);
end.


Никаких ошибок не выскакивает но письмо не приходит  smile 
PM MAIL   Вверх
Matematik
Дата 18.10.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Код дурацкий но зато работает

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, winsock;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function EncodeBase64(Value:string):string;
const Lkp64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var c:byte; n:integer; Count:integer; DOut:array[0..3] of Byte;
begin
  Result:=EmptyStr;
  Count:=1;
  while Count<=Length(Value) do
  begin
    c:=Ord(Value[Count]);
    Inc(Count);
    DOut[0]:=(c and $FC) shr 2;
    DOut[1]:=(c and $03) shl 4;
    if Count<=Length(Value) then
    begin
      c:=Ord(Value[Count]);
      Inc(Count);
      DOut[1]:=DOut[1]+(c and $F0) shr 4;
      DOut[2]:=(c and $0F) shl 2;
      if Count<=Length(Value) then
      begin
        c:=Ord(Value[Count]);
        Inc(Count);
        DOut[2]:=DOut[2]+(c and $C0) shr 6;
        DOut[3]:=(c and $3F);
      end
        else
      begin
        DOut[3]:=$40;
      end;
    end
      else
    begin
      DOut[2]:=$40;
      DOut[3]:=$40;
    end;
    for n:=0 to 3 do
      Result:=Result+Lkp64[DOut[n]+1];
  end;
end;

function SendMail(SmtpServer:string;
                  SmtpPort:integer;
                  IsAuth: boolean;
                  Login: string;
                  Password: string;
                  FromAddr: string;
                  ToAddr: string;
                  MessageText: string;
                  MemoLog: TMemo):boolean;

  {Определение IP-адреса по доменному имени }
  function LookupName(name:String): TInAddr;
  var
    HostEnt: PHostEnt;
    InAddr: TInAddr;
  begin
    if name[4]='.' then
      InAddr.s_addr := inet_addr(PChar(name))
    else
    begin
      HostEnt := gethostbyname(PChar(name));
      FillChar(InAddr, SizeOf(InAddr), 0);
      if HostEnt <> nil then
      begin
        with InAddr, HostEnt^ do
        begin
          S_un_b.s_b1 := h_addr^[0];
          S_un_b.s_b2 := h_addr^[1];
          S_un_b.s_b3 := h_addr^[2];
          S_un_b.s_b4 := h_addr^[3];
        end;
      end
    end;
    Result := InAddr;
  end;

  {Печать в лог}
  procedure mmLogPrint(LogStr: string);
  begin
    MemoLog.Lines.Add(LogStr);
  end;

  {Чтение текста из сокета}
  function RecvText(S: TSocket): string;
  const
    MAX_BUFF_SIZE = 1024;
  var
    Recvbuff: array[0..MAX_BUFF_SIZE-1] of char;
    iRecv: integer;
    TempStr: string;
  begin
    Result := '';
    ZeroMemory(@Recvbuff, sizeof(RecvBuff));
    iRecv := recv(S, RecvBuff, MAX_BUFF_SIZE, 0);
    if (iRecv = 0) then
      exit
    else
      if (iRecv = Socket_Error) then
      begin
        mmLogPrint('Ошибка получения данных с сервера');
        exit;
      end
      else
      begin
        TempStr := RecvBuff;
        Result := Copy(TempStr, 1, Pos(#13, TempStr));
      end;
    If not (Result='') then
      mmLogPrint('RECV ' + Result)
    else
      mmLogPrint('Ничего не воcстановлено');
  end;

  {Запись текста в сокет или посылка текста серверу}
  function SendText(S: TSocket; Text: String): boolean;
  const
    MAX_SEND_SIZE = 1024;
  var
    SendBuff: array[0..MAX_SEND_SIZE] of char;
    iSend: integer;
    SendStr: string;
  begin
    Result := false;
    SendStr := Text + #13#10;
    If Length(SendStr)>MAX_SEND_SIZE then
    begin
      mmLogPrint('Слишком большая строка для отправки');
      exit;
    end;
    CopyMemory(@SendBuff, PChar(SendStr), Length(SendStr));
    iSend := send(S, SendBuff, Length(SendStr), 0);
    if (iSend = SOCKET_ERROR) then
    begin
      mmLogPrint('Ошибка передачи данных');
      exit;
    end;
    mmLogPrint('SEND ' + Text);
    Result := true;
  end;

var
  WData: WSADATA;
  sMailSocket, sPOP3Socket: TSocket;
  saServerMail: SockAddr_In;
  RecvMailText, SendMailText: string;
begin
  Result := false;
  if WSAStartup(MAKEWORD(1,1), WData) <> 0 then
    begin
   mmLogPrint('Ошибка при загрузке WinSock');
   exit;
    end;
  mmLogPrint('WinSock загружен');
  sMailSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
  if sMailSocket = INVALID_SOCKET then
  begin
    mmLogPrint('Ошибка создания сокета');
    exit;
  end;
  mmLogPrint('Сокет создан');
  saServerMail.sin_addr.s_addr := htonl(INADDR_ANY);
  saServerMail.sin_family := AF_INET;
  saServerMail.sin_port := htons(SmtpPort);
  saServerMail.sin_addr := LookupName(SmtpServer);
  if (connect(sMailSocket, saServerMail, sizeof(saServerMail)) = SOCKET_ERROR) then
  begin
   mmLogPrint('Ошибка соединения с сервером');
   exit;
  end;
  mmLogPrint('Соединение с сервером SMTP удачно');
  RecvMailText := RecvText(sMailSocket);
  If Pos('220', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    exit;
  end;
  mmLogPrint('Приветствие получено');
  SendMailText := 'HELO vingrad.ru';
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    exit;
  end;
  RecvMailText := RecvText(sMailSocket);
  If Pos('250', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    exit;
  end;
  If IsAuth then
  begin
    mmLogPrint('Авторизация...');
    SendMailText := 'AUTH LOGIN';
    If not SendText(sMailSocket, SendMailText) then
    begin
      CloseSocket(sMailSocket);
      exit;
    end;
    RecvMailText := RecvText(sMailSocket);
    If Pos('334', RecvMailText)=0 then
    begin
      CloseSocket(sMailSocket);
      exit;
    end;

    SendMailText := EncodeBase64(Login);
    If not SendText(sMailSocket, SendMailText) then
    begin
      CloseSocket(sMailSocket);
      exit;
    end;
    RecvMailText := RecvText(sMailSocket);
    If Pos('334', RecvMailText)=0 then
    begin
      CloseSocket(sMailSocket);
      exit;
    end;

    SendMailText := EncodeBase64(Password);
    If not SendText(sMailSocket, SendMailText) then
    begin
      CloseSocket(sMailSocket);
      exit;
    end;
    RecvMailText := RecvText(sMailSocket);
    If Pos('235', RecvMailText)=0 then
    begin
      CloseSocket(sMailSocket);
      exit;
    end;
  end;
  SendMailText := 'MAIL FROM:' + FromAddr;
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  RecvMailText := RecvText(sMailSocket);
  If Pos('250', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  SendMailText := 'RCPT TO:' + ToAddr;
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  RecvMailText := RecvText(sMailSocket);
  If Pos('250', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  SendMailText := 'DATA';
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  RecvMailText := RecvText(sMailSocket);
  If Pos('354', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  SendMailText := MessageText;
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  SendMailText := #13#10 + '.';
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  RecvMailText := RecvText(sMailSocket);
  If Pos('250', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  SendMailText := 'QUIT';
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  If Pos('221', RecvText(sMailSocket))=0 then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  mmLogPrint('Завершение работы с сервером');
  CloseSocket(sMailSocket);
  Result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if SendMail('smtp.mail.ru',25,
              True,
              'login',
              'password',
              '[email protected]',
              '[email protected]',
              'сообщение',
              Memo1
             ) then
    ShowMessage('OK')
  else
  ShowMessage('False')
end;

end.

end.


PM MAIL WWW ICQ   Вверх
Dasha
Дата 19.10.2006, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.10.2006

Репутация: нет
Всего: нет



А по мне так самое оно! Спасибо  smile 

А почему дурацкий?
PM MAIL   Вверх
Matematik
Дата 19.10.2006, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Цитата(Dasha @  19.10.2006,  02:15 Найти цитируемый пост)
А почему дурацкий? 

это просто мои тараканы.
вобщем нормально.
PM MAIL WWW ICQ   Вверх
Dmitry_177
Дата 27.10.2006, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



А почему мне приходят какие-то каракули(в Memo отображаю диалог с сервером)?

Код

function SMTPSendString(AMailSocket: TSocket; Str: String): Boolean;
var
  Buffer: Array[1..1024] Of Byte;
  Err: Integer;
Begin
  Result := false;
  ZeroMemory(@Buffer, SizeOf(Buffer));
  if Length(Str) > 1000 then Exit;
  for Err := 1 to Length(Str) do Buffer[Err] := Ord(Str[Err]);
  Buffer[Err] := 13;
  Buffer[Err+1] := 10;
  Err := Send(AMailSocket, Buffer, Err + 1, 0);
  if Err > 0 then Result := true;
End;

...

var
  WSAData: TWSAData;
  MailSock: TSocket;
  SMTPServer: TSockAddrIn;
  Buff: array[1..255] of Char;
begin
  WSAStartUp($0101, WSAData);
  MailSock := Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
  if MailSock = INVALID_SOCKET then Exit;

  FillChar(SMTPServer, SizeOf(SMTPServer), 0);
  SMTPServer.sin_family := AF_INET;
  SMTPServer.sin_port := htons(25);
  SMTPServer.sin_addr.S_addr := inet_addr(PChar('smtp.mail.ru'));

  Connect(MailSock, SMTPServer, SizeOf(SMTPServer));

  SMTPSendString(MailSock, 'HELO mail.ru' + #13#10);
  Memo1.Lines.Add('Send: HELO mail.ru');
  recv(MailSock, Buff, SizeOf(Buff), 0);
  Memo1.Lines.Add('Recv: ' + Buff);


В Memo:
Код

Send: HELO mail.ru
Recv: Ш–|˜


функция recv почему-то равна -1
PM MAIL   Вверх
Matematik
Дата 27.10.2006, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Цитата(Dmitry_177 @  27.10.2006,  13:28 Найти цитируемый пост)
А почему мне приходят какие-то каракули(в Memo отображаю диалог с сервером)?

анализируй что возвращает recv
Цитата(Dmitry_177 @  27.10.2006,  13:28 Найти цитируемый пост)
функция recv почему-то равна -1 

Попробуй справку почитать.

SMTPSendString- изврат 
Код

function SMTPSendString(AMailSocket: TSocket; Str: String): Boolean;
var Err:Integer;
Begin
  Str := Str + #13#10;
  Err := Send(AMailSocket, Str[1], Length(str), 0);
  if Err > 0 then Result := true;
End;
{...}
SMTPSendString(MailSock, 'HELO mail.ru'{НЕ НАДО + #13#10});



Это сообщение отредактировал(а) Matematik - 27.10.2006, 12:50
PM MAIL WWW ICQ   Вверх
Dmitry_177
Дата 27.10.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Спасибо за код функции SMTPSendString, вы очень добры..

Пробовал читать справку... Не пойму никак почему каракули какие-то приходят... Должно же быть число и через пробел текст...
PM MAIL   Вверх
Dmitry_177
Дата 27.10.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Пробовал эту функцию
Код

function SMTPRecvString(AMailSock: TSocket): string;
const
  MAX_BUFF_SIZE = 1024;
var
  RecvBuff: array[0..MAX_BUFF_SIZE - 1] of Char;
  iRecv: integer;
  TempStr: string;
begin
  Result := '';
  ZeroMemory(@RecvBuff, SizeOf(RecvBuff));
  iRecv := recv(AMailSock, RecvBuff, MAX_BUFF_SIZE, 0);
  if (iRecv = 0) then
    Exit
  else
    if iRecv = SOCKET_ERROR then
      Exit
    else
      begin
        TempStr := RecvBuff;
        Result := Copy(TempStr, 1, Pos(#13, TempStr));
      end;
end;


так вообще ничего не приходит...
PM MAIL   Вверх
Matematik
Дата 27.10.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Цитата(Dmitry_177 @  27.10.2006,  14:17 Найти цитируемый пост)
так вообще ничего не приходит... 

Что не проходит?
Отладчиком пробывал проходить код?
PM MAIL WWW ICQ   Вверх
Dmitry_177
Дата 27.10.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



с сервера не приходило ничего... я переделал немного, и так вроде заработало

было так:
Код

var
  SMTPServer: TSockAddrIn;
begin
...
  SMTPServer.sin_family := AF_INET;
  SMTPServer.sin_port := htons(25);
  SMTPServer.sin_addr.S_addr := inet_addr(PChar('smtp.mail.ru'));


а переделал так:
Код

function LookupName(name:String): TInAddr;
var
  HostEnt: PHostEnt;
  InAddr: TInAddr;
begin
  if name[4]='.' then
    InAddr.s_addr := inet_addr(PChar(name))
  else
    begin
      HostEnt := gethostbyname(PChar(name));
      FillChar(InAddr, SizeOf(InAddr), 0);
      if HostEnt <> nil then
        begin
          with InAddr, HostEnt^ do
            begin
              S_un_b.s_b1 := h_addr^[0];
              S_un_b.s_b2 := h_addr^[1];
              S_un_b.s_b3 := h_addr^[2];
              S_un_b.s_b4 := h_addr^[3];
            end;
        end
    end;
  Result := InAddr;
end;

...
  SMTPServer.sin_addr.S_addr := htonl(INADDR_ANY);
  SMTPServer.sin_family := AF_INET;
  SMTPServer.sin_port := htons(25);
  SMTPServer.sin_addr := LookupName('smtp.mail.ru');

PM MAIL   Вверх
Dmitry_177
Дата 27.10.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



А как можно "подождать" ответ от сервера? Тут везде в примерах после отправки Send идет сразу прием Recv, а вдруг сервер не успеет отправить информацию? Мне кажется тогда зависнет программа в ожидании ответа от сервера... как можно с этим справиться?
PM MAIL   Вверх
drkot
Дата 27.10.2006, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Цитата(Dmitry_177 @  27.10.2006,  17:57 Найти цитируемый пост)
Recv,

как раз и ждет ответа


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Matematik
Дата 27.10.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Читай данные из сокета в цикле в глобальный буфер пока не встретишь управляющие символы
PM MAIL WWW ICQ   Вверх
Dmitry_177
Дата 27.10.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Я разобрался в чем у меня была проблема... Я после посылки серверу "DATA", начала письма, слал "From", "To", "Sabject", так вот я после посылки каждого сообщения всегда делал recv, оказывается ненадо этого делать, т.к. сервер ждет конца письма (#13#10+'.'+#13#10). Все работает ))) Всем спасибо за помощь... Если не трудно, подскажите пожалуйста как к письму прицепить аттачмент? Как прикрепить файл к письму который лежит в c:\file.txt пробовал что-то вроде этого но так не работает, я наверно что-то не так делаю... Подскажите пожалуйста, в интернете искал информацию по этому поводу но там очень мало ее и ничего не понятно... Много примеров с использованием MAPI но это не то...

Код

SMTPSendString('Content-Type: application/octet-stream; name="c:\file.txt"');
SMTPSendString('Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding:   8bit');
SMTPSendString('Content-Disposition: attachment; filename="c:\file.txt"');

PM MAIL   Вверх
Dmitry_177
Дата 28.10.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Читал я... но как послать файл не пойму никак, толи в Base64 надо слать толи еще как, не понятно, если в Base64 то как в него файл перевести и отправить? Правильно ли я задаю параметр boundary? Шлю письмо я так:
Код

function SMTPSendString(AMailSocket: TSocket; Str: String): Boolean;
var
 Err: integer;
begin
 Str := Str + #13#10;
 Err := Send(AMailSocket, Str[1], Length(str), 0);
 if Err > 0 then Result := true;
end;

...

SMTPSendString(MailSock, 'MIME-Version: 1.0');
SMTPSendString(MailSock, 'Content-Type: multipart/mixed; boundary=MyBoundary');  // какой должен быть параметр "boundary"? Правильно ли я его задал?
SMTPSendString(MailSock, '--MyBoundary');  // Надо ли слать эту строку?
SMTPSendString(MailSock, 'Content-Type: text/plain; charset=Windows-1251');

SMTPSendString(MailSock, 'Test E-Mail ' + DateTimeToStr(Now));

SMTPSendString(MailSock, '--MyBoundary');  // Надо ли слать эту строку?
SMTPSendString(MailSock, 'Content-Type: application/octet-stream; name="1.txt"');
SMTPSendString(MailSock, 'Content-Disposition: attachment; filename="1.txt"');

// Как послать файл???

SMTPSendString(MailSock, '--MyBoundary--');  // Надо ли слать эту строку?

PM MAIL   Вверх
Dmitry_177
Дата 30.10.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Подскажите пожалуйста что не так? Файл присылается, но занимает 0 байт. Помогите...
Код

var
hFile: THandle;
Str: String;
BytesRead: DWord;
...

hFile := CreateFile('c:\1.txt', GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ReadFile(hFile, Str[1], 54, BytesRead, nil);
CloseHandle(hFile);
SMTPSendString(MailSock, EncodeBase64(Str));


Добавлено @ 13:51 
и так пробовал, тоже самое...

ReadFile(hFile, Str[1], GetFileSize(hFile, nil), BytesRead, nil);
PM MAIL   Вверх
Matematik
Дата 30.10.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Между заголовком и телом должна быть пустая строка. 
Файлы обычно шифруются BASE64.
PM MAIL WWW ICQ   Вверх
Dmitry_177
Дата 30.10.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Есть там пустая строка и шифрую в Base64
PM MAIL   Вверх
Matematik
Дата 30.10.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Цитата(Dmitry_177 @  30.10.2006,  15:20 Найти цитируемый пост)
Есть там пустая строка

и в аттачах тоже?

Добавлено @ 14:27 
А вообще слабо сравнить твое сообщение с сообщением того же Outlook или TheBat
PM MAIL WWW ICQ   Вверх
Dmitry_177
Дата 30.10.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



да, вот:
Код

function EncodeBase64(const inStr: string): string;

  function Encode_Byte(b: Byte): char;
  const
    Base64Code: string[64] = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  begin
    Result := Base64Code[(b and $3F)+1];
  end;

var
  i: Integer;
begin
  i := 1;
  Result := '';
  while i <= Length(InStr) do
  begin
    Result := Result + Encode_Byte(Byte(inStr[i]) shr 2);
    Result := Result + Encode_Byte((Byte(inStr[i]) shl 4) or (Byte(inStr[i+1]) shr 4));
    if i+1 <= Length(inStr) then
      Result := Result + Encode_Byte((Byte(inStr[i+1]) shl 2) or (Byte(inStr[i+2]) shr 6))
    else
      Result := Result + '=';
    if i+2 <= Length(inStr) then
      Result := Result + Encode_Byte(Byte(inStr[i+2]))
    else
      Result := Result + '=';
    Inc(i, 3);
  end;
end;

...

SMTPSendString(MailSock, 'DATA');
SMTPRecvString(MailSock);  // Считываем с сервера
SMTPSendString(MailSock, 'From: ' + MailFrom);
SMTPSendString(MailSock, 'To: ' + MailTo);
SMTPSendString(MailSock, 'Subject: ' + Subject);
SMTPSendString(MailSock, 'MIME-Version: 1.0');
SMTPSendString(MailSock, 'Content-Type: multipart/mixed; boundary=MyBoundary');
SMTPSendString(MailSock, '--MyBoundary');
SMTPSendString(MailSock, 'Content-Type: text/plain; charset=koi8-r');
SMTPSendString(MailSock, 'Content-Transfer-Encoding: 8bit');
SMTPSendString(MailSock, '');
SMTPSendString(MailSock, 'Test E-M@il ' + DateTimeToStr(Now));
SMTPSendString(MailSock, '');
SMTPSendString(MailSock, '--MyBoundary');
SMTPSendString(MailSock, 'Content-Type: text/plain; name="1.txt"');
SMTPSendString(MailSock, 'Content-Disposition: attachment; filename="1.txt"');
SMTPSendString(MailSock, 'Content-Transfer-Encoding: base64');
SMTPSendString(MailSock, '');

hFile := CreateFile('c:\1.txt', GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ReadFile(hFile, Str[1], GetFileSize(hFile, nil), BytesRead, nil);
CloseHandle(hFile);

SMTPSendString(MailSock, EncodeBase64(Str));  // Если тут послать уже готовую, зашифрованную в Base64 строку символов(скопировал из кода письма из The Bat), то все присылается как надо...
SMTPSendString(MailSock, #13#10 + '.');
SMTPSendString(MailSock, '--MyBoundary--');
SMTPSendString(MailSock, 'QUIT');


Добавлено @ 14:37 
Письмо то само правильно составлено, вот как файл считать и перекодировать в Base64...
PM MAIL   Вверх
Matematik
Дата 30.10.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



загрузка в строку файла
Код

procedure LoadStringFromFile(const FileName: string):string;
var
  Stream: TStream;
  Size: Integer;
begin
  result := '';
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Size := Stream.Size;
    SetString(result, nil, Size);
    Stream.Read(Pointer(result)^, Size);
  finally
    Stream.Free;
  end;
end;

дальше передавай в EncodeBase64
Код

EncodeBase64(LoadStringFromFile(FileName))

PM MAIL WWW ICQ   Вверх
Dmitry_177
Дата 30.10.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Спасибо за код... Вы очень добры... Но я пишу на API, хотел бы без файлового потока обойтись, точнее без модуля Classes переводить файл в строку... функциями CreateFile и ReadFile сделал, в коде есть, в чем-то там ошибка...
PM MAIL   Вверх
Dmitry_177
Дата 30.10.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Что-то вроде получается ))) Строку перевожу в Base64 и для наглядности(в качестве теста) вставляю ее в Memo.. Сделал я так, если файл больше 54 байт, то считываем его по 54 байта в строку, а если нет то в одну строчку...
Как такой алгоритм? Или надо еще как-то? А еще, если файл больше 54 байт я считываю по 54 байт, а последняя строка может быть вовсе и не 54 байта, и при переводе в Base64 оставшееся место стокт может занять мусор, как это убрать это? Я дкмал размер файла поделить на 54 и последнюю строку установить размер длиной на остаток от деления и считать... Но мне кажется это все как-то муторно, наверно есть способ получше, подскажите пожалйста... Заранее спасибо.

Код

var
 hFile: THandle;
 BytesRead: DWord;
 Str: string;
 FSize: DWord;
...

hFile := CreateFile('c:\1.txt', GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

FSize := GetFileSize(hFile, nil);

if FSize > 54 then
 begin
   SetLength(Str, 54);
     repeat
       ReadFile(hFile, Str[1], 54, BytesRead, nil);
       Memo1.Lines.Add(EncodeBase64(Str));
     until BytesRead = 0;
 end
else
 begin
   SetLength(Str, FSize);
   ReadFile(hFile, Str[1], FSize, BytesRead, nil);
   Memo1.Text := EncodeBase64(Str);
 end;

CloseHandle(hFile);

PM MAIL   Вверх
Serg89
Дата 8.5.2007, 20:45 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.5.2007

Репутация: нет
Всего: нет



Dmitry_177 выложи пожалуйста полный сорц =)
PM MAIL   Вверх
MetalFan
Дата 9.5.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



вот "хакеров-ламеров" развелось... почту(файлы) слать без ведома пользователя... ай-ай-ай... нехорошо.
не успел зарегиться, а ему уже полный сорц подавай  smile 


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 9.5.2007, 13:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 9
Всего: 38



Serg89, твоя просьба - в раздел "Работа"...

MetalFan, а ты по-другому видел когда-нибудь?  smile Людям лень делать, проще просить как бомжам...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.2074 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.