View in color | View documentation | License |
Download script | History | Other scripts by: crazyaxe |
30-Apr 9:01 UTC
[0.544] 17.313k
[0.544] 17.313k
massmailer.rRebol [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 "____________________________"
] Notes
|