divendres, 13 d’agost del 2010

Com automatitzar l'enviament de correus amb OpenOffice.org a Ubuntu Lucid Lynx 10.04 / 09 agost 2010

Com automatitzar l'enviament de correus amb OpenOffice.org a Ubuntu Lucid Lynx 10.04

Inspirat en el codi trobat a
http://trinity.neooffice.org/modules.php?name=Forums&file=viewtopic&t=7330&start=0&postdays=0&postorder=asc&highlight=

L'enviament per correu de l'actual document de treball (menú Fitxer-Envia-Document com a correu electrònic... i altres opcions) amb OpenOffice.org funciona diferent en Windows i Linux. A Windows es basa en les invocacions a la MAPI (Mail API). En canvi a Linux depèn del programa client de correu. Aquesta diferència es tradueix en que en Linux no és possible enviar els correus automàticament sense haver de prémer el botó enviar. De fet, això és una limitació dels programes clients de correu habituals: Thunderbird, Evolution... els que s'especifiquen a a Eines-Opcions-Internet-CorreuElectrònic a Programa de Correu.

Curiosament, el MailMerge no funciona fent servir aquests clients de correu sinó que es basa en una macro en Python que fa un enviament SMTP prenent com a dades de connexió les que es troben a Eines-Opcions-OpenOffice.org Writer-Adreça electrònica de la combinació.

Que a Linux, amb Thunderbird e Evolution calgui prémer el botó enviar és una molt mala notícia de cara a l'automatització d'enviaments.

Tanmateix, encara es pot automatitzar l'enviament. Per a fer-ho caldrà instal·lar des del Centre de Programari de l'Ubuntu l'aplicació de consola sendemail. (si volem enviar fent servir l'SMTP de Google, també caldrà instal·lar libio-socket-ssl-perl i libnet-ssleay-perl)

Aquesta és una aplicació que serveix per a fer exactament el que diu que fa: enviar correus des de la línia de comandes.

Si fem sendemail -h obtenim les opcions:

sendemail-1.56 by Brandon Zehm <caspian@dotconf.net>

Synopsis: sendemail -f ADDRESS [options]

Required:
-f ADDRESS from (sender) email address
* At least one recipient required via -t, -cc, or -bcc
* Message body required via -m, STDIN, or -o message-file=FILE

Common:
-t ADDRESS [ADDR ...] to email address(es)
-u SUBJECT message subject
-m MESSAGE message body
-s SERVER[:PORT] smtp mail relay, default is localhost:25

Optional:
-a FILE [FILE ...] file attachment(s)
-cc ADDRESS [ADDR ...] cc email address(es)
-bcc ADDRESS [ADDR ...] bcc email address(es)
-xu USERNAME username for SMTP authentication
-xp PASSWORD password for SMTP authentication

Paranormal:
-b BINDADDR[:PORT] local host bind address
-l LOGFILE log to the specified file
-v verbosity, use multiple times for greater effect
-q be quiet (i.e. no STDOUT output)
-o NAME=VALUE advanced options, for details try: --help misc
-o message-content-type=<auto|text|html>
-o message-file=FILE -o message-format=raw
-o message-header=HEADER -o message-charset=CHARSET
-o reply-to=ADDRESS -o timeout=SECONDS
-o username=USERNAME -o password=PASSWORD
-o tls=<auto|yes|no> -o fqdn=FQDN

Help:
--help the helpful overview you're reading now
--help addressing explain addressing and related options
--help message explain message body input and related options
--help networking explain -s, -b, etc
--help output explain logging and other output options
--help misc explain -o options, TLS, SMTP auth, and more

És dir, si faig, per exemple

$ sendemail -f elmeucompte@gmail.com -t destinatari@servidor.com -m 'Enviament de prova' -s smtp.gmail.com:587 -u 'Una prova amb sendemail…' -xu elmeulogin -xp elmeupassword -a /home/albert/Documents/thisdocument.txt -o tls=yes

Enviaré un missatge amb subject "Una prova amb sendemail…”, cos del missatge “Enviament de prova”, al compte de correu “destinatari@servidor.com” des del compte “elmeucompte@gmail.com” adjuntant el document que tinc a l'adreça local /home/albert/Documents/thisdocument.txt fent servir l'SMTP de Gmail amb l'usuari i password de Gmail del meu compte

Doncs bé, sabent tot això, el que puc fer és invocar directament des del OOoBasic a aquesta utilitat, passant la informació que faci falta. Per exemple, amb un codi com aquest:

sub EnviaCorreusShell(sFrom as String, sDestinatari as String, _
sSubject as String, sBody as String, sPathAdjunt as String, _
sHost as String, sLogin as String, sPassword as String, _
sAltres as String)
' sendemail -f elmeucompte@gmail.com -t destinatari@servidor.com
' -u 'Una prova amb sendemail…'
' -m 'Enviament de prova'
' -a /home/albert/Documents/thisdocument.txt
' -s smtp.gmail.com:587
' -xu elmeulogin
' -xp elmeupassword
' -o tls=yes

dim sParametres as string
sParametres = "-f " & sFrom
sParametres = sParametres & " -t " & sDestinatari
sParametres = sParametres & " -u " & sSubject
sParametres = sParametres & " -m " & sBody
sParametres = sParametres & " -a " & sPathAdjunt
sParametres = sParametres & " -s " & sHost
sParametres = sParametres & " -xu " & sLogin
sParametres = sParametres & " -xp " & sPassword
sParametres = sParametres & " " & sAltres

' Shell(Pathname, Windowstyle, Param, bSync) de la Wiki OooBasic RTL d'OpenOffice

' Pathname
' the path of the program to be executed.

' In MS-Windows, use ConvertToURL(Pathname) otherwise the command will not work
' if Pathname contains spaces or national characters.
'
' Windowstyle
' the window in which the program is started.
' The following values are possible:
'
' * 0 - program receives the focus and is started in a concealed window.
' * 1 - program receives the focus and is started in a normal-sized window.
' * 2 - program receives the focus and is started in a minimized window.
' * 3 - program receives the focus and is started in a maximized window.
' * 4 - program is started in a normal-sized window, without receiving the focus.
' * 6 - program is started in a minimized window, the focus remains in the current window.
' * 10 - program is started in full screen mode.
'
' Param
' command line parameters to be transferred to the program to be started.
'
' bSync
' wait for shell command to finish flag
'
' * true - wait for shell command to finish
' * false - don't wait for shell command to finish

Shell("/usr/bin/sendemail", 6, sParametres, true)

' msgbox("Enviat!") ' ho qualsevol altre avís

end sub


Que invocaria amb una crida com aquesta, per exemple:


EnviaCorreusShell("elmeucorreu@gmail.com", "destinatari@ono.com", _
"prova des de macro", " prova d'enviament de correu des de macro", _
"/home/albert/Documents/thisdocument.txt", _
"smtp.gmail.com:587", "elmeulogin", "elmeupassword", _
" -o tls=yes")



La cosa es pot millorar molt i adaptar-la a les necessitats. El següent són exemples diversos de com fer servir SendEmail per a enviar segons diferents criteris. Atenent al que es vulgui fer, adaptarem la invocació al client de correu.


Exemples de Sendemail (de http://www.debianadmin.com/how-to-sendemail-from-the-command-line-using-a-gmail-account-and-others.html)


Email simple

sendEmail -f myaddress@isp.net \
-t myfriend@isp.net \
-s relay.isp.net \
-u “Test email” \
-m “Hi , this is a test email.”



Enviament a molts destinataris

sendEmail -f myaddress@isp.net \
-t “admin <admin@isp.net>” user1@isp.net user2@isp.net \
-s relay.isp.net \
-u “Test email” \
-m “Hi this is a test email.”




Enviament a molts destinataris en còpia i en còpia oculta

(cal fixar-se aquí com, a diferència de l'enviament a molts destinataris amb '-t', amb '-cc' i '-bcc' cal separar els destinataris amb ';')


sendEmail -f myaddress@isp.net \
-t admin@isp.net;user1@isp.net;user2@isp.net \
-cc user2@isp.net tom@isp.net jess@isp.net \
-bcc ra@isp.net dub@isp.net kay@isp.net \
-s relay.isp.net \
-u “Test email with cc and bcc recipients” \
-m “Hi his is a test email.”




Enviament a molts destinataris i amb adjunts

sendEmail -f myaddress@isp.net \
-t admin@isp.net \
-cc user1@isp.net user2@isp.net user3@isp.net \
-s relay.isp.net \
-u “Test email with cc and bcc recipients” \
-m “Hi this is a test email.” \
-a /mnt/storage/document.sxw “/root/My Documents/Work Schedule.kwd”




Enviament de correu amb els continguts del missatge en un fitxer (mètode 1)

cat /tmp/file.txt | sendEmail -f myaddress@isp.net \
-t admin@isp.net \
-s relay.isp.net \
-u “Test email with contents of file”



Enviament de correu amb els continguts del missatge en un fitxer (mètode 2)

sendEmail -f myaddress@isp.net \
-t admin@isp.net \
-s relay.isp.net \
-o message-file=/tmp/file.txt \
-u “Test email with contents of file”




Enviament d'un email HTML: (cal assegurar que l'etiqueta <html> va a l'inici!)

cat /tmp/file.html | sendEmail -f myaddress@isp.net \
-t admin@isp.net \
-s relay.isp.net \
-u “Test email with html content”

Cap comentari:

Publica un comentari a l'entrada