Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Маленкий email


Автор: Pavelbej 7.8.2005, 14:03
Этот код отправляет email с текстом набранным в мемо. Но вот проблема - можно отправлять только примерно 1800 символов. Почему?

Код

procedure TForm1.ToolButton4Click(Sender: TObject);
var em_subject, em_body, em_mail : string;
begin
    if memo1.Lines.Count<>0 then
        begin
        case MessageDlg('Send mail with text?',mtConfirmation,mbYesNoCancel,0) of
        IDYes: em_body := memo1.Lines.Text;
        IDNO: em_body := '';
        IDCancel: exit;
        end;
        end;
    em_subject := '';
    em_mail := 'mailto:vscsoft@vsc.com'+ '?subject=' + em_subject+'&body=' + em_body ;
    ShellExecute(Handle,'open', PChar(em_mail), nil, nil, SW_SHOWNORMAL);
end;



Автор: Song 8.8.2005, 08:29
Думается мне, больше строка с передачей параметров к файлу не поддерживает.

Автор: Pavelbej 8.8.2005, 10:37
А вот этот код отправляет больше техста. Правда он запускает почтового клиента Mozilla, а верхний код запускает Outlook. В этом дело.



Код

procedure TForm1.ToolButton4Click(Sender: TObject);
var
  MapiMessage: TMapiMessage;
  MError: Cardinal;
begin
  with MapiMessage do
  begin
    ulReserved := 0;
    lpszSubject := nil;
    lpszNoteText := PChar(memo1.Lines.Text);
    lpszMessageType := nil;
    lpszDateReceived := nil;
    lpszConversationID := nil;
    flFlags := 0;
    lpOriginator := nil;
    nRecipCount := 0;
    lpRecips := nil;
    nFileCount := 0;
    lpFiles := nil;
  end;
    MError := MapiSendMail(0, 0, MapiMessage,
    MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
  if MError <> 0 then MessageDlg('Error sending mail!', mtError, [mbOK], 0);
end;


Автор: Гость_Delphin 8.8.2005, 14:06
А не проще вручную отправлять через сокеты?
Или тебе обязательно через почтовый клиент?

Автор: Pavelbej 8.8.2005, 18:19
Мне нужно просто отправить email с текстом набранным в Memo. Второй пример кода иногда дает сбои. Есть другой вариант?

Автор: FRAGNATIC 8.8.2005, 20:20
Код

unit SendMailTo;

interface

uses WinSock, SysUtils, Windows;  // не забудь этот модуль для работы с сокетами

function sendmail(const smtp, mail_from, mail_to, body: string): boolean;

implementation

function sendmail(const smtp, mail_from, mail_to, body: string): boolean;

const ok = '250';
       cl = #13#10;

var WSAData: TWSAData;
   Host: TSockAddrIn;
   Sock: TSocket;
   res: integer;
   hostEnt: PHostEnt;

 { отправляем данные через сокет }
 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(const accept: string): bool;
 var buff: array[1..255] of char;
 begin
   res := recv(Sock, buff, 255, 0);
   result := (res = SOCKET_ERROR) or (copy(buff, 1, 3) = accept);
 end;

begin
 result := false;
 try
   WSAStartUp($101, WSAData);
   Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
   if Sock = INVALID_SOCKET then exit;

   // получаем IP адрес SMTP-сервера и переводим его через inet_addr
   hostEnt := gethostbyname(PChar(smtp));
   if hostEnt = nil then exit;
   res := inet_addr(PChar(inttostr(byte(hostEnt^.h_addr_list^[0]))+'.'+inttostr(byte(hostEnt^.h_addr_list^[1]))+'.'+
            inttostr(byte(hostEnt^.h_addr_list^[2]))+'.'+inttostr(byte(hostEnt^.h_addr_list^[3]))));
   if res <= 0 then exit;
   { устанавливаем хост и порт сервера }
   Host.sin_family := AF_INET;
   Host.sin_port := htons(25); // порт 25, можешь поменять
   Host.sin_addr.S_addr := res;

   if connect(Sock, Host, SizeOf(Host)) > 0 then exit;
   sleep(200);
   if not recvdata('220') then exit; // приветствие сервера
   senddata('HELO SANTA' + cl); // после HELO можешь написать свое приветствие
   sleep(200);
   if not recvdata(ok) then exit;
   senddata('MAIL FROM:' + '<'+mail_from+'>' + cl);
   sleep(200);
   if not recvdata(ok) then exit;
   senddata('RCPT TO:' + '<'+mail_to+'>' + cl);
   sleep(200);
   if not recvdata(ok) then exit;
   senddata('DATA' + cl);
   sleep(200);
   if not recvdata('354') then exit;
   senddata(body + cl + '.' + cl); // отправляем текст сообщения
   sleep(200);
   if not recvdata(ok) then exit;
   senddata('QUIT' + cl); // отключаемся от сервера
   result := true;
 finally
   closesocket(sock);
   WSACleanup
 end;
end; //sendmail('smtp.inbox.ru', 'qwerty@inbox.ru', 'HACK@inbox.ru', 'hello there!')
end.


Автор: Гость_Delphin 8.8.2005, 21:37
Извеняюсь но развен не senddata('EHLO SANTA' + cl); и у строки что первый символ 1 ? А не 0???

Автор: Medved 10.8.2005, 03:21
Цитата(Song @ 8.8.2005, 11:29)
Думается мне, больше строка с передачей параметров к файлу не поддерживает.


Там указатель на PChar. Думается мне это почтовик просто их проглатывает.

Автор: mvdr 15.8.2005, 07:15
Гость_Delphin - ты не почтового рассылателя пишешь?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)