REBOL [ Title: "Check POP mail" Date: 21-Aug-2002 Name: POP-check Version: 1.0.0 File: %POPCHECK.R Home: http://www.ci.bloomington.mn.us Author: "Steven White" Owner: "City of Bloomington MN" Rights: "Copyright (C) City of Bloomington 2002" Tabs: 4 Purpose: {Checks email messages in a POP account and reports relevant information to another email address. } Comment: "^/ " History: [ ] Language: English Email: swhite@ci.bloomington.mn.us Category: [email] Need: 2.3 Example: "do popcheck.r or run from a script" ] ; [------------------------------------------------------------------] ; [ The following items customize this script for its actual user. ] ; [ Change them to match your own mail server, user name, ] ; [ password, and so on. ] ; [ ] ; [ MY-POP-USERID This is the user name you picked when setting ] ; [ up the account with the ISP. This should be ] ; [ a string, that is, in double quotes. ] ; [ MY-POP-PASSWORD This is the password you selected when setting ] ; [ up the email account. This should be a string.] ; [ MY-POP-SERVER Your ISP has a server (computer) that handles ] ; [ email going out, and that computer has a name. ] ; [ You will have to call them and ask them what ] ; [ the name is. Enter it here as a string ] ; [ because later on we will assemble it into a ] ; [ full internet URL. ] ; [ MY-NOTIFY-ADDRESS This is an email address to which this script ] ; [ will send a report of its findings. ] ; [ Enter this as an email address (not a string). ] ; [ MY-FRIENDS-LIST This is a block of email addresses. The ] ; [ script will check the from-addresses on the ] ; [ emails that it scans to see if they are ] ; [ addresses in this block. If they are, then ] ; [ those messages will be counted as personal ] ; [ messages. ] ; [ ] ; [ NOTE: The data items below are junk put in to illustrate how ] ; [ to use this script. You will have to replace what you see ] ; [ below with real data or the script will not work. ] ; [ This should be the ONLY area that you will have to modify. ] ; [------------------------------------------------------------------] MY-POP-USERID: "myuserid" MY-POP-PASSWORD: "mypassword" MY-POP-SERVER: "pop.my-isp.net" MY-NOTIFY-ADDRESS: myname@myoffice.com MY-FRIENDS-LIST: [friend1@isp1.com friend2@isp2.com ] ; [------------------------------------------------------------------] ; [ These are some items we will want to make a note of early in ] ; [ the program and refer to again later in the program. ] ; [ Data items in REBOL are self-defining, that is, you don't have ] ; [ to declare them in advance of using them as you do in other ] ; [ programming languages. However, you may declare them in some ] ; [ way, such as by setting them to some initial values, if you ] ; [ want to. Some people who are used to the requirement of ] ; [ declaring variables are comforted by having all variables ] ; [ laid out beforehand. ] ; [ ] ; [ TOTAL-MESSAGE-COUNT As we scan the messages on the POP ] ; [ server, we will count them all. This is ] ; [ as much a debugging tool as useful data. ] ; [ PERSONAL-MESSAGE-COUNT Messages with a "from" field matching ] ; [ a known personal address will be counted ] ; [ in this word as personal messages. ] ; [------------------------------------------------------------------] TOTAL-MESSAGE-COUNT: 0 PERSONAL-MESSAGE-COUNT: 0 ; [------------------------------------------------------------------] ; [ Print a beginning-of-job message to reassure that we ] ; [ are running. We will clear the screen first as a ] ; [ cosmetic touch. ] ; [ The "prin" command is the same as "print" but does not return ] ; [ the cursor to the next line. ] ; [ The ^ is used to indicate a special control character. ] ; [ The (page) indicates the control character that causes, ] ; [ on this particular computer (meaning the computer on which ] ; [ you are running the script), the screen to get blanked. ] ; [------------------------------------------------------------------] prin "^(page)" print ["Checking email from" MY-POP-SERVER] ; [------------------------------------------------------------------] ; [ Assemble this particular script's user ID, password, and POP ] ; [ server name into a full URL so we can read email. ] ; [ We use the "join" command to concatenate together a bunch of ] ; [ strings that will read like a URL, but then to make that ] ; [ concatenated bunch of strings into a URL in whatever internal ] ; [ format REBOL keeps URL's, we have to apply the "to-url" ] ; [ function to that string. ] ; [------------------------------------------------------------------] POP-URL-STRING: join "pop://" [MY-POP-USERID ":" MY-POP-PASSWORD "@" MY-POP-SERVER] POP-URL: to-url POP-URL-STRING ; [------------------------------------------------------------------] ; [ Get all email messages from our POP server and ] ; [ store them in a block of strings, with each string ] ; [ being one email message. ] ; [ Print the number of messages to indicate we are done. ] ; [------------------------------------------------------------------] ALL-MAIL: read POP-URL TOTAL-MESSAGE-COUNT: length? ALL-MAIL print [TOTAL-MESSAGE-COUNT "messages from" MY-POP-SERVER] ; [------------------------------------------------------------------] ; [ Make another block which will contain ] ; [ all the scanned messages decoded into a recognizable ] ; [ form. ] ; [------------------------------------------------------------------] SCANNED-MESSAGES: [] ; [------------------------------------------------------------------] ; [ Go through the block of mail and decode each message ] ; [ into a block of scanned messages. ] ; [ As we append messages to the SCANNED-MESSAGES block, the size ] ; [ of that block will increase by one with each pass through the ] ; [ "foreach" loop. We will use that ever-increasing length as ] ; [ a counter of messages we have read, and display it as a ] ; [ confirmation that the script is running. This display could ] ; [ be taken out if you wanted the script to run more "quietly." ] ; [------------------------------------------------------------------] foreach NEXT-MESSAGE ALL-MAIL [ append SCANNED-MESSAGES import-email NEXT-MESSAGE print ["Message" length? SCANNED-MESSAGES "scanned"] ] ; [------------------------------------------------------------------] ; [ Set up a canned email message that we will tailor with ] ; [ information about the email messages we scan below. ] ; [ NOTIFY-MESSAGE must be one big string if we are to send it ] ; [ as an email message. If we want the message to look nice to ] ; [ the recipient, we will put in some line-feeds to separate the ] ; [ lines. This is done with the "^/" characters, which are the ] ; [ coding REBOL recognizes as a string that consists of the ] ; [ line-feed character. ] ; [ Notice also that we are joining strings together, so we use ] ; [ the "to-string" function to convert TOTAL-MESSAGE-COUNT to a ] ; [ a string. ] ; [ Remember now that we are just setting up the message here. ] ; [ The next step will be to append to this string, that we are ] ; [ just setting up, a summary line for each personal email ] ; [ message. ] ; [------------------------------------------------------------------] NOTIFY-MESSAGE: join "Email summary from " [ MY-POP-SERVER "^/" "You have " to-string TOTAL-MESSAGE-COUNT " messages total messages including the following personal ones." "^/" ] ; [------------------------------------------------------------------] ; [ Finally, look at each scanned message and report who ] ; [ sent it. This also could be commented out if you wanted ] ; [ the script to run quietly. ] ; [ In addition, as long as we are going through the block of ] ; [ SCANNED-MESSAGES, check the "from" field against each address ] ; [ in the block of known friends in MY-FRIENDS-LIST. If the "from" ] ; [ field does match some known address, increase the count of ] ; [ personal messages and string together a summary of who this ] ; [ message is from and what it is about. Append this summary to ] ; [ the NOTIFY-MESSAGE that we initialized earlier and will send ] ; [ out later. ] ; [ ] ; [ The "if" statement below is an example of how a single line of ] ; [ code can be very hard to understand for someone not familiar ] ; [ with REBOL. The "if" statement causes the following block of ] ; [ code to be "executed" IF the condition is NOT FALSE--OR, not ] ; [ NONE. The "find" function returns the block you are "finding" ] ; [ something in if you have found something, but if you don't ] ; [ find anything, it returns NONE. ] ; [ ] ; [ The "find" function needs a block to find something in, and then ] ; [ it returns that block repositioned to the place where something ] ; [ was found. On subsequent passes through the loop, we would ] ; [ "find" from that new position if we didn't reposition the block ] ; [ at the beginning each time with the "head" function. ] ; [ ] ; [ This is an example of how REBOL works. The "head" function ] ; [ feeds something into the "find" function which feeds something ] ; [ into the "if" function. These can get quite involved. ] ; [------------------------------------------------------------------] foreach CURRENT-MSG SCANNED-MESSAGES [ prin ["From:" CURRENT-MSG/from] prin " " print ["SubJect:" CURRENT-MSG/subject] if find head MY-FRIENDS-LIST CURRENT-MSG/from [ PERSONAL-MESSAGE-COUNT: ADD PERSONAL-MESSAGE-COUNT 1 append NOTIFY-MESSAGE join "From: " [ CURRENT-MSG/from " " "Subject: " CURRENT-MSG/subject "^/" ] ] ] ; [------------------------------------------------------------------] ; [ Print an end-of-job message just because we like to ] ; [ assure the operator that things are progressing. ] ; [------------------------------------------------------------------] print "Done checking email" print [PERSONAL-MESSAGE-COUNT "Personal messages"] print ["We will send the following message to " to-string MY-NOTIFY-ADDRESS] print NOTIFY-MESSAGE ; [------------------------------------------------------------------] ; [ Send out the message we have built up. ] ; [------------------------------------------------------------------] send MY-NOTIFY-ADDRESS NOTIFY-MESSAGE ; [------------------------------------------------------------------] ; [ And, quit (the default operation if we "run off the end." ] ; [------------------------------------------------------------------] halt