Форум: "Начинающим";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];
ВнизОтправить электронную почту Найти похожие ветки
← →
Первокласник Вася (2008-05-23 14:36) [0]Добрый день, Мастера!
Подскажите пожалуйста, что в коде не правильно. Код из 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 в приведённом коде - для примера
← →
TIF © (2008-05-23 14:45) [1]Работаю через TIdSMTP (отправка писем) на mail.ru и yandex.ru
Без всяких проблем
К тому же, там всё значительно легче ;)
← →
Palladin © (2008-05-23 14:45) [2]
> Result := (Res = SOCKET_ERROR) or (Copy(buff, 1, 3) = accept);
какое странное условие...
← →
Первокласник Вася (2008-05-23 14:47) [3]Работаю через TIdSMTP (отправка писем) на mail.ru и yandex.ru
Без всяких проблем
К тому же, там всё значительно легче ;)
Это кажется в delphi6 есть, у меня delphi7
← →
Palladin © (2008-05-23 14:48) [4]
> Это кажется в delphi6 есть, у меня delphi7
тебе не правильно кажется, это вообще сторонние компоненты
← →
Первокласник Вася (2008-05-23 14:51) [5]Нашёл IdSMTP1, бросил его на форму. Но немного не знаю свойства этого компонента. Подскажите пожалуйста, как пользоваться им. Или маленький пример покажите пожалуйста. Думаю что с примером разберусь.
← →
TIF © (2008-05-23 14:52) [6]? Сторонние ?
По-моему, я их к себе в D7 не ставил. они там сразу были! :) Что я делал не так? )))
← →
TIF © (2008-05-23 14:53) [7]> Нашёл IdSMTP1, бросил его на форму. Но немного не знаю свойства
> этого компонента. Подскажите пожалуйста, как пользоваться
> им. Или маленький пример покажите пожалуйста. Думаю что
> с примером разберусь.
Лови, сейчас достану исходник своей последней проги-почтовика... Секундочку...
← →
Palladin © (2008-05-23 14:53) [8]
> TIF © (23.05.08 14:52) [6]
то, что они входят в поставку, еще не означает, что они стандартные...
← →
TIF © (2008-05-23 14:54) [9]> то, что они входят в поставку, еще не означает, что они
> стандартные...
Как всё сложно :) Ладно, пусть будут "в комплекте"
← →
Первокласник Вася (2008-05-23 14:59) [10]>Лови, сейчас достану исходник своей последней проги-почтовика... Секундочку...
TIF! Я буду с удовольствием изучать твою программу! Мне очень интересна эта тема в последнее время, но начинающему это очень трудно!
Радует, что Мастера в последнее время стали более серьёзно стали подходить индивидуально к проблеме каждого! Настоящие мастера!!!!
← →
TIF © (2008-05-23 15:01) [11]Вот процедурка отправки сообщения. Разобраться несложно. Для кодирования текста письма используются воспомогательные процедуры, сейчас о них тоже расскажу
(в интернете таких примеров, кстати, много)
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;
← →
TIF © (2008-05-23 15:05) [12]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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c