![]() |
| ||
|
|
Новости |
Поиск |
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 в приведённом коде - для примера
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 :)