Skip to content

Commit 813ad85

Browse files
committed
First commit
0 parents  commit 813ad85

14 files changed

+3057
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.loglogin

README.md

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# streamMail
2+
3+
Uses stream device protocol to send email notifications from IOC. Based on this Tech Talk discussion: https://epics.anl.gov/tech-talk/2013/msg02050.php
4+
5+
## Adding to an existing IOC
6+
7+
Add the following to the IOC's RELEASE
8+
'''
9+
SMAIL = /local/copy/of/streamMail
10+
'''
11+
Since the RELEASE is updated, will need to run make.
12+
13+
Add the following to IOC's st.cmd:
14+
'''
15+
iocshLoad("$(SMAIL)/iocsh/streamMail.iocsh", "PREFIX=$(PREFIX),MSERVER=email.server.com,ADDRFROM=[email protected],ADDRTO=[email protected]")
16+
17+
'''
18+
19+
Just replace email.server.com, [email protected] (doesn't need to be a real account), and
20+
[email protected] (should be real address).

iocsh/streamMail.iocsh

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# set the protocol path for streamDevice
2+
epicsEnvSet("STREAM_PROTOCOL_PATH", "$(STREAM_PROTOCOL_PATH):$(SMAIL)/sMailApp/Db")
3+
set_requestfile_path("$(SMAIL)", "/sMailApp/Db")
4+
5+
drvAsynIPPortConfigure("mailPORT","$(MSERVER):25",0,0,0)
6+
7+
epicsEnvSet("SMPREFIX","strMail")
8+
9+
# Simple streamMail support
10+
#dbLoadRecords("$(SMAIL)/sMailApp/Db/streamMail.db","P=$(PREFIX),MPORT=mailPORT,MSERVER=$(MSERVER),SM=strMail,FROM=$(ADDRFROM),TO=$(ADDRTO)")
11+
12+
# Load 10 notifiers
13+
dbLoadTemplate("$(SMAIL)/sMailApp/Db/streamMail.substitutions","PREFIX=$(PREFIX),MPORT=mailPORT,MSERVER=$(MSERVER),SM=$(SMPREFIX),FROM=$(ADDRFROM),TO=$(ADDRTO)")
14+
#dbLoadRecords("$(SMAIL)/sMailApp/Db/streamMail_common.db","P=$(PREFIX),SM=$(SMPREFIX)")
15+
16+
## Asyn record support for serial port
17+
# use the following for troubleshooting
18+
dbLoadRecords("$(ASYN)/db/asynRecord.db","P=$(PREFIX),R=SMasyn,PORT=mailPORT,ADDR=0,OMAX=0,IMAX=256")
19+
20+
asynSetTraceIOMask("mailPORT",0,0x1)
21+
asynSetTraceMask("mailPORT",0,0x9)

sMailApp/Db/mail_timer.db

+237
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
#! Generated by VisualDCT v2.5
2+
#! DBDSTART
3+
#! DBDEND
4+
5+
6+
record(ai, "$(P)$(SM):timer$(N):secsPastEpoch") {
7+
field(DESC, "Seconds Past Epoch")
8+
field(SCAN, "Passive")
9+
field(PINI, "NO")
10+
field(DTYP, "Sec Past Epoch")
11+
field(PHAS, "1")
12+
field(PREC, "2")
13+
}
14+
15+
record(transform, "$(P)$(SM):timer$(N):calcElapsed") {
16+
field(SCAN, "Passive")
17+
field(CLCB, "d?a:b")
18+
field(CLCC, "a-b")
19+
field(CLCD, "0")
20+
field(INPA, "$(P)$(SM):timer$(N):secsPastEpoch.VAL PP")
21+
field(OUTC, "$(P)$(SM):timer$(N):elapsedSecs.VAL PP")
22+
field(PREC, "2")
23+
field(CLCF, "e-c")
24+
field(CLCG, "e?e-c:0")
25+
field(OUTF, "$(P)$(SM):timer$(N):doneCalc.C PP")
26+
field(CMTA, "raw secsPastEpoch")
27+
field(CMTB, "start time")
28+
field(CMTC, "elapsed time")
29+
field(CMTD, "reset command")
30+
field(CMTE, "preset")
31+
field(CMTF, "time remaining")
32+
field(CMTG, "remaining for display")
33+
field(OUTG, "$(P)$(SM):timer$(N):remainingSecs PP")
34+
field(CLCH, "h")
35+
field(CMTH, "update period")
36+
}
37+
38+
record(ao, "$(P)$(SM):timer$(N):elapsedSecs") {
39+
field(PREC, "2")
40+
}
41+
42+
record(bo, "$(P)$(SM):timer$(N):Go") {
43+
field(FLNK, "$(P)$(SM):timer$(N):resetOnGo")
44+
field(ZNAM, "Stop")
45+
field(ONAM, "Go/Reset")
46+
field(OUT, "$(P)$(SM):timer$(N):setBusy.A PP")
47+
}
48+
49+
record(stringin, "$(P)$(SM):timer$(N):currentTime") {
50+
field(SCAN, "Passive")
51+
field(DTYP, "Soft Timestamp")
52+
field(INP, "@%Y/%m/%d %H:%M:%S.%03f")
53+
}
54+
55+
record(calcout, "$(P)$(SM):timer$(N):doneCalc") {
56+
field(CALC, "(a>0)&&b&&(c<=0.05)")
57+
field(INPA, "$(P)$(SM):timer$(N):calcElapsed.E")
58+
field(INPB, "$(P)$(SM):timer$(N):Go.VAL")
59+
field(OUT, "$(P)$(SM):timer$(N):doStop1 PP")
60+
field(OOPT, "When Non-zero")
61+
field(DOPT, "Use OCAL")
62+
field(OCAL, "0")
63+
}
64+
65+
record(ao, "$(P)$(SM):timer$(N):preset") {
66+
field(PREC, "2")
67+
field(OUT, "$(P)$(SM):timer$(N):calcElapsed.E PP")
68+
field(PINI, "YES")
69+
}
70+
71+
record(bo, "$(P)$(SM):timer$(N):resetOnGo") {
72+
field(UDF, "0")
73+
field(DOL, "1")
74+
field(OUT, "$(P)$(SM):timer$(N):calcElapsed.D PP")
75+
field(PINI, "NO")
76+
field(DISV, "0")
77+
field(SDIS, "$(P)$(SM):timer$(N):Go.VAL")
78+
field(FLNK, "$(P)$(SM):timer$(N):startTime")
79+
}
80+
81+
record(stringin, "$(P)$(SM):timer$(N):startTime") {
82+
field(SCAN, "Passive")
83+
field(DTYP, "Soft Timestamp")
84+
field(INP, "@%Y/%m/%d %H:%M:%S.%03f")
85+
}
86+
87+
record(bo, "$(P)$(SM):timer$(N):doStop") {
88+
field(OUT, "$(P)$(SM):timer$(N):Go PP")
89+
field(DESC, "FLNK belongs to user")
90+
field(FLNK, "$(TFLNK).PROC CA")
91+
}
92+
93+
record(fanout, "$(P)$(SM):timer$(N):scanFanout") {
94+
field(LNK1, "$(P)$(SM):timer$(N):currentTime")
95+
field(LNK2, "$(P)$(SM):timer$(N):calcElapsed")
96+
}
97+
98+
record(bo, "$(P)$(SM):timer$(N):update") {
99+
field(SCAN, ".1 second")
100+
field(FLNK, "$(P)$(SM):timer$(N):scanFanout")
101+
field(DISV, "0")
102+
field(SDIS, "$(P)$(SM):timer$(N):Go")
103+
}
104+
105+
record(bo, "$(P)$(SM):timer$(N):updateCurrent") {
106+
field(SCAN, "1 second")
107+
field(FLNK, "$(P)$(SM):timer$(N):currentTime")
108+
field(SDIS, "$(P)$(SM):timer$(N):Go")
109+
}
110+
111+
record(ao, "$(P)$(SM):timer$(N):remainingSecs") {
112+
field(PREC, "2")
113+
}
114+
115+
record(busy, "$(P)$(SM):timer$(N):busy") {
116+
}
117+
118+
record(calcout, "$(P)$(SM):timer$(N):setBusy") {
119+
field(CALC, "A")
120+
field(OUT, "$(P)$(SM):timer$(N):busy PP")
121+
field(OOPT, "Transition To Non-zero")
122+
}
123+
124+
125+
record(bo, "$(P)$(SM):timer$(N):clearBusy") {
126+
field(OMSL, "closed_loop")
127+
field(DOL, "0")
128+
field(OUT, "$(P)$(SM):timer$(N):busy CA")
129+
}
130+
131+
record(bo, "$(P)$(SM):timer$(N):doStop1") {
132+
field(FLNK, "$(P)$(SM):timer$(N):clearBusy")
133+
field(OMSL, "closed_loop")
134+
field(DOL, "0")
135+
field(OUT, "$(P)$(SM):timer$(N):doStop PP")
136+
}
137+
138+
#! Further lines contain data used by VisualDCT
139+
#! View(1032,139,0.9)
140+
#! Record("$(P)$(SM):timer$(N):secsPastEpoch",1360,442,0,0,"$(P)$(SM):timer$(N):secsPastEpoch")
141+
#! Field("$(P)$(SM):timer$(N):secsPastEpoch.VAL",16777215,1,"$(P)$(SM):timer$(N):secsPastEpoch.VAL")
142+
#! Record("$(P)$(SM):timer$(N):calcElapsed",1820,223,0,0,"$(P)$(SM):timer$(N):calcElapsed")
143+
#! Field("$(P)$(SM):timer$(N):calcElapsed.INPA",16777215,0,"$(P)$(SM):timer$(N):calcElapsed.INPA")
144+
#! Link("$(P)$(SM):timer$(N):calcElapsed.INPA","$(P)$(SM):timer$(N):secsPastEpoch.VAL")
145+
#! Field("$(P)$(SM):timer$(N):calcElapsed.OUTC",16777215,1,"$(P)$(SM):timer$(N):calcElapsed.OUTC")
146+
#! Link("$(P)$(SM):timer$(N):calcElapsed.OUTC","$(P)$(SM):timer$(N):elapsedSecs.VAL")
147+
#! Field("$(P)$(SM):timer$(N):calcElapsed.D",16777215,0,"$(P)$(SM):timer$(N):calcElapsed.D")
148+
#! Field("$(P)$(SM):timer$(N):calcElapsed.E",16777215,1,"$(P)$(SM):timer$(N):calcElapsed.E")
149+
#! Field("$(P)$(SM):timer$(N):calcElapsed.OUTF",16777215,1,"$(P)$(SM):timer$(N):calcElapsed.OUTF")
150+
#! Link("$(P)$(SM):timer$(N):calcElapsed.OUTF","$(P)$(SM):timer$(N):doneCalc.C")
151+
#! Field("$(P)$(SM):timer$(N):calcElapsed.OUTG",16777215,1,"$(P)$(SM):timer$(N):calcElapsed.OUTG")
152+
#! Link("$(P)$(SM):timer$(N):calcElapsed.OUTG","$(P)$(SM):timer$(N):remainingSecs.VAL")
153+
#! Record("$(P)$(SM):timer$(N):elapsedSecs",2140,433,0,1,"$(P)$(SM):timer$(N):elapsedSecs")
154+
#! Field("$(P)$(SM):timer$(N):elapsedSecs.VAL",16777215,0,"$(P)$(SM):timer$(N):elapsedSecs.VAL")
155+
#! Record("$(P)$(SM):timer$(N):Go",980,449,0,1,"$(P)$(SM):timer$(N):Go")
156+
#! Field("$(P)$(SM):timer$(N):Go.VAL",16777215,1,"$(P)$(SM):timer$(N):Go.VAL")
157+
#! Field("$(P)$(SM):timer$(N):Go.FLNK",16777215,1,"$(P)$(SM):timer$(N):Go.FLNK")
158+
#! Link("$(P)$(SM):timer$(N):Go.FLNK","$(P)$(SM):timer$(N):resetOnGo")
159+
#! Field("$(P)$(SM):timer$(N):Go.OUT",16777215,1,"$(P)$(SM):timer$(N):Go.OUT")
160+
#! Link("$(P)$(SM):timer$(N):Go.OUT","$(P)$(SM):timer$(N):Go/OUT")
161+
#! Connector("$(P)$(SM):timer$(N):Go/OUT","$(P)$(SM):timer$(N):setBusy.A",1200,770,16777215,"",0)
162+
#! Record("$(P)$(SM):timer$(N):currentTime",1820,404,0,0,"$(P)$(SM):timer$(N):currentTime")
163+
#! Visibility("$(P)$(SM):timer$(N):currentTime.SCAN",1)
164+
#! Record("$(P)$(SM):timer$(N):doneCalc",2140,447,0,1,"$(P)$(SM):timer$(N):doneCalc")
165+
#! Field("$(P)$(SM):timer$(N):doneCalc.INPA",16777215,0,"$(P)$(SM):timer$(N):doneCalc.INPA")
166+
#! Link("$(P)$(SM):timer$(N):doneCalc.INPA","$(P)$(SM):timer$(N):doneCalc/INPA")
167+
#! Field("$(P)$(SM):timer$(N):doneCalc.INPB",16777215,0,"$(P)$(SM):timer$(N):doneCalc.INPB")
168+
#! Link("$(P)$(SM):timer$(N):doneCalc.INPB","$(P)$(SM):timer$(N):doneCalc/INPB")
169+
#! Field("$(P)$(SM):timer$(N):doneCalc.C",16777215,0,"$(P)$(SM):timer$(N):doneCalc.C")
170+
#! Field("$(P)$(SM):timer$(N):doneCalc.OUT",16777215,1,"$(P)$(SM):timer$(N):doneCalc.OUT")
171+
#! Link("$(P)$(SM):timer$(N):doneCalc.OUT","$(P)$(SM):timer$(N):doStop1.VAL")
172+
#! Connector("$(P)$(SM):timer$(N):doneCalc/INPB","$(P)$(SM):timer$(N):doneCalc/INPB1",2060,835,16777215,"",0)
173+
#! Connector("$(P)$(SM):timer$(N):doneCalc/INPB1","$(P)$(SM):timer$(N):doneCalc/INPB2",1490,1040,16777215,"",0)
174+
#! Connector("$(P)$(SM):timer$(N):doneCalc/INPB2","$(P)$(SM):timer$(N):Go.VAL",920,805,16777215,"",0)
175+
#! Connector("$(P)$(SM):timer$(N):doneCalc/INPA","$(P)$(SM):timer$(N):calcElapsed.E",2040,620,16777215,"",0)
176+
#! Record("$(P)$(SM):timer$(N):preset",1360,724,0,1,"$(P)$(SM):timer$(N):preset")
177+
#! Field("$(P)$(SM):timer$(N):preset.OUT",16777215,1,"$(P)$(SM):timer$(N):preset.OUT")
178+
#! Link("$(P)$(SM):timer$(N):preset.OUT","$(P)$(SM):timer$(N):preset/OUT")
179+
#! Connector("$(P)$(SM):timer$(N):preset/OUT","$(P)$(SM):timer$(N):calcElapsed.E",1600,730,16777215,"",0)
180+
#! Record("$(P)$(SM):timer$(N):resetOnGo",1360,527,0,0,"$(P)$(SM):timer$(N):resetOnGo")
181+
#! Field("$(P)$(SM):timer$(N):resetOnGo.SDIS",16777215,0,"$(P)$(SM):timer$(N):resetOnGo.SDIS")
182+
#! Link("$(P)$(SM):timer$(N):resetOnGo.SDIS","$(P)$(SM):timer$(N):resetOnGo/SDIS")
183+
#! Field("$(P)$(SM):timer$(N):resetOnGo.OUT",16777215,1,"$(P)$(SM):timer$(N):resetOnGo.OUT")
184+
#! Link("$(P)$(SM):timer$(N):resetOnGo.OUT","$(P)$(SM):timer$(N):resetOnGo/OUT")
185+
#! Field("$(P)$(SM):timer$(N):resetOnGo.FLNK",16777215,1,"$(P)$(SM):timer$(N):resetOnGo.FLNK")
186+
#! Link("$(P)$(SM):timer$(N):resetOnGo.FLNK","$(P)$(SM):timer$(N):startTime")
187+
#! Connector("$(P)$(SM):timer$(N):resetOnGo/OUT","$(P)$(SM):timer$(N):calcElapsed.D",1580,660,16777215,"",0)
188+
#! Connector("$(P)$(SM):timer$(N):resetOnGo/SDIS","$(P)$(SM):timer$(N):Go.VAL",1220,630,16777215,"",0)
189+
#! Record("$(P)$(SM):timer$(N):startTime",1820,664,0,0,"$(P)$(SM):timer$(N):startTime")
190+
#! Record("$(P)$(SM):timer$(N):doStop",2660,558,0,1,"$(P)$(SM):timer$(N):doStop")
191+
#! Field("$(P)$(SM):timer$(N):doStop.VAL",16777215,0,"$(P)$(SM):timer$(N):doStop.VAL")
192+
#! Field("$(P)$(SM):timer$(N):doStop.OUT",16777215,1,"$(P)$(SM):timer$(N):doStop.OUT")
193+
#! Link("$(P)$(SM):timer$(N):doStop.OUT","$(P)$(SM):timer$(N):doStop/OUT")
194+
#! Connector("$(P)$(SM):timer$(N):doStop/OUT","$(P)$(SM):timer$(N):doStop/OUT1",2920,855,16777215,"",0)
195+
#! Connector("$(P)$(SM):timer$(N):doStop/OUT1","$(P)$(SM):timer$(N):doStop/OUT2",1920,1040,16777215,"",0)
196+
#! Connector("$(P)$(SM):timer$(N):doStop/OUT2","$(P)$(SM):timer$(N):Go.VAL",920,805,16777215,"",0)
197+
#! Visibility("$(P)$(SM):timer$(N):doStop.DESC",1)
198+
#! Record("$(P)$(SM):timer$(N):scanFanout",1540,378,0,0,"$(P)$(SM):timer$(N):scanFanout")
199+
#! Field("$(P)$(SM):timer$(N):scanFanout.LNK1",16777215,1,"$(P)$(SM):timer$(N):scanFanout.LNK1")
200+
#! Link("$(P)$(SM):timer$(N):scanFanout.LNK1","$(P)$(SM):timer$(N):currentTime")
201+
#! Field("$(P)$(SM):timer$(N):scanFanout.LNK2",16777215,1,"$(P)$(SM):timer$(N):scanFanout.LNK2")
202+
#! Link("$(P)$(SM):timer$(N):scanFanout.LNK2","$(P)$(SM):timer$(N):scanFanout/LNK2")
203+
#! Connector("$(P)$(SM):timer$(N):scanFanout/LNK2","$(P)$(SM):timer$(N):calcElapsed",1780,440,16777215,"",0)
204+
#! Record("$(P)$(SM):timer$(N):update",1280,309,0,1,"$(P)$(SM):timer$(N):update")
205+
#! Field("$(P)$(SM):timer$(N):update.FLNK",16777215,1,"$(P)$(SM):timer$(N):update.FLNK")
206+
#! Link("$(P)$(SM):timer$(N):update.FLNK","$(P)$(SM):timer$(N):scanFanout")
207+
#! Field("$(P)$(SM):timer$(N):update.SDIS",16777215,0,"$(P)$(SM):timer$(N):update.SDIS")
208+
#! Link("$(P)$(SM):timer$(N):update.SDIS","$(P)$(SM):timer$(N):scan/SDIS")
209+
#! Connector("$(P)$(SM):timer$(N):scan/SDIS","$(P)$(SM):timer$(N):Go.VAL",1220,510,16777215,"",0)
210+
#! Visibility("$(P)$(SM):timer$(N):update.SCAN",1)
211+
#! Record("$(P)$(SM):timer$(N):updateCurrent",1280,204,0,1,"$(P)$(SM):timer$(N):updateCurrent")
212+
#! Field("$(P)$(SM):timer$(N):updateCurrent.FLNK",16777215,1,"$(P)$(SM):timer$(N):updateCurrent.FLNK")
213+
#! Link("$(P)$(SM):timer$(N):updateCurrent.FLNK","$(P)$(SM):timer$(N):currentTime")
214+
#! Field("$(P)$(SM):timer$(N):updateCurrent.SDIS",16777215,0,"$(P)$(SM):timer$(N):updateCurrent.SDIS")
215+
#! Link("$(P)$(SM):timer$(N):updateCurrent.SDIS","$(P)$(SM):timer$(N):Go.VAL")
216+
#! Visibility("$(P)$(SM):timer$(N):updateCurrent.SCAN",1)
217+
#! Record("$(P)$(SM):timer$(N):remainingSecs",2140,713,0,1,"$(P)$(SM):timer$(N):remainingSecs")
218+
#! Field("$(P)$(SM):timer$(N):remainingSecs.VAL",16777215,0,"$(P)$(SM):timer$(N):remainingSecs.VAL")
219+
#! Record("$(P)$(SM):timer$(N):busy",1540,886,0,1,"$(P)$(SM):timer$(N):busy")
220+
#! Field("$(P)$(SM):timer$(N):busy.VAL",16777215,1,"$(P)$(SM):timer$(N):busy.VAL")
221+
#! Record("$(P)$(SM):timer$(N):setBusy",1260,824,0,1,"$(P)$(SM):timer$(N):setBusy")
222+
#! Field("$(P)$(SM):timer$(N):setBusy.A",16777215,0,"$(P)$(SM):timer$(N):setBusy.A")
223+
#! Field("$(P)$(SM):timer$(N):setBusy.OUT",16777215,1,"$(P)$(SM):timer$(N):setBusy.OUT")
224+
#! Link("$(P)$(SM):timer$(N):setBusy.OUT","$(P)$(SM):timer$(N):busy.VAL")
225+
#! Record("$(P)$(SM):timer$(N):clearBusy",2400,724,0,0,"$(P)$(SM):timer$(N):clearBusy")
226+
#! Field("$(P)$(SM):timer$(N):clearBusy.OUT",16777215,1,"$(P)$(SM):timer$(N):clearBusy.OUT")
227+
#! Link("$(P)$(SM):timer$(N):clearBusy.OUT","$(P)$(SM):timer$(N):clearBusy/OUT")
228+
#! Connector("$(P)$(SM):timer$(N):clearBusy/OUT","$(P)$(SM):timer$(N):busy.VAL",2660,890,16777215,"",0)
229+
#! Record("$(P)$(SM):timer$(N):doStop1",2400,529,0,1,"$(P)$(SM):timer$(N):doStop1")
230+
#! Field("$(P)$(SM):timer$(N):doStop1.OUT",16777215,1,"$(P)$(SM):timer$(N):doStop1.OUT")
231+
#! Link("$(P)$(SM):timer$(N):doStop1.OUT","$(P)$(SM):timer$(N):doStop.VAL")
232+
#! Field("$(P)$(SM):timer$(N):doStop1.VAL",16777215,0,"$(P)$(SM):timer$(N):doStop1.VAL")
233+
#! Field("$(P)$(SM):timer$(N):doStop1.FLNK",16777215,1,"$(P)$(SM):timer$(N):doStop1.FLNK")
234+
#! Link("$(P)$(SM):timer$(N):doStop1.FLNK","$(P)$(SM):timer$(N):doStop1/FLNK")
235+
#! Connector("$(P)$(SM):timer$(N):doStop1/FLNK","$(P)$(SM):timer$(N):doStop1/FLNK1",2620,705,16777215,"",0)
236+
#! Connector("$(P)$(SM):timer$(N):doStop1/FLNK1","$(P)$(SM):timer$(N):doStop1/FLNK2",2490,720,16777215,"",0)
237+
#! Connector("$(P)$(SM):timer$(N):doStop1/FLNK2","$(P)$(SM):timer$(N):clearBusy",2360,746,16777215,"",0)

sMailApp/Db/streamMail.db

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
################################################################################
2+
#
3+
# Simple test of stream to mail notifications
4+
#
5+
################################################################################
6+
7+
record(stringout, "$(P)$(SM):message") {
8+
field(DTYP, "stream")
9+
# field(OUT, "@streamMail.proto send($(MSERVER),$(FROM),$(TO)) $(MPORT)")
10+
field(OUT, "@streamMail.proto send($(MSERVER),$(P)$(SM):,addrFrom,addrTo) $(MPORT)")
11+
field(SCAN, "Passive")
12+
}
13+
14+
record(stringout, "$(P)$(SM):addrTo") {
15+
field(DTYP, "Soft Channel")
16+
field(SCAN, "Passive")
17+
field(VAL, "$(TO)")
18+
}
19+
20+
record(stringout, "$(P)$(SM):addrFrom") {
21+
field(DTYP, "Soft Channel")
22+
field(SCAN, "Passive")
23+
field(VAL, "$(FROM)")
24+
}

sMailApp/Db/streamMail.proto

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
Terminator = CR LF;
2+
ExtraInput = Ignore;
3+
ReplyTimeout = 1000;
4+
5+
@mismatch { out "QUIT"; disconnect; }
6+
7+
mail_start {
8+
connect 10000;
9+
in "220";
10+
out "HELO \$1";
11+
in "250";
12+
out "MAIL FROM:%(\$2\$3)s";
13+
in "250";
14+
out "RCPT TO:%(\$2\$4)s";
15+
in "250";
16+
out "DATA";
17+
in "354";
18+
out "From: %(\$2\$3)s";
19+
out "To: %(\$2\$4)s";
20+
out "Subject: Report from %(\$2\$3)s";
21+
out "";
22+
@mismatch {in "%(\$2\$5)s";}
23+
}
24+
25+
mail_end {
26+
out ".";
27+
in "250";
28+
out "QUIT";
29+
disconnect;
30+
}
31+
32+
send {
33+
mail_start;
34+
out "You've been notified because: \n\r %s";
35+
mail_end;
36+
}

sMailApp/Db/streamMail.substitutions

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
file "$(SMAIL)/sMailApp/Db/mail_timer.db"
2+
{
3+
pattern
4+
{P, N, TFLNK }
5+
{"$(PREFIX)", 1, "$(PREFIX)$(SM):reEnable$(N)" }
6+
{"$(PREFIX)", 2, "$(PREFIX)$(SM):reEnable$(N)" }
7+
{"$(PREFIX)", 3, "$(PREFIX)$(SM):reEnable$(N)" }
8+
{"$(PREFIX)", 4, "$(PREFIX)$(SM):reEnable$(N)" }
9+
{"$(PREFIX)", 5, "$(PREFIX)$(SM):reEnable$(N)" }
10+
{"$(PREFIX)", 6, "$(PREFIX)$(SM):reEnable$(N)" }
11+
{"$(PREFIX)", 7, "$(PREFIX)$(SM):reEnable$(N)" }
12+
{"$(PREFIX)", 8, "$(PREFIX)$(SM):reEnable$(N)" }
13+
{"$(PREFIX)", 9, "$(PREFIX)$(SM):reEnable$(N)" }
14+
{"$(PREFIX)", 10, "$(PREFIX)$(SM):reEnable$(N)" }
15+
}
16+
17+
file "$(SMAIL)/sMailApp/Db/streamMail_notifiers.db"
18+
{
19+
pattern
20+
{P, N }
21+
{"$(PREFIX)", 1 }
22+
{"$(PREFIX)", 2 }
23+
{"$(PREFIX)", 3 }
24+
{"$(PREFIX)", 4 }
25+
{"$(PREFIX)", 5 }
26+
{"$(PREFIX)", 6 }
27+
{"$(PREFIX)", 7 }
28+
{"$(PREFIX)", 8 }
29+
{"$(PREFIX)", 9 }
30+
{"$(PREFIX)", 10 }
31+
}
32+

0 commit comments

Comments
 (0)