![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отправить электронную почту [D7, XP]
Первокласник Вася © (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, бросил его на форму. Но немного не знаю свойства
> этого компонента. Подскажите пожалуйста, как пользоваться
> им. Или маленький пример покажите пожалуйста. Думаю что
> с примером разберусь.
Лови, сейчас достану исходник своей последней проги-почтовика... Секундочку...