forked from danieleteti/loggerpro
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LoggerPro.EMailAppender.pas
113 lines (100 loc) · 2.8 KB
/
LoggerPro.EMailAppender.pas
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
unit LoggerPro.EMailAppender;
{ <@abstract(The unit to include if you want to use @link(TLoggerProRedisAppender))
@author(Daniele Teti) }
interface
uses
LoggerPro, System.Classes, System.DateUtils,
idSMTP;
type
{
@abstract(Logs sending message to an email address)
To learn how to use this appender, check the sample @code(email_appender.dproj)
@author(Daniele Teti - [email protected])
}
TLoggerProEMailAppender = class(TLoggerProAppenderBase)
private
FSMTP: TIdSMTP;
FFromAddresses: string;
FToAddresses: string;
protected
/// <summary>
/// Ovveride this method in descendant if you want a different formatting for
/// message subject or body
/// </summary>
procedure PrepareMessage(const aLogItem: TLogItem; out aSubject, aBody: String); virtual;
public
constructor Create(aSMTP: TIdSMTP; const aFromAddresses, aToAddresses: String; aLogFormat: string = DEFAULT_LOG_FORMAT); reintroduce;
procedure Setup; override;
procedure TearDown; override;
procedure WriteLog(const aLogItem: TLogItem); override;
procedure TryToRestart(var Restarted: Boolean); override;
end;
implementation
uses
System.SysUtils, IdMessage;
constructor TLoggerProEMailAppender.Create(aSMTP: TIdSMTP; const aFromAddresses, aToAddresses: String; aLogFormat: string);
begin
inherited Create(aLogFormat);
FSMTP := aSMTP;
FFromAddresses := aFromAddresses;
FToAddresses := aToAddresses;
{ by default, email appender sends only errors }
SetLogLevel(TLogType.Error);
end;
procedure TLoggerProEMailAppender.PrepareMessage(const aLogItem: TLogItem;
out aSubject, aBody: String);
begin
aSubject := 'LoggerPro ' + aLogItem.LogTypeAsString.ToUpper + ' [' + aLogItem.LogTag + ']';
aBody := FormatLog(aLogItem);
end;
procedure TLoggerProEMailAppender.Setup;
begin
inherited;
end;
procedure TLoggerProEMailAppender.TearDown;
begin
try
FSMTP.Free;
except
// do nothing
end;
end;
procedure TLoggerProEMailAppender.TryToRestart(var Restarted: Boolean);
begin
inherited;
try
FSMTP.Disconnect(false);
except
end;
Restarted := True;
end;
procedure SendEmail(aSMTP: TIdSMTP; const aFromAddresses, aToAddresses: String; const Subject, Body: String);
var
Msg: TIdMessage;
begin
Msg := TIdMessage.Create(nil);
try
Msg.From.Text := aFromAddresses;
Msg.Recipients.EMailAddresses := aToAddresses;
Msg.Body.Text := Body;
Msg.Subject := Subject;
if not aSMTP.Connected then
aSMTP.Connect;
aSMTP.Send(Msg);
try
aSMTP.Disconnect(false);
except
end;
finally
Msg.Free;
end;
end;
procedure TLoggerProEMailAppender.WriteLog(const aLogItem: TLogItem);
var
lBody: string;
lSubject: string;
begin
PrepareMessage(aLogItem, lSubject, lBody);
SendEmail(FSMTP, FFromAddresses, FToAddresses, lSubject, lBody);
end;
end.