Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Отправить письмо на Delphi
Посл.ответ Сообщение

Ранг: 45.5 (посетитель)
Активность: 0.050
Статус: Участник

Создано: 20 июля 2006 17:57
· Личное сообщение · #1

потскажите, как можно отправить письмо, не прибегая всякие модули (в нете этого полно - но это не нужно), чисто апи. Пробовал отправлять через telnet, но почта еще не пришла . Может кто-нибуть исходником поделиться?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 20 июля 2006 18:01
· Личное сообщение · #2

Если чисто на АПИ, дык можно хоть с васма пример взять на асме и переправить на Дельфи или также и сделать асмовую вставку.




Ранг: 299.6 (наставник)
Активность: 0.30
Статус: Участник
Armadillo Killer

Создано: 20 июля 2006 18:07
· Личное сообщение · #3

Отправка и прием почты реализуются при помощи Delphi довольно просто. Для отправки почты нам понадобится компонент idSMTP со страницы Indy Clients палитры компонентов Delphi.

Этот компонент реализует все необходимое для отправки электронной почты по протоколу SMTP (Simple Mail Transfer Protocol - простой протокол передачи почты), использующий 25 порт, по которому посылаются команды и текст письма. Этапы отправки электронной почты следующие:

1) соединение с SMTP сервером по 25 порту;
2) подготовка тела письма, определение отправителя и получателя письма;
3) отправка письма на SMTP сервер;

Разместив на форме компонент idSMTP, займёмся его настройкой. Настройку порта можно произвести в инспекторе объектов, установив свойство Port в значение 25, или в коде программы сделать то же самое:

IdSMTP1.Port:=25;

Соединение с сервером

Для соединения с SMTP сервером, который будет осуществлять отправку нашей почты, нужно указать его URL, для сервера mail.ru это производится следующим образом :

IdSMTP1.Host := ′smtp.mail.ru′;

Соединение с сервером производится методом Connect:

procedure Connect(const ATimeout: Integer); override;
где ATimeout - необязательный параметр, задает максимальное время в миллисекундах ожидания ответа с SMTP сервера, по истечении которого попытка установить соединение прекращается.

Например,

IdSMTP1.Connect(5000);

Если при соединении с сервером требуется авторизация, то значение свойства AuthenticationType нужно установить в atLogin, при этом в инспекторе объектов также нужно определить свойства Username(имя пользователя. К примеру, Username почтового ящика delphi@mail.ru - delphi) и Password(пароль на ящик), или сделать то же программно:

IdSMTP1.AuthenticationType:=atLogin;
IdSMTP1.Username:=′delphi′;
IdSMTP1.Password:=′something′;

Если авторизация не требуется, то свойство AuthenticationType в инспекторе объектов нужно установить в atNone, либо сделать это программно:

IdSMTP1.AuthenticationType:=atNone;

После применения метода Connect, нужно анализировать логическое свойство Connected, которое в случае удачного соединения устанавливается в True. После этого при помощи метода Send можно отправлять сообщение:

if Connected=True then IdSMTP1.Send(Msg);

Структура письма

Метод Send отправляет тело сообщения, представляющего собой структуру типа TIdMessage;

Структура письма реализуется в Delphi отдельным компонентом TIdMessage, расположенным на палитре компонентов Indy Misc и выглядит следующим образом

TidMessage Структура TIdMessage определяется следующим образом:

var
Msg: TIdMessage;
begin
Msg.Subject:=′тема сообщения′; //текст темы сообщения
Msg.Recipients.EMailAddresses:=′bogdanwe@mail.ru′;
//указываем адрес получателя
Msg.From.Adress:=′delphi@mail.ru′; //указываем автора письма
Msg.Body.Text:=′текст сообщения′; //размещаем текст сообщения
Msg.Date:=StrToDate(′01.12.2004′);//дата отправки письма может быть любой
end;

С темой сообщения, я думаю, все понятно. Свойство

property Recipients: TIdEmailAddressList;
определяет получателя или получателей электронного письма. Свойством EMailAddresses, имеющего синтаксис:

property EMailAddresses: String;
конкретно определяются названия электронных учетных записей, которым адресуется письмо. Названия должны указываться через разделитель вида "," то есть через запятую. Например:

Msg.Recipients.EMailAddresses:=′bogdanwe@mail.ru,delphi7@mail.ru′;
Свойство From представляет собой объект типа TIdEmailAddressItem и содержит информацию о отправителе письма и в свою очередь включает в себя три свойства - Name, Address, Text.

Свойство Address содержит информацию о электронном ящике отправителя:

property Address: string;
например,

Msg.From.Address:=′delphi@mail.ru′;
Свойство Name представляет собой имя отправителя:

property Name: string;
например,

Msg.From.Name:=′Антон Камолов′;
Свойство Text содержит информацию обоих свойств. Тело письма представляет собой объект типа TStrings:

property Body: TStrings;
Присоединяем к письму аттачмент

Если вам нужно отправить с письмом файл, т.е. аттачмент, то для этого нужно создать объект класса TidAttachment. Для этого применяется следующий конструктор:

constructor Create(Collection: TIdMessageParts; const AFileName: TFileName = ′′); reintroduce;
где Collection - объект класса TIdMessageParts, представляющее собой коллекцию приложений к электронному письму.
контстанта AFileName типа TFileName - представляет собой обычную текстовую строку с указанием правильного пути к файлу, например "C:file.zip", по умолчанию имеет значение ′′.

Таким образом, продолжая наш пример, строкой вида

TIdAttachment.Create(Msg.MessageParts,′c:file.zip′);
мы заполняем свойство MessageParts объекта Msg информацией о аттачменте.

Теперь наша структура письма содержит информацию о аттачменте. После отправки сообщения нужно разорвать соединение с сервером, чтобы оно не "висело". Это производится методом Disconnect:

IdSMTP1.Disconnect;



Ранг: 45.5 (посетитель)
Активность: 0.050
Статус: Участник

Создано: 20 июля 2006 18:16
· Личное сообщение · #4

Z0oMiK как ни странно, эта страница у меня ща в опере открыто svdpro.info/page.php?id=32, но там же Z0oMiK пишет:
Для отправки почты нам понадобится компонент idSMTP со страницы Indy Clients палитры компонентов Delphi.

а мне надо, GAMe ovER пишет:
не прибегая всякие модули

Archer С этим ща я и парюсь , но лучше на делфях. Говорят, через телнет отправить можно, но у меня почему-то он не отправляет,хотя вс окей




Ранг: 260.3 (наставник), 2thx
Активность: 0.120
Статус: Участник
PPC-PROTECT author

Создано: 20 июля 2006 18:18
· Личное сообщение · #5

ну все ж просто ))) возьми на любом другом языке, асм/си и перепиши на дельфи, там немного то... минут 10 работы

-----
Пиво, сиськи, транс




Ранг: 45.5 (посетитель)
Активность: 0.050
Статус: Участник

Создано: 20 июля 2006 18:24
· Личное сообщение · #6

так дайте хоть си, только на апи.



Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

Создано: 20 июля 2006 19:12
· Личное сообщение · #7

Ну допустим вот пример трояна на асм, когда был взят с васма

2f78_20.07.2006_CRACKLAB.rU.tgz - trojan.asm




Ранг: 500.6 (!), 7thx
Активность: 0.260
Статус: Участник

Создано: 20 июля 2006 19:12
· Личное сообщение · #8

GAMe ovER

Это подойдёт?

{
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;

{
mail('127.0.0.1',25,'bboy-ne@yandex.ru' ,'admin@company.mail', 'subj', 'body text');

p.s.: Тестировалась на e-mail сервере Alt-N Daemond Pro for Windows v6.5.1...
Функция делалась на основе статьи "Простой протокол передачи почты (SMTP)"
}

Взято с delphiworld.narod.ru/



Ранг: 45.5 (посетитель)
Активность: 0.050
Статус: Участник

Создано: 20 июля 2006 19:52
· Личное сообщение · #9

наверно



Ранг: 20.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 июля 2006 22:35
· Личное сообщение · #10

Вот тебе сишный пример:
neox.iatp.by/files/dnsquery.zip




Ранг: 392.8 (мудрец), 108thx
Активность: 0.260.01
Статус: Участник
REVENGE сила, БеХоЦе могила

Создано: 21 июля 2006 09:00 · Поправил: Maximus
· Личное сообщение · #11

Процедура только создает письмо, кнопку отправить юзверь жмет сам, но если пошаманить с флагами, все будет на автомате.


procedure SendEmail(Subject, Body, Attachment: string);
var MapiMessage: TMapiMessage;
MapiFileDesc: TMapiFileDesc;
begin
with MapiFileDesc do begin
ulReserved:= 0;
flFlags:= 0;
nPosition:= 0;
lpszPathName:= PChar(Attachment);
lpszFileName:= nil;
lpFileType:= nil;
end;
with MapiMessage do begin
ulReserved := 0;
lpszSubject := PChar(Subject);
lpszNoteText := PChar(Body);
lpszMessageType := nil;
lpszDateReceived := nil;
lpszConversationID := nil;
flFlags := 0;
lpOriginator := nil;
nRecipCount := 0;
lpRecips := nil;
nFileCount:= 1;
lpFiles := @MapiFileDesc;
end;
MapiSendMail(0, 0, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
end;


-----
StarForce и Themida ацтой!




Ранг: 48.8 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 21 июля 2006 11:00
· Личное сообщение · #12

дык банально учишь протокол smtp и реализуешь все через winsock 2.0, чего тут заморачиваться?
если нада приатачить файл, то кодируешь его в base64 и шлешь заголовком.


 eXeL@B —› Программирование —› Отправить письмо на Delphi
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати