ipsmtp This feeds and receives from Internet Mail. Use it to send to an SMTP server (local or remote) and receive either on a local 'sendmail' server (Unix only) or from a POP3 server. We define OUTGOING as FIP -> SMTP and the reverse (SMTP or POP3 -> FIP) INCOMING. (use program 'smtpwire' to receive incoming SMTP traffic or 'imapwire' to grab from an IMAP server) Routing Files Outbound ---------------------- Messages for sending are put in the input queue, usually spool/2smtp, with the FipHdr field DA containing one or more Mail Address (separated by commas if multiple) - such as wizzo@fingerpost.co.uk. Messages can be sent directly to the spool/2smtp queue, routed normally by Fip or as a group client for Syndication by IPPOST. In the latter case, the client is specified as type:unixmail and there is a special DU called TOUNIXMAIL in USERS which has the syntax : TOUNIXMAIL= DP:(hostname) DQ:2smtp DC:(whatever) where hostname is the name of the UnixBox doing the transfer and whatever is the character set required. The From field or sender is the header field SU or, if it exists, the SA (Source Author) which is formatted as SA@SU. SU is normally the Source system or type while SA is the normally the logon or sender. If the SA is an Atex style 'LOGON ;dd/mm,hh/nn' then only the logon is used. So if the SA:fippo and SU:liverpool-fc.co.uk, the sender becomes fippo@liverpool-fc.co.uk If the SA is ALWAYS the full address - like SA:hedgehog@flea-pit.com, then use the '-F' input switch to NOT add the SU header field. If neither SU nor SA exist, the default sender is 'fip' unless overridden by the 'defsender:' in the parameter file. Note that this name must be in the passwd file as a valid logon. The data of the outgoing messages will be converted if 8 bit or control chrs to the normal '=XX' hex format used. Routing Files Inbound --------------------- Messages from the Internet are sent to the special DU, FIPMSG which is either hardcoded to a specific destination, or more usually, directed to IPPOST to detetmine if the recepient is on the editorial system OR is a mailbox (IPBOX) customer. Testing ------- If things do NOT look like they are working, you can run ipsmtp/ipsmtpssl manually with the -1 and -D to run once and display the handshake. Parameter File -------------- The parameter file, normally tables/mail/SMTP, is read for the logon names to scan on a regular basis plus the destination to send these to. The syntax of the parameter file is : ; comment defsender: (default sender) default: fip Used ONLY if there is NO fipHdr field SU nor SA. This is used for the 'From:' field for outgoing messages. forcesender: (Force sender to this logon) default: no force-sender: (Force sender to this logon) default: no default-sender: (Force sender to this logon) default: no This is the default reply-to address. It must be a valid logon and domain. It is also used for the 'From:' field for ALL outgoing messages if there is NO 'forcefrom' (see below) or FipHdr field 'DJ' in the file to send irrespective of whether there is a FipHdr SA or SU. default-sender is used ONLY if there is no force-sender and nothing in DJ It should be JUST the address : forcesender: lucy@sky-with-diamonds.com forcefrom: (Force the From field) force-from: (Force the From field) This is the From field in the outgoing file which does not have to be the same as the sender's address. If using the '-h' host input switch it can contain a 'pretty' version : eg forcefrom: "MP3 king Steinhoff" <dohrayme@singalong.com> defdest: (default Fip Destination (DU FipHdr field) default: FIPMSG helo-host: (hostname.domain) ehlo-host: (hostname.domain) Use this name for the HELO or EHLO (hostname) message to the remote (SMTP outbound) who normally want a full hostname-domanme which is in DNS so they can verify it. default is just the hostname eg ehlo-host:mail.hashtagnotme.com This field can be FipSeq - a temporary FipHdr field S1:(hostname) Of course S1 is dependent on the correct hostname being setup on that server ! add-return-path: (FipSeq for address) Add a 'Return-Path: (address)' to the outgoing SMTP mime header default: no eg combie:QR SA,sweetsounds@cacophony.com add-return-path:\QR chrset: (Source character set ie SC header field) default: ascii hash-in-address: (FipSeq Chr) Some old-style email addresses have a leading hash/pound/# sign - but a hash is a field sepearator in FipHdr. So another chr is used in the DA FipHdr and mapped at the last moment. default is \243 hash-in-fiphdr: (FipSeq Chr) Sometimes a Subject line might have a hash/pound/# sign - but a hash is a field sepearator in FipHdr. So another chr is used in the DA FipHdr and mapped at the last moment. default is '#' (ie a hash is a hash and that is where the FipHdr field ends !) eg in tables/route file, map a HASH out of the way : HASH-IN-HDR:\035 in the ipsmtp parameter file, to map back : hash-in-fiphdr:\035 fiphdr-remote-address: (2 letter FH) newDA: (2 letter FH) FipHdr field to replace the DA field which default: DA holds the email address of the person to sent to. eg newDA:DZ This can also be an combination field : combie:QA DA|DZ|NA newDA:QA fiphdr-local-address: (2 letter FH) newSA: (2 letter FH) FipHdr field to replace the 'MAIL from' address field. default: SA fiphdr-subject: (2 letter FH) newDI: (2 letter FH) FipHdr field to replace the DI field which is used for the 'Subject' field. default: DI fiphdr-from: (2 letter FH) newDJ: (2 letter FH) FipHdr field to replace the DJ field which is used for the 'From' field. default: DJ fiphdr-reply-to: (2 letter FH) FipHdr field which is used for the 'Reply-to' field. default: none and From: is used balance-seqno: Send the Sequence number to this Balance Group (see 'ipbalan') balance-delete: Delete the Data on remote systems once sent using this Balance Group (see 'ipbalan') forcedomain: (domain name) default: do not Strip any domain in the FipHdr field SA and add this one in its place. forcedomain:commies.com So if the SA:albert@redsunderthebed.com, then the from field becomes From: albert@commies.com strip-domain-on-send: Send only the logon/mail name default: domain too and strip any domain name. defsubject: (default Subject line if nothing specified) default: "Message for you" att-message: Message to replace an attachment with. default:** Attachment has been Stripped, pls contact System Managers for (name of attachment file) log-line: (FipSeq) Additional information for the log file entry in ALL extra-log-fiphdr: Fipseq FipHdr fields to add to any transmission log This is triggered on a file by file basis by the FipHdr field ZSMTP_LOG:(dest) in the file to send - (dest) being a valid DU in tables/sys/USERS. Use this to pass FipHdr fields from the incoming file to the outgoing default: none eg. extra-log-fiphdr:\n\SI:\SI\n send-new-fiphdr: Fipseq FipHdr fields to add to any outgoing file to act as defaults etc send-extra-fiphdr: Fipseq FipHdr fields to add to any outgoing file to act as defaults etc The NEW variant is added BEFORE the real FipHdr, so can be used for Defaults (and the real FipHdr fields can override these). The EXTRA variant will add at the end of the file's FipHdr and so will override any setting, This is triggered on a file by file basis by the FipHdr field default: none eg. send-extra-fiphdr:\nZSMTP_TYPE:text/plain\n stream-connections:yes default: no Do NOT drop the connection/reconnect for every file. Once a connection is up to a mailserver, any subsequent file for the same server is sent in the same transmission. (using SMTP only) keepalive-every: 50 default: 30 secs Streaming only - Min time in secs between keep-alive (CRNL) offline-queue:(FipSeq) default: none Offline queue if item errors (same as and overwrites -x input switch) ipsmtp will NOT scan the offline queue - the assumption is that another ipsmtp will be polling that folder. fiphdr: (Map incoming mail field to a Fip Hdr field) default: none fiphdr:DI Subject fiphdr:AZ Message-Id ignore: (Mail header field to always ignore) default: none ignore: Status ignore: Apparently-To ignore: X-Msmail-Priority decode: unencode: Decode any base64 sections. default: no decode: This will NOT decode attachments decode:text This will NOT decode attachments decode:all This will decode body AND attachments maxattempts: (no of attempts before the file is sent to woops) default: 10 This checks the FipHdr 'DO' which is managed internally. (UNIX only) logeachfile:(dest) Send a Success/failed msg to this destination for each file. There is no default. This log file is just a FipHdr with the following extra fields : DR-File Sent OK DR:ok or DR:error DG-Will Retry later DG:retrying or DG:stopped DT-Some message text DT:No connection DO-Number of last attempt DO:5 HT-Date and Time HT:25 Nov 98 15:35:25 default: no log created. The DR and DG messages can be changed by using : log-dr-ok:(FipSeq) log-dr-error:(FipSeq) log-dg-stop:(FipSeq) log-dg-retry:(FipSeq) eg: log-dr-ok:File \VN sent to Remote Number \DA (\$h:\$n) msgeachfile:(FipSeq) Additional information to add to the FipHdr of the 'logeachfile' msg. This should be in FipHdr format and be in FipSeq. It can be used to pass FipHdr fields in the outgoing file into the log file. eg msgeachfile: DF:logdial\nSS:\SS\n default: nothing added send-via-smtp-relay: (yes/no) For SMTP outgoing files : YES - send everything to a single SMTP Relay host (default) NO - send each file to the mailhost of the recipient (Same as the -X input switch) local-domain: (domain name) (space) (IP address of local mail server) For SMTP outgoing NOT sending via a reply There can be up to 10 local-domains local-domain-queue: (queue in spool) local-domain-name: (filename in FipSeq) For any match to local-domain eg local-domain:217.138.58.67 local-domain-queue:2go ; a single DA is added at the start; add XX:\$u.\$z.\$v for uniqueness local-domain-name:#DU:inhouseEmail#SA:robbodot@fingerpost.co.uk#SN:\SN#XX:\$u.\$z.\$v default-smtp-host: (hostname or IPaddress) For sending emails out - Same as the '-h' Input Switch alternate-smtp-host: (hostname or IPaddress) a failover hostname for if the default fails connection-timeout: (secs) Max time in seconds for the connection to the SMTP server The call is aborted if it takes longer than this. If the remote is across the computer room, this time can be reduced to 15 or 20 secs; if over the internet, 120 secs is the norm. default: 120 for 120 seconds, minimum is 10 send-single-smtp: send smtp in one file per session which is then cut and reopened for the next file/session. hostname: (hostname to use) Cosmetic ! port: (port number of the remote) This overwrites the -P input switch timing-stats: yes/no Show timing stats if the incoming file has the HE/HR fiphdr default: no use-sx: or use-external-file: if there is an SX FipHdr field with a path to the data file, use that rather than the data in the input file. wrap-subject-chr: (FipSeq chr) If the Subject field has this chr, wrap the line default: none This might have been added by ipxchg : z:convert-fiphdr-to-qp:DI:DJ:utf-8:\002 wrap-subject-chr:\002 force-subject-wrap: (No of chrs) Normally subject lines at this total default: 76 eg force-subject-wrap:76 locale: use a different 'locale' ( look at the man pages for locale) Most computers are set to US English and never changed. Use this parameter to customise any date/time or Chr translations The parameter MUST be a valid locale on your system! To find out what valid locale exist, type 'locale -a' on unix. Eg ; Set for for Brazil, portugese locale:pt_BR check-primary-server: pseudo-host name that is specified in tables/sys/DEST_REDUN Use this when for POP3 accesses ONLY where ipsmtp on 2 systems is accessing the same POP3 account(s) in a redundant way. It is used to decide whether the current host should be getting the files or not. ie in the parameter file is check-primary-server:timersvr and in the DEST_REDUN is ; psuedohost primary secondary timersvr fip1 fip2 and in the SYSTEM file for both fip1 AND fip2 there is the same 'ipsmtp' line with the same parameter file If fip1 is up, 'ipsmtp' on fip1 will always get while on fip2 it will just check/loop. If fip1 is down 'ipsmtp' on fip2 will start processing the files. use-tls:yes/implicit/explicit/no The commends are for a ftp running over SSL/TLS on the remote server default is NO no - normal, standard SMTP on (normally) port 25 yes or explicit - connect (normally) on port 465 in clear then send STARTTLS and SSL for AUTH implicit - connect (normally) on port 587: use SSL for all conversations tls-auth: (XXX) AUTH type for TLS/SSL default: TLS auth-login: (data) auth-pwd: (pwd) login and password for TLS AUTH LOGIN authentication auth-plain: (string) login and password for TLS AUTH PLAIN authentication To generate the auth-plain string : printf "(logon)\0(logon)\0(password)" | sffb64 -i ssl-method: (1,2,3,23,999) Version number to use for TLS/SSL default: 999 for current default (2 or 3) ssl-password: (password) ssl-passwd: (password) default: none Optional password if the handshake requires a shared secret ssl-pem: (name of a PEM certificate file) default: none ssl-cert: (name of a PEM certificate file) default: none ssl-root-cert: (name of a root PEM certificate file) defaunt: none Optional certificates - held in tables/ssl ssl-verify: yes/no verify certificates default: yes ssl-ciphers: (list) acceptable ciphers (use 'openssl ciphers' to list) default: "HIGH:!aNULL:!kRSA:!SRP:!PSK:!CAMELLIA:!RC4:!MD5:!DSS" (from 16v25) -- For HTTP proxies : proxy-connect: (FipSeq) Proxy Connect (or Wakeup) string for network device default: none This wakes up the pad on startup or Connects via a proxy proxy-host: (hostname) proxy-port: (port) These are ONLY used for the TLS hostname checking as the name may be different to the connection IPaddress proxy-is-squid: (yes/no) - placeholders proxy-handshake: (yes/no) - placeholders -- For Socks 4/5 proxies : use-sock: (4 or 5) socks-host: (hostname of the socks proxy) no default socks-port: (port number of the socks proxy) default: 1080 socks-user: (user name for the socks proxy) no default if nothing specified, assumed that there is none socks-pwd: (password for the socks proxy) no default -- For accessing Oauth protected assets use-oauth:yes/no Use OAUTH to grab/use an access-token or Bearer token eg for Gmail access default is NO oauth-refresh-script: (Script in FipSeq) script to generate the access_token using a refresh_token These 5 FipHdrs are use to generate, check, add/renew permissions to access the remote data - normally Gmail. oauth-client-fiphdr: (FipHdr) default: IC oauth-secret-fiphdr: (FipHdr) default: IS oauth-access-fiphdr: (FipHdr) default: IA oauth-refresh-fiphdr: (FipHdr) default: IR oauth-expiry-fiphdr: (FipHdr) default: IX -- Then for EACH logon you wish to track INCOMING Sendmail mail boxes, specify a line begining : logon: (logon name) default: none or unix: (unixlogonname) default: none These two parameters are identical. There is also a means, for UnixBoxes only, to poll for ALL mail for ALL the members of a group (as in the /etc/group file) : group: (unixgroupname) default: none Whether 'logon', 'unix' or 'group' there are other (optional) parameters: sendto:(newaddress) fiphdr:(FIP hdr sequence) striphdr: keephdr: pop3pwd: (Password for POP3) where sendto: allows you to specify another name for the DA field IPPOST will use this to route. By default, the Fip Hdr field DA will hold the logon name. fiphdr: allows you to add to the FIP hdr. This may be any - perhaps the DU field to change the destination. striphdr: will strip the SendMail header except for the From and Subject lines pop3pwd: specifies the password to use IF you are accessing a POP3 server to receive incoming mail. It is NOT required for UnixBoxes scanning local mail queues. -- To add a new logon : 1. Read the 'passwd' file for the exact Unixlogon name - eg newboy 2. Enter this name in SMTP file as : logon:newboy 3. If this is the same name as in file ATXMSG, enter line newboy edone where edone is the name of your editorial system 4. If 'newboy' is really called 'dirtyoldman' on the 'atex' editorial system, the entries should be: SMTP file - logon:newboy sendto:dirtyoldman ATXMSG file - dirtyoldman atex -- To setup IPSMTP for Sendmail mailboxes : 1. Create logons as above 2. Check you have destinations in the USERS file : FIPMSG= DP:fipmain DQ:post DC:atexeol MSGFORATX_EDSYS= DP:edsys3 DQ:atexq-grp DC:atexeol where 'fipmain' is the name of this UnixBox. Destination FIPMSG is generated by IPSMTP. Destination MSGFORATX_* is generated by IPPOST IF the name is in the FIPMSG file. eg if the Editorial System is called ATEX (environment variable FIP_EDSYS) and teh queue required is email-wir on system3 : MSGFORATX_ATEX= DP:atex3 DQ:email-wir DC:atexeol 3. Input Queue spool/2smtp needs to be added 4. IPPOST needs to be running too (unless you change the FIPMSG DP/DQ to somewhere else) 5. Outbound Format is ATXMSG for IPGTWY/IPOUT/IP2WTR etc. Please check if this exists and has the correct setup The current version can scan up to 1000 Unixmail boxes. -- Where sections of FipHdr fields are required or changes to the output style, use keywords : fixed, partial, combie, optional, repeat, newdate and/or style. (see The SysA dmin manual for more information). They are normally specified : fixed:QZ 1234543 partial:QT ST,3,2,U,<,> combie:QY ep|na,(0000000)a option:QE ep,11,7,s repeat:QK XK,-,3 or repeat:QP PK,,4,#X style:QS XN,%.03d replace:QN NN abc=DEF def=GHI -- For outbound traffic, FipHdr fields used are : Mandatory DA holds one or more remote email addresses multiple addresses are separated by a comma. Can be overridden by 'newDA' Can be changed by 'forcedomain' Optional SA holds the sender's email address can be overridden by 'forcesender' (actual address) can be overridden by 'forcesender' (from field) can be defaulted by 'defsender' DI holds the Subject: field DJ holds the From: field ZSMTP_BINARY if not 'no' will send the file as Binary and make NO attempt to change the length ZSMTP_ENCODE holds the Content-Transfer-Encoding default to Content-Transfer-Encoding:quoted-printable ZSMTP_TYPE holds the Content-Type. no default ZSMTP_LOG will send a log of the SMTP transmission to this destination (for SMTP outbound traffic using the '-h' input switch only) ZSMTP_HOST IPaddress or hostname of the mail server if NOT the default (for SMTP only). ZSMTP_ADDMIME if not 'no', add standard MimeHeaders to the top of the file (default is YES, unless -H is set for NO) ZSMTP_CHECKMIME if not 'no', check the MimeHeaders (overrides check-mime-header:yes/no) Input Switches -------------- Input parameters are : all optional : -1 : SMTP - (filename) Send a single file by SMTP and stop default: spool SMTP so -Q or -p or -3 MUST NOT be set -1 : POP3 - Get once only then stop for POP3 or Receive only. default: spool Either -p (path) or -3 (pop3 server) must be used with this option This also incorporates -Q so no queue is scanned and no mail sent. POP3 so -Q plus either -p or -3 MUST be set -2 : SMTP - (filename) Send a single file by SMTP and stop default: spool -3 : POP3 - Hostname where the pop3 daemon is running. default: none Note -p and -3 are mutually exclusive. -a : queue for non-text attachments default: none default is that attachments are passed through in text -A : destination for non-text attachments default: none default is that attachments are passed through in text -C : do NOT convert unprintables to "=XX" format default: do -d : do NOT delete each unix msg default: delete -D : display the conversation with the remote server default: no valid ONLY with the -2 or -1 for single shot; used for debugging troublesome connections -e : extra FipHdr/FipSeq which will be added for each outgoing file. default: none -f : do NOT output the original filename as the first line of text. default: output name -F : do NOT output the original sending system (SU) as the From field. default: From: SU -h : Hostname where the smtp daemon is running. default: that system NOTE that sendDirect can be seelcted by either -X or -h+ -H : do NOT add an extra Mime Headers as the file is in the correct format. default: add To/From/Subject -i : Receive spooled queue if you are using 'sffmail' default: using Path -k : alternate host name default: none use this for checking primary/secondary for clustered systems where the actual hostname differs from the cluster name ie if the host name may be fipcluster-a or fipcluster-b but there is a cluster hostname of fipcluster -K : quiet mode - message if NOT the primary system default: do not message -l : do NOT log each msg in or out default: log -m : (ipchkmail folder name) default: process inside ipsmtp Do not convert incoming SMTP and POP3 files immediately but pass them to ipchkmail running on this folder which does a better job! especially for attachments-within-attachments -o : Next fip queue for incoming files default: spool/2go -O : Done queue for spooled files out default: none -p : Path on this system holding mailboxes default: depends on the OS Unix only. The full pathname MUST be stated. Note -p and -3 are mutually exclusive. -P : port of remote host default: 25 Note normal usage is -P 465 if using 'use-tls:implicit', or -P 587 for 'use-tls:explicit' Also note that parameter 'port:' will override this value -q : Send Queue to spool default: spool/2smtp -Q : Do NOT send any mail and therefore do NOT scan any input queue. default: scan -r : eolns for the data part should be CR NL default: just NL -R : do NOT resolve hostnames default: do resolve This will resolve any hostnames in the DEST_REDUN file (if there is one) -S : do NOT split files on the "From ..." line default: do split -t : scan time of queue default: 3 secs -T : log the trace of each transaction default: do not log Normally a one line log of each file sent is stored in log/remote_trace with a name of 'date_Address'. -w : for file->Sendmail, set line length. default: 76 + translate and do NOT translate unprintables to "=XX" format To NOT wrap text and no translations -w 0 This can be ignored for a single file if it has the FipHdr field ZSMTP_BINARY: -W : for files outbound, set JUST the line length default: 76 + translate but still translate unprintables. -x : Offline queue default: none Normally ipsmtp will retry - and possible delay files also queued up - any message that has not been delivered. Use this to shuffle files that error to a different folder where another ipsmtp will take care of the baduns -X : Send directly to the Email server of each destination default: no, use a single relay server This depends on the resolv.conf or Windows DNS to be setup correctly of course. NOTE that sendDirect can be seelcted by either -X or -h+ -z : parameter file default: mail/SMTP -v : display version number and exit. Now a statement of sanity (?) about incoming mail from the Internet : If like most of the civilised world you prefer to keep well away from anything 'sendmail' can throw at you, then let ipsmtp just grab its files from the sendmail internal queue. Or even better use POP3 and forget about it all - no setup, no nothing extra! If you are unlucky enough to have a Sendmail specialist on your staff, before sending for the men in white coats, point out there is a '-p path for unix mailboxes' switch. Your guru should dictate (they always dictate - though they claim they are working with your best interests in mind) where he is willing to drop files for those logons you are interested in and add the -p switch to the tables/sys/SYSTEM file. Easy huh ! Note there was a subtle change at version 15 which changed the default from ATXMSG to FIPMSG. Version Control ;16v56 9nov01 cleanup after failed connections better ;a 16mar02 added remote_trace and -O done queue ;b-c 03jun03 cleanup line-enders in mimehdr and streaming for smtp and added ZSMTP_HOST ;d-i 22sep03 added send-extra-fiphdr: and stream-connections:yes ;j-l 29jun04 added -1 and speedy ;m-p 17sep05 added alternate-smtp-host and hostname: and log-line ;q 10aug06 added remote_trace style timings to send file done msg as H4 ;r-t 21sep06 allow quotes in email address and wrap long subject lines ;u 13apr07 added extra-mime-headers: ;v12 06feb08 added hash-in-address ;2 modette for size of email list ;3-4 added check-primary-host for POP3 and chkmail-folder: ;5-6 bugette with send_smtp and logging long DA ;7 3sep10 added use-sx ;8-9 10nov10 bug in pop3 when Uidl has non-alnum ;10-11 19may11 bugette when TLS does not work and b64 '=' padding ;12 22aug13 added POP3 error message on logon/pwd and added -1 for display ;13-14 30sep13 added hash-in-fiphdr ;15 30apr14 file-trace ;16 7oct14 if -H and not -C, do not encode any mime headers in the data ;17-18 26jun15 make donque variable ;19-22 25jul16 tuning and buffersizes and better error messages ;23-24 3oct17 AUTH PLAIN and AUTH LOGIN now work with new params auth-login, auth-plain, auth-pwd ;25-26 3nov18 redid SSL for new defaults for ciphers and certs plus done-queue as a parameter ;27 18dec18 auth-logon/pwd are now parsable plus added -e (extraFH) ;28-29 tuning maxFipHdr -> limit and maxTO->998 ;30-31 26feb19 senddirect tuned ;32-33 added ssl-display ;34-42 redid direct and added ZSMTP_ADDMIME fiphdr and ZSMTP_CHKMIME fiphdr ;43 added local-domain* ;44-46 11dec19 added S1:(host) and socks-proxy better ;47 WINNT buglette strftime and locale ;48 14dec20 nicer error checking for streaming and added keepalive-every ;49 18aug21 minor for s_PIPE plus fiphdr-* and Reply-to: fields ;50 11mar22 added Oauth2 for Gmail ;51-52 29may23 thru socks timeout ;53 10sep23 added MSoauth2 ;54 22jul24 allow weird chrs in TO as per rfc2822 / see 3.2.1. Primitive Tokens and 3.2.4. Atom ;55-56 30oct24 force-sender default-sender can be in FipSeq ; 56 added BIO (copyright) 2024 and previous years FingerPost Ltd.