Модераторы: 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   Вверх
Страницы: (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.0645 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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