Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.10.2010, 15:47
sdaurum sdaurum вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 4
Репутация: 10
Печаль Проблема отправки емаил

Люди умные помогите!

Дано:
100 почтовых адресов

Задача:
Отправить сообщения на все 100 адресов

Проблема:
Если один адрес окажется неверным или коряво написан, типа "ххх@yyy.ruru", то процесс прерывается с ошибкой, что адрес задан неверно.

Вопрос:
Как сделать так, чтобы при подобном случае процесс не прерывался???

Код программы
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
for n:=0 to 100 do begin
 
idsmtp1.Host:='SMTP.xxx.ru';
idsmtp1.port:=25;
idsmtp1.Username:='xxx';
idsmtp1.password:='xxx';
 
 
idmessage1.body.Text:=memo2.text;
idmessage1.from.Text:=edit2.text;
idmessage1.recipients.EMailAddresses:=edit1.text;
idmessage1.subject:=edit3.text;
 
idmessage1.IsEncoded:=true;
 
attach:=TIdAttachment.Create(idmessage1.MessageParts, listbox2.Items[n]);
 
idsmtp1.connect();
if idsmtp1.connected=true then begin
idsmtp1.send(idmessage1);
IdMessage1.Clear;
idsmtp1.disconnect;
end;
end;
Admin: Пользуемся тегами!

Последний раз редактировалось Admin, 30.10.2010 в 16:46.
Ответить с цитированием
  #2  
Старый 30.10.2010, 16:02
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Ну попробуй Try...Except:
Код:
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
for n:=0 to 100 do begin
TRY
idsmtp1.Host:='SMTP.xxx.ru';
idsmtp1.port:=25;
idsmtp1.Username:='xxx';
idsmtp1.password:='xxx';
 
 
idmessage1.body.Text:=memo2.text;
idmessage1.from.Text:=edit2.text;
idmessage1.recipients.EMailAddresses:=edit1.text;
idmessage1.subject:=edit3.text;
 
idmessage1.IsEncoded:=true;
 
attach:=TIdAttachment.Create(idmessage1.MessagePar ts, listbox2.Items[n]);
 
idsmtp1.connect();
if idsmtp1.connected=true then begin
idsmtp1.send(idmessage1);
IdMessage1.Clear;
idsmtp1.disconnect;
end;
Except
{вот здесь можешь вывести ошибку, если надо... или нечего не выводи}
end;
 
end;
__________________
Помогаю за Спасибо
Ответить с цитированием
  #3  
Старый 30.10.2010, 16:17
sdaurum sdaurum вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 4
Репутация: 10
По умолчанию

не помогло
Ответить с цитированием
  #4  
Старый 30.10.2010, 16:18
sdaurum sdaurum вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от v1s2222
Ну попробуй Try...Except:
Код:
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
for n:=0 to 100 do begin
TRY
idsmtp1.Host:='SMTP.xxx.ru';
idsmtp1.port:=25;
idsmtp1.Username:='xxx';
idsmtp1.password:='xxx';
 
 
idmessage1.body.Text:=memo2.text;
idmessage1.from.Text:=edit2.text;
idmessage1.recipients.EMailAddresses:=edit1.text;
idmessage1.subject:=edit3.text;
 
idmessage1.IsEncoded:=true;
 
attach:=TIdAttachment.Create(idmessage1.MessagePar ts, listbox2.Items[n]);
 
idsmtp1.connect();
if idsmtp1.connected=true then begin
idsmtp1.send(idmessage1);
IdMessage1.Clear;
idsmtp1.disconnect;
end;
Except
{вот здесь можешь вывести ошибку, если надо... или нечего не выводи}
end;
 
end;

Не помогло
Ответить с цитированием
  #5  
Старый 30.10.2010, 17:32
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Запустите ваше приложение без отладки. В этом случае среда не будет отлавливать ошибки и try...except будет работь корректно

Последний раз редактировалось ChinYan, 30.10.2010 в 17:34.
Ответить с цитированием
  #6  
Старый 30.10.2010, 21:01
sdaurum sdaurum вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от ChinYan
Запустите ваше приложение без отладки. В этом случае среда не будет отлавливать ошибки и try...except будет работь корректно

Не помогает все равно
Ответить с цитированием
  #7  
Старый 12.11.2010, 18:07
mirt steelwater mirt steelwater вне форума
Прохожий
 
Регистрация: 17.10.2010
Сообщения: 35
Репутация: 10
Печаль похожая проблема

похожая проблема:
Код:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
unit SSLMails;
 
interface
 
uses
    Windows, SysUtils, Classes,
    IdMessage, IdPOP3, IdSMTP, IdSSLOpenSSL, IdExplicitTLSClientServerBase, { Indy 10 }
    DllThreads, EClasses, VarRecs{, Versions};
 
type
{ курьер для отправки почты по SMTP через защищенное соединение }
{$M+}
    TSSL_SMTP = class (TObject)
    private
        f_MSG: TIdMessage;                   { сообщение }
        f_SMTP: TIdSMTP;                     { SMTP-клиент }
        f_SSL: TIdSSLIOHandlerSocketOpenSSL; { SSL-соединение }
        f_Host: String;                      { адрес SMTP-сервера }
        f_Port: Word;                        { порт работы SMTP-протокола }
        f_ConnectTimeout: LongWord;          { максимальное время ожидания ответа }
        f_Login: String;                     { логин }
        f_Password: String;                  { пароль }
        f_FromAddress: String;               { почтовый ящик отправителя }
        f_ToAddresses: String;               { почтовые ящики получателей }
        f_Subject: String;                   { тема письма }
        f_Message: String;                   { ткст письма }
        f_LastError: Exception;              { ошибка }
    protected
        procedure SetHost (const aValue: String);
        procedure SetPort (const aValue: Word);
        procedure SetLogin (const aValue: String);
        procedure SetPassword (const aValue: String);
        procedure SetFromAddress (const aValue: String);
        procedure SetToAddresses (const aValue: String);
        procedure SetSubject (const aValue: String);
        procedure SetMessage (const aValue: String);
        function GetLastError : String;
        procedure SetConnectTimeout (const aValue: LongWord);
    public
        constructor Create (anArgs: array of const); virtual;
        destructor Destroy; override;
        class function Send (anArgs: array of const) : Boolean; overload;
        function Send : Boolean; overload;
        property Host: String read f_Host write SetHost;
        property Port: Word read f_Port write SetPort;
        property Login: String read f_Login write SetLogin;
        property Password: String read f_Password write SetPassword;
        property FromAddress: String read f_FromAddress write SetFromAddress;
        property ToAddresses: String read f_ToAddresses write SetToAddresses;
        property Subject: String read f_Subject write SetSubject;
        property Message: String read f_Message write SetMessage;
        property LastError: String read GetLastError;
        property ConnectTimeout: LongWord read f_ConnectTimeout write SetConnectTimeout;
    end;
{$M-}
 
implementation
 
constructor TSSL_SMTP.Create (anArgs: array of const);
var
    I : Integer;
begin
    try
        inherited Create;
        { первый параметр - Host : String
          доменное имя или ip-адрес SMTP-сервера }
        f_Host := '';
        if (  ( High (anArgs) >= 0 ) and ( ParamToStr (anArgs [0]) <> 'default' )  ) then
            Host := ParamToStr (anArgs [0]);
        { второй параметр - Port : Word
          порт выхода SMTP-протокола по защищенному соединению }
        f_Port := 443; {443, 465, 587}
        if (  ( High (anArgs) >= 1 ) and ( ParamToStr (anArgs [1]) <> 'default' )  ) then
            Port := ParamToInt (anArgs [1]);
        { третий параметр - Login : String
          логин для подключения к SMTP-серверу }
        f_Login := '';
        if (  ( High (anArgs) >= 2 ) and ( ParamToStr (anArgs [2]) <> 'default' )  ) then
            Login := ParamToStr (anArgs [2]);
        { четвертый параметр - Password : String
          пароль для подключения к SMTP-серверу }
        f_Password := '';
        if (  ( High (anArgs) >= 3 ) and ( ParamToStr (anArgs [3]) <> 'default' )  ) then
            Password := ParamToStr (anArgs [3]);
        { пятый параметр - FromAddress : String
          почта отправителя }
        f_FromAddress := '';
        if ( (f_Host <> '') and (f_Login <> '') ) then
            FromAddress := Format ('%s@%s',[f_Login,f_Host]);
        if (  ( High (anArgs) >= 4 ) and ( ParamToStr (anArgs [4]) <> 'default' )  ) then
            FromAddress := ParamToStr (anArgs [4]);
        { шестой параметр - ToAddresses : String
          почта получателей через запятую }
        f_ToAddresses := '';
        if (  ( High (anArgs) >= 5 ) and ( ParamToStr (anArgs [5]) <> 'default' )  ) then
            ToAddresses := ParamToStr (anArgs [5]);
        { седьмой параметр - Subject : String
          тема письма }
        f_Subject := '';
        if (  ( High (anArgs) >= 6 ) and ( ParamToStr (anArgs [6]) <> 'default' )  ) then
            Subject := ParamToStr (anArgs [6]);
        { остальные параметры - Message : String
          строки сообщения }
        f_Message := '';
        for I := 7 to High (anArgs) do
            Message := Format ('%s'#13#10'%s', [ f_Message, ParamToStr (anArgs [i]) ]);
        { таймаут }
        f_ConnectTimeout := 3000;
        { создание структуры сообщения }
        f_MSG := NIL;
        f_MSG := TIdMessage.Create;
        if ( not Assigned (f_MSG) ) then
            raise Exception.Create ('Ошибка создания структуры сообщения!');
        with f_MSG do
        begin
            From.Address := f_FromAddress;
            Recipients.EMailAddresses := ToAddresses;
            Subject := UTF8Encode (f_Subject);
            Date := now;
        end;
        { создание SMTP-клиента }
        f_SMTP := NIL;
        f_SMTP := TIdSMTP.Create (NIL);
        if ( not Assigned (f_SMTP) ) then
            raise Exception.Create ('Ошибка создания SMTP-клиента!');
        with f_SMTP do
        begin
            Host := f_Host;
            Port := f_Port;
            ConnectTimeout := f_ConnectTimeout;
            UserName := f_Login;
            Password := f_Password;
            AuthType := atDefault;
        end;
        { создание SSL-сессии }
        f_SSL := NIL;
        f_SSL := TIdSSLIOHandlerSocketOpenSSL.Create (NIL);
        if ( not Assigned (f_SSL) ) then
            raise Exception.Create ('Ошибка создания SSL-сессии!');
        with f_SSL do
        begin
            Host := f_Host;
            Port := f_Port;
            Destination := Format ('%s:%d',[f_Host,f_Port]);
            DefaultPort := f_Port;
            ConnectTimeout := f_ConnectTimeout;
            SSLOptions.Method := sslvTLSv1;
            SSLOptions.Mode := sslmUnassigned;
        end;
        { подключение поддержки SSL к SMTP-клиенту }
        with f_SMTP do
        begin
            IOHandler := f_SSL;
            UseTLS := utUseExplicitTLS;
        end;
        f_LastError := NIL;
    except on E: Exception do
        raise EClass.Create ([self,'Create','Ошибка создания почтового курьера!',E]);
    end;
end;
 
destructor TSSL_SMTP.Destroy;
begin
    try
        f_Login := '';
        f_Password := '';
        if Assigned (f_MSG) then
            FreeAndNil (f_MSG);
        if Assigned (f_SMTP) then
            FreeAndNil (f_SMTP);
        if Assigned (f_SSL) then
            FreeAndNil (f_SSL);
        inherited Destroy;
    except on E: Exception do
        raise EClass.Create ([self,'Destroy','Ошибка уничтожения почтового курьера!',E]);
    end;
end;
 
class function TSSL_SMTP.Send (anArgs: array of const) : Boolean;
var
    OBJ : TSSL_SMTP;
begin
    Result := TRUE;
    try
        OBJ := TSSL_SMTP.Create (anArgs);
        if Assigned (OBJ) then
        try
            Result := OBJ.Send;
        finally
            FreeAndNil (OBJ);
        end;
    except on E: Exception do
        raise EClass.Create ([self,'Send','Ошибка отправки почты курьером!',E]);
    end;
end;
 
function TSSL_SMTP.Send : Boolean;
begin
    Result := TRUE;
    try
        if ( f_Host = '' ) then
            raise Exception.Create ('Не указан SMTP-сервер!');
        if ( f_Port = 0 ) then
            raise Exception.Create ('Не указан порт работы SMTP-протокола!');
        {if ( f_Login = '' ) then
            raise Exception.Create ('Не указан логин!');
        if ( f_Password = '' ) then
            raise Exception.Create ('Не указан пароль!');}
        if ( f_ToAddresses = '' ) then
            raise Exception.Create ('Не указан получатель письма!');
        with f_SMTP do
        try
            try
                Connect();
                Send (f_MSG);
                ProcessMessages;
            finally
                Disconnect;
            end;
        except on E: Exception do begin
            Result := FALSE;
            f_LastError := E;
            //raise;
        end; end;
    except on E: Exception do
        raise EClass.Create ([self,'Send','Ошибка отправки почты курьером!',E]);
    end;
end;
 
procedure TSSL_SMTP.SetHost (const aValue: String);
***
procedure TSSL_SMTP.SetPort (const aValue: Word);
***
procedure TSSL_SMTP.SetLogin (const aValue: String);
***
procedure TSSL_SMTP.SetPassword (const aValue: String);
***
procedure TSSL_SMTP.SetFromAddress (const aValue: String);
***
procedure TSSL_SMTP.SetToAddresses (const aValue: String);
***
procedure TSSL_SMTP.SetSubject (const aValue: String);
***
procedure TSSL_SMTP.SetMessage (const aValue: String);
***
function TSSL_SMTP.GetLastError : String;
***
procedure TSSL_SMTP.SetConnectTimeout (const aValue: LongWord);
***
 
end.
вызываю:
Код:
1
2
3
4
TSSL_SMTP.Send (['smtp.gmail.com',465,
                           'login','password',
                           'login@gmail.com','login@gmail.com',
                           'subject','text']);
Admin: Рекомендую справиться в Википедии на счет понятия "цитата" и вариантов ее использования.
Админ, не ругайся, на работе яваскрипты отключены, а я забыл какой тэг в PHP BB для кода - теперь вижу. спасибо)

Последний раз редактировалось mirt steelwater, 13.11.2010 в 21:45.
Ответить с цитированием
  #8  
Старый 12.11.2010, 18:07
mirt steelwater mirt steelwater вне форума
Прохожий
 
Регистрация: 17.10.2010
Сообщения: 35
Репутация: 10
По умолчанию

пробовал порты: 25, 443, 465, 587
не работает
библиотеки ssleay32.dll и libeay32.dll лежат в каталоге проекта.
у кого есть какие идеи? выдает ошибки вроде SocketError, could not open ssl и др. в зависимости от порта и компьютера. тестировал на 3 машинах с интернетом и выключенными экранами
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025