Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отправить электронную почту [D7, XP]


Страницы:   1 2 3

Первокласник Вася ©   (2008-05-23 14:36:00) 

Добрый день, Мастера!

Подскажите пожалуйста, что в коде не правильно. Код из DelphiWorld6
У меня ящик прописан на Rambler.ru


{
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;
procedure TForm1.Button1Click(Sender: TObject);
begin
{
smtp - ip адрес smtp сервера
port - порт smtp сервера, по умолчанию 25
from - адрес отправителя
dest - адрес получателя
subject - тема письма
body - текст писма}

 if mail('127.0.0.1',25,'Mymail@rambler.ru','MyMail@rambler.ru','ПРИВЕТ!!!!!!!!','TE ST TEST TEST!!!') then
    showmessage('TRUE') else
    showmessage('FALSE');
end;


Отправляю сообщение, функция возвращает TRUE, проверяю свой ящик, а отправленного письма нет! Что неправильно?
Может необходимо ещё и получение письма реализовать? Или как?

ПРИМЕЧАНИЕ:MyMail в приведённом коде - для примера


  (2008-05-23 15:53:00) [21]

Удалено модератором


Anatoly Podgoretsky   (2008-05-23 15:53:00) [22]

> Первокласник Вася  (23.05.2008 15:52:23)  [23]

Так и не будет работать, такого хоста нет.


TIF   (2008-05-23 15:53:00) [23]

Специально зарегистрировал ящик на рамблере :) Проверил: всё норм, письма отсылает, с smtp.rambler.ru, больше никаких изменений в код не вносил


Первокласник Вася   (2008-05-23 15:52:00) [24]

Бьюсь над этой проблемой...
Написал вот что, но также не работает :(

idSMTP1.Host:='smtp.rambler.ru';
idSMTP1.Port:=25;
idSMTP1.Username:='xxx';
idSMTP1.Password:='******';
idSMTP1.AuthenticationType:=atLogin;
with IdMessage1 do
begin
Body.Assign(Memo1.Lines);
//IdMessage1;
From.Text := 'xxx@rambler.ru'; Recipients.EMailAddresses :='xxx@ramblerru';
Subject := 'проверка!';
end;


Reindeer Moss Eater   (2008-05-23 15:51:00) [25]

контрольные точки алгоритма


TIF   (2008-05-23 15:51:00) [26]

> не пойма, что имеется в виду под _port и _host ???

Это для тебя проверка: после выполнения каждой операции в листбокс будет выводиться текст, я вот такой решил выбрать (можно написать и так:
IdSMTP1.Port:=25;
ListBox1.Items.Add('выбрали порт, всё клёво');

:)))
Когда вылезет ошибка, ты сразу зато поймёшь, после выполнения какой команды она происходит...


Первокласник Вася   (2008-05-23 15:48:00) [27]

не пойма, что имеется в виду под _portи _host???


Palladin   (2008-05-23 15:44:00) [28]

:)


TIF   (2008-05-23 15:43:00) [29]

> Я заметил что ошибка вылезает здесь Msg:=TIdMessage.Create(nil)> ;

В этом месте сообщение ещё не отсылается, оно только НАЧИНАЕТ СОЗДАВАТЬСЯ
Чтобы точно проверить, где ошибка лезет, сделай примерно так:

{УСТАНАВЛИВАЕМ СОЕДИНЕНИЕ}
IdSMTP1.Host:='smtp.rambler.ru';
 ListBox1.Items.Add('_Host');
IdSMTP1.Port:=25;
 ListBox1.Items.Add('_Port');


и так далее, в наиболее проблемных и спорных местах

К тому же, возможно вся проблема в IdSMTP1.AuthenticationType:=atLogin;


Первокласник Вася   (2008-05-23 15:39:00) [30]

Адреса почтовых серверов я знаю. И стараюсь не ошибаться.
Я заметил что ошибка вылезает здесь Msg:=TIdMessage.Create(nil);
В общем сообщение не создается, так как хост не найден. Как я понимаю.
Хотя в качестве хоста я пишу, согласно документации Rambler
IdSMTP1.Host:='smtp.rambler.ru';

Также обнаружена инфа что если провайдер блокирует 25-й порт, то реклмендуется попробовать 587 порт


TIF   (2008-05-23 15:33:00) [31]

http://help.rambler.ru/article.html?s=141&id=33

Для любой почтовой программы необходимо указать адреса почтовых сервисов:
Сервер входящих сообщений (Incoming mail) - pop3.rambler.ru
Сервер исходящих сообщений (Outgoing mail) - smtp.rambler.ru

Хм, странно, может было с ошибкой написано? Попробуй заново написать эту строчку...


TIF   (2008-05-23 15:24:00) [32]

А ты смотрел документацию на Рамблере? Справку о доступе к ящику через почтового клиента?

Я не уверен, что там именно smtp.rambler.ru... Не увсех так всё просто, например у той же pochta.ru смтпшник: mail.pochta.ru

Каждый сам что-нибудь придумывает :) Почитай справку на их сайте, я сейчас тоже гляну


Первокласник Вася   (2008-05-23 15:20:00) [33]

В свой программе все изменил под свои данные

procedure TForm1.Button3Click(Sender: TObject);
var Msg: TIdMessage;
begin

{УСТАНАВЛИВАЕМ СОЕДИНЕНИЕ}
IdSMTP1.Host:='smtp.rambler.ru';
IdSMTP1.Port:=25;
IdSMTP1.AuthenticationType:=atLogin;
IdSMTP1.Username:='xxx@rambler.ru';
IdSMTP1.Password:='*****';
IdSMTP1.Connect;


Но выдается ошибка: Хост не найден.


TIF   (2008-05-23 15:07:00) [34]

function ConvertEncoding(sIn: string; sCoding: string): string;
//sIn - строка для перекодирования
//sCoding - матрица для перекодирования
//result - полученная перекодированная строка
var iFtd: integer;
begin

 for iFtd:=1 to length(sIn)
   do result:=result+sCoding[ord(sIn[iFtd])];

end;

+ КОНСТАНТЫ И ТИП для неё:

  type// Тип матриц перекодировки
 TCodeMatrix = array[1..255] of char;

  const

 FirstCodes =
   #1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#27#28+
  #29#30#31' !"#$%&''()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^' +
   '_`abcdefghijklmnopqrstuvwxyz{|}~\x7F';
  cmKoi8RToAnsi: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
 + '-¦-¬L-++T++---¦¦---?¦•v??? ?°?·?=¦-ёг㬬¬LLL---¦¦¦¦Ё¦¦TTT¦¦¦+++©юабцдефгх'
   + 'ийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ';

cmAnsiToKoi8R: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
 + 'ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—?™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·Ј—є»јЅѕїбвчздецъй'
   + 'клмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС';


TIF   (2008-05-23 15:05:00) [35]

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;


TIF   (2008-05-23 15:01:00) [36]

Вот процедурка отправки сообщения. Разобраться несложно. Для кодирования текста письма используются воспомогательные процедуры, сейчас о них тоже расскажу
(в интернете таких примеров, кстати, много)

procedure;
var Msg: TIdMessage;
begin

 {УСТАНАВЛИВАЕМ СОЕДИНЕНИЕ}
 IdSMTP1.Host:='smtp.mail.ru';
 IdSMTP1.Port:=25;
 IdSMTP1.AuthenticationType:=atLogin;
 IdSMTP1.Username:='andrewtishkin';
 IdSMTP1.Password:='*********';
 IdSMTP1.Connect;

 {ГОТОВИМ СООБЩЕНИЕ}
 Msg:=TIdMessage.Create(nil);

 Msg.ContentType := 'text/plain';
 Msg.CharSet := 'koi8-r';
 Msg.ContentTransferEncoding := '8bit';
 Msg.Encoding:= meMIME;

 Msg.NoEncode:=false;
 Msg.NoDecode:=false;

 {Запросить уведомление о прочтении, если нужно}
 //Msg.ExtraHeaders.Values['Return-Receipt-To']:='andrewtishkin@mail.ru';

 {Тема сообщения}
 //Msg.Subject:='=?koi8-r?B?8NLP18XSy8Eg09fR2skh?=';
 Msg.Subject:='=?koi8-r?B?'+EncodeBase64(ConvertEncoding('Тема в Base64', cmAnsiToKoi8R))+'?=';

 {Дата отправления письма. может быть любой}
 Msg.Date:=StrToDate('01.12.2004');

 {Адрес получателя}
 Msg.Recipients.EMailAddresses:='andrewtishkin@yandex.ru';
 {Адрес отправителя}
 Msg.From.Address:='andrewtishkin@mail.ru';

 {Текст сообщения}
 Msg.Body.Text:=ConvertEncoding('Проверка связи!', cmAnsiToKoi8R);

 {Отправляем...}
 if IdSMTP1.Connected
   then IdSMTP1.Send(Msg);

 {НЕ ЗАБЫВАЕМ РАЗЪЕДИНИТЬСЯ!}
 IdSMTP1.Disconnect;

end;


Первокласник Вася   (2008-05-23 14:59:00) [37]

>Лови, сейчас достану исходник своей последней проги-почтовика... Секундочку...

TIF! Я буду с удовольствием изучать твою программу! Мне очень интересна эта тема в последнее время, но начинающему это очень трудно!
Радует, что Мастера в последнее время стали более серьёзно стали подходить индивидуально к проблеме каждого! Настоящие мастера!!!!


TIF   (2008-05-23 14:54:00) [38]

> то, что они входят в поставку, еще не означает, что они
> стандартные...

Как всё сложно :) Ладно, пусть будут "в комплекте"


Palladin   (2008-05-23 14:53:00) [39]


> TIF ©   (23.05.08 14:52) [6]

то, что они входят в поставку, еще не означает, что они стандартные...


TIF   (2008-05-23 14:53:00) [40]

> Нашёл IdSMTP1, бросил его на форму. Но немного не знаю свойства
> этого компонента. Подскажите пожалуйста, как пользоваться
> им. Или маленький пример покажите пожалуйста. Думаю что
> с примером разберусь.


Лови, сейчас достану исходник своей последней проги-почтовика... Секундочку...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо