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 в приведённом коде - для примера


Anatoly Podgoretsky   (2008-05-23 16:48:00) [1]


> А на mail.ru если адрес "куда" тоже находится на mail.ru,
>  то @mail.ru можно опустить.

А зачем опускать, чтобы гадать дойдет или нет?


TIF   (2008-05-23 16:46:00) [2]

> Msg:=TIdMessage.Create(nil);

Делфи какая? Я в 7 делал... Юнит IdMessage в разделе uses у тебя ведь прописан?


> А на mail.ru если адрес "куда" тоже находится на mail.ru,
> то @mail.ru можно опустить.

Да? Не знал... Хотя смысла-то от этого...


palva   (2008-05-23 16:42:00) [3]


> Ну уж никак не так, это вообще не прокатит никогда: > Или
> просто xxx (опуская @rambler.ru)

А на mail.ru если адрес "куда" тоже находится на mail.ru, то @mail.ru можно опустить.


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

Все и так и эдак и первое и десятое.....

Все равно ошибка вылезает Msg:=TIdMessage.Create(nil);


TIF   (2008-05-23 16:32:00) [5]

> {Адрес отправителя}
> Msg.From.Address:='xxx@rambler';


Где .ru?! Надо ведь xxx@rambler.ru

Ну уж никак не так, это вообще не прокатит никогда: > Или просто xxx (опуская @rambler.ru)/I>


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

т.е.
{Адрес получателя}
Msg.Recipients.EMailAddresses:='xxx@rambler.ru';

{Адрес отправителя}
Msg.From.Address:='xxx@rambler';

Или просто xxx (опуская @rambler.ru)


TIF   (2008-05-23 16:25:00) [7]

> Первокласник Вася   (23.05.08 16:16) [38]
> TIF, я твой код изучаю.
>
> Ещё раз. Извини если надоел :)


Ещё раз:
АДРЕС ОТПРАВИТЕЛЯ должен совпадать с учётными данными ящика, с которого письмо уходит! Это доп. защита от спама


> сидят на indy и пишут велосипедную кодировку base64

Другой не знаю :) К тому же мне всё равно так удобнее


Reindeer Moss Eater   (2008-05-23 16:19:00) [8]

не упасть бы под стол.
сидят на indy и пишут велосипедную кодировку base64


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

TIF, я твой код изучаю.

Ещё раз. Извини если надоел :)

Вот код всего приложения


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

var
 Form1: TForm1;

implementation

{$R *.dfm}

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


TIF   (2008-05-23 16:04:00) [10]

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


TIF   (2008-05-23 16:03:00) [11]

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


TIF   (2008-05-23 16:02:00) [12]

> Покажи пожалуйста код, может я что-то упустил?

Я птш :))) Сразу хотел сказать, а потом решил потом сказать и забыл ;)

АДРЕС ОТПРАВИТЕЛЯ должен совпадать с учётными данными ящика, с которого письмо уходит! Это доп. защита от спама

В моём примере подключаемся через пользователя andrewtishkin и отсылаем от имени адреса andrewtishkin@mail.ru

В твоём примере нужно сделать аналогично. Правда, если ты собрался спам отсылать... :)))


Первокласник Вася   (2008-05-23 16:01:00) [13]

Recipients.EMailAddresses :='xxx@ramblerru';
Это была моя опечатка. В коде все нормально.


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

Приношу свои извинения перед модераторами и мастерами, если что не так сказал. Извините, просто немного обиделся на "второклассника"....
буду вести себя сдержанее.


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


> Второклассник Петя   (23.05.08 15:57) [31]

ты зачем сюда ходил? так интересно было их читать...


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

Покажи пожалуйста код, может я что-то упустил?


Второклассник Петя   (2008-05-23 15:57:00) [17]

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


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

> with IdMessage1 do
> begin
> Body.Assign(Memo1.Lines);
> //IdMessage1;
> From.Text := 'xxx@rambler.ru'; Recipients.EMailAddresses
> :='xxx@ramblerru';
> Subject := 'проверка!';
> end;


with туту лишний, так ненаглядно :(


> Recipients.EMailAddresses :='xxx@ramblerru';


А не .ru?

Повторяю: изменил только SMTP и всё работает! Уже сам себе письмо отсылал :)


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

Удалено модератором
Примечание: без эксцессов, виновные будут наказаны и так


Palladin   (2008-05-23 15:54:00) [20]


> Anatoly Podgoretsky ©   (23.05.08 15:53) [26]

тсс! мне инетересно чем закончится разговор в ДС №18 :)


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

Наверх

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