Rebol [title: "Mass mailer" version: 2.3.24 author: "Massimiliano Vessi" date: 29/9/2009 email: maxint@tiscali.it file: %massmailer.r Purpose: {"Mass emailng the world!"} ;following data are for www.rebol.org library ;you can find a lot of rebol script there library: [ level: 'beginner platform: 'all type: [tutorial tool] domain: [vid gui email ] tested-under: [windows linux] support: none license: [gpl] see-also: none ] ] header-script: system/script/header version: "Version: " append version header-script/version config: array 7 ; the file %mass_mailer_conf.txt contains all configurations ; from 1-8 fields are settings ; 1 email adress from ; 2 smtp ; 3 user ; 4 password ; 5 email template file ; 6 email list ; 7 retard ;function to save all data in mass_mailer_conf.txt file salvatutto: func [ config] [ write %mass_mailer_conf.txt "" save %mass_mailer_conf.txt config ] ;check massmailer conf file existance either exists? %mass_mailer_conf.txt [ config: load %mass_mailer_conf.txt ] [ alert "You must set access data. Please fill in data in Settings panel." ritardo: 2 ] ;Setting panel configurazione_lay: layout [ across title "Settings" return text "Your email:" email_fl: field return text "SMTP server:" smtp_fl: field return text "SMTP user:" smtpuser_fl: field return text "SMTP password:" smtppass_fl: field return button "Save" [ poke config 1 to-email email_fl/text poke config 2 to-word smtp_fl/text poke config 3 to-string smtpuser_fl/text poke config 4 to-string smtppass_fl/text salvatutto config unview] button "Exit" [unview] ] ;Help panel aiuto_lay: layout [ title "HELP" text 190 {This is a mass email, it permits to send any number of emails without problems. It will send an email each 2 seconds (or the time you choose). If you'll fill correctly settings panel, all will be alright. File loaded by Mass mailer must be in ASCII not in unicode. There is also a errors.log file with the last email sent, it's useful in case of interruption. Now this software works with any email. If you have problems, please contact me: } text blue (rejoin ["maxint" "@" "tiscali.it"]) ] ;checking if the email list is OK controllo_emails: func [ lista] [ lista_nera: copy [] avvertire: false foreach indirizzo lista [ temp2: length? parse indirizzo "@." if temp2 < 3 [ avvertire: true append lista_nera indirizzo ] ] if avvertire = true [ alert reform ["The following addresses are NOT correct:" lista_nera ]] ] assemblaggio: func [ ] [ ;SET-NET is a function value. ;ARGUMENTS: ;settings -- [email-addr default-server pop-server proxy-server proxy-port-id proxy-type esmtp-user esmtp-pass] (Type: block) set-net reduce [ config/1 config/2 none none none none config/3 config/4] ;now we construct the header il_header: make object! [ X-REBOL: "View 2.7.8.3.1 http://WWW.REBOL.COM" Subject: email/Subject From: to-email config/1 Return-Path: to-email config/1 To: to-email config/1 Date: to-idate now ;we must set an correct RFC 822 standard format date or our emails will be identified as spam MIME-Version: "1.0" Content-Type: email/Content-Type ] ] leggi_email: func [ corpo_ind ] [ a_lay/text: to-string corpo_ind show a_lay testo: read/string to-file corpo_ind email: import-email testo led2/data: true show led2 ;probe email ] view layout [ across title "Mass mailing" return btn-help [ view/new aiuto_lay] text version return button "Settings" [ email_fl/text: to-string config/1 smtp_fl/text: to-string config/2 smtpuser_fl/text: to-string config/3 smtppass_fl/text: to-string config/4 show [email_fl smtp_fl smtpuser_fl smtppass_fl ] view/new configurazione_lay ] button "Reload last" [ b_lay/text: to-string config/6 ritardo/text: to-integer config/7 db_mail2: read/lines to-file config/6 leggi_email config/5 ;debug ;probe email led3/data: true show [ a_lay b_lay led2 led3 ritardo] ] return led2: led button "Email" [ corpo_ind: request-file either (parse (to-string corpo_ind) [thru ".eml" end]) [ leggi_email corpo_ind ] [ alert "It isn't a valid eml file!"] ] a_lay: field "no text file loaded, html files are the best!" return led3: led button "Email list" [ temp: to-file request-file db_mail: read temp db_mail: parse db_mail none sort db_mail db_mail2: copy unique db_mail write/lines temp db_mail2 ;scrive il file su hdd controllo_emails db_mail2 b_lay/text: to-string temp show b_lay led3/data: true show led3 ] b_lay: field "no email list file loaded" return text "Retard:" button 22x22 "+" [temp: to-integer ritardo/text temp: temp + 1 ritardo/text: to-string temp show ritardo ] ritardo: field 40 "2" button 22x22 "-" [temp: to-integer ritardo/text temp: temp - 1 if temp < 1 [temp: 1] ritardo/text: to-string temp show ritardo ] return button red "MASS MAILING!" [ counter: 0 b: length? db_mail2 a: confirm reform ["You are going to send" b "emails. I already deleted double entries. Do you want to proced?"] if a = true [ ;saving configurations poke config 5 to-file a_lay/text ; email file poke config 6 to-file b_lay/text ; emails list poke config 7 to-integer ritardo/text ; retard salvatutto config ;save configuration ;sending emails foreach record db_mail2 [ assemblaggio ;we now assemble the email il_header/To: record counter: counter + 1 sped_lay/text: reform ["Sending email n." counter] show sped_lay send/header ( to-email record ) email/Content il_header wait to-integer ritardo/text write %errors.log reform ["Last sent email is: " record] ] alert reform ["Finished! You sent" counter "emails."] sped_lay/text: reform [ "Finished! You sent" counter "emails." ] show sped_lay ] ] return sped_lay: text red "____________________________" ]