Отправка электроной почты

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Ответить
Lonix
Сообщения: 5
Зарегистрирован: 01 мар 2007, 00:00

01 мар 2007, 00:04

Подскажите куда нужно и что нужно добавить чтобы можно было еще отправлять прикрепленые данные? вот код проги:
.......................................
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdMessageClient, IdSMTP, StdCtrls, idMessage, IdEMailAddress;

.......................................

procedure TForm1.Button1Click(Sender: TObject);
var
M: TIdMessage;
begin
M := TIdMessage.Create(Form1);

M.Body.Add('Типа первая строчка собщения');
M.Body.Add('Типа вторая строчка собщения');
M.From.Text := '"Мирор" <mail@mail.ru>'; //отправитель
M.Recipients.Add;
M.Recipients.Items[0].Text := '"Kiss" <vit@mail.ru>'; //Получатель
M.Subject := 'Мы это сделали :) '; //Тема письма

IdSMTP1.AuthenticationType := atLogin;
IdSMTP1.Host := 'smtp.mail.ru';
IdSMTP1.Username := 'cards';
IdSMTP1.Password := '********'; // пасс
IdSMTP1.Connect();
if IdSMTP1.Connected then
begin
IdSMTP1.Send(M);
end;
IdSMTP1.Disconnect;
end;
namomelkor
Сообщения: 227
Зарегистрирован: 31 авг 2006, 13:11

01 мар 2007, 11:31

вот статейка по отправке там и вложения есть:

Алгоритм простой (для сторонних компонентов он принципиально ничем не отличается):

необходимо заполнить структуру PostMessage;
отправить эту структуру при помощи метода SendMail.
Структура PostMessage:

(*) FromName: string - имя отправителя;
FromAddress: string - Почтовый адресс отправителя
ReplyToAddress: string - Адрес, по которому следует ответить на письмо;
Organization: string
LocalProgram: string - Имя почтовой программы отправителя;
(*) ToAddress: TStringList - Почтовый адрес главного получателя (ей)
ToCC: TStringList - Список получателей Carbon Copy
ToBCC: TSringList - Список получателей Blind Carbon Copy
Attachments: TStringList - Список вложений
Body: TStringList - Собственно текст письма
Subject: string - Строка темы письма.
(*) - помечены обязательные поля. С остальным не сложно разобраться самому.

Также это можно сделать при помощи MAPI.

Т.е. письмо будет отправлено средствами _почтовой_программы_по_умолчанию_ - со всеми недостатками :) (например письмо будет помещено в папку "отправленные"). Зато без всяких там компонент и просто :)

Hиже готовая функция, в которой:

From - от кого
Dest - кому
Subject - тема
Text - текст письма
FileName - путь к вложению (если '', то соответственно ничего и не вкладываем)
Outlook - показывать или нет письмо перед отправкой (в твоём случае False)

Код: Выделить всё

Uses MAPI;
...

function SendMail(const From, Dest, Subject, Text, FileName: PChar;
Outlook: boolean):Integer;
var
  Message: TMapiMessage;
  Recipient, Sender: TMapiRecipDesc;
  File_Attachment: TMapiFileDesc;
                                                               
  function MakeMessage: TMapiMessage;
  begin
    FillChar(Sender, SizeOf(Sender), 0);
    Sender.ulRecipClass := MAPI_ORIG;
    Sender.lpszAddress := From;
                                               
    FillChar(Recipient, SizeOf(Recipient), 0);
    Recipient.ulRecipClass := MAPI_TO;
    Recipient.lpszAddress := Dest;

    FillChar(File_Attachment, SizeOf(File_Attachment), 0);
    File_Attachment.nPosition := Cardinal(-1);
    File_Attachment.lpszPathName := FileName;

    FillChar(Result, SizeOf(Result), 0);
    with Message do begin
      lpszSubject := Subject;
      lpszNoteText := Text;
      lpOriginator := @Sender;
      nRecipCount := 1;
      lpRecips := @Recipient;
      nFileCount := 1;
      lpFiles := @File_Attachment;
    end;
  end;

var
  SM: TFNMapiSendMail;
  MAPIModule: HModule;
  MAPI_FLAG: Cardinal;
begin
  if Outlook then
   MAPI_FLAG:=MAPI_DIALOG
  else
   MAPI_FLAG:=0;
  MAPIModule := LoadLibrary(PChar(MAPIDLL));
  if MAPIModule = 0 then
    Result := -1
  else
    try
      @SM := GetProcAddress(MAPIModule, 'MAPISendMail');
      if @SM <> nil then begin
        MakeMessage;
        Result := SM(0, Application.Handle, Message, MAPI_FLAG, 0);
      end else Result := 1;
    finally
      FreeLibrary(MAPIModule);
    end;
end;
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

02 мар 2007, 12:09

&quot писал(а):IdSMTP1.Password := '********'; // пасс
А вот это уже не есть хорошо, в EXE файле можно выцепить без проблем.
It's a long way to the top if you wanna rock'n'roll
namomelkor
Сообщения: 227
Зарегистрирован: 31 авг 2006, 13:11

02 мар 2007, 12:15

somewhere писал(а):А вот это уже не есть хорошо, в EXE файле можно выцепить без проблем.
и как с этим бороться?
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

02 мар 2007, 16:23

namomelkor писал(а):и как с этим бороться?
Просуммировать "по одной букве"
IdSMTP1.Password := 'P';
IdSMTP1.Password := IdSMTP1.Password + 'a';
IdSMTP1.Password := IdSMTP1.Password + 's';
IdSMTP1.Password := IdSMTP1.Password + 's';
IdSMTP1.Password := IdSMTP1.Password + 'w';
IdSMTP1.Password := IdSMTP1.Password + 'o';
IdSMTP1.Password := IdSMTP1.Password + 'r';
IdSMTP1.Password := IdSMTP1.Password + 'd';

Надеюсь, Delphi не смодет это соптимизировать и породит один оператор (тот, что предлагался изначально ;) )
Ответить