Thursday, February 14, 2013

python script for send mails

ok. Πειραματίζομαι με την python. Δεν ξερω αν εχω αναφερει ποτε ποσο συμπαθω τη συγκεκριμένη γλωσσα. Ενας λογος είναι οτι μερικα πραγματα τα κάνει πολυ ευκολα και γρήγορα. Κατι το οποιο ειναι ζητουμενο πιστευω! Και το να γραψεις ενα προγραμματακι να στελνει mail με python ηταν πραγματικα παιχνιδακι. Δε θελετε να εχετε κατι ετοιμο στον υπολογιστη σας, ωστε οταν θα θελησετε να στειλετε ενα mail στη δουλεια σας, αντι να ανοιγετε browser, να πηγαινετε στη σελιδα του παροχου, να περιμενετε να φορτωσει η σελιδα και γενικα ολα οσα πρεπει να κανεις για να στειλεις ενα απλο email, απλα απο την κονσολα να τρεχετε το προγραμματακι, να γραφετε παραληπτη και το μηνυμα στο πι και φι.

Η version που χρησιμοποιησα ειναι 2.7.3. Το μοναδικο module που ουσιαστικα χρειαζεσαι για να υλοποιησεις την πιο απλη εκδοση ειναι το smtplib. Αυτο!! Τιποτα αλλο. Η υλοποιηση λοιπον περα απο το module απιτει να φτιαξουμε ενα smtp object, να κανουμε login στο server, και να στειλουμε το mail. Πραγματικα ποιο πολλα ειναι οσα γραφω παρα ολο το script.

Στην πραξη, οι παρακατω γραμμες κανουν ολη τη δουλεια που περιεγραψα:

 import smtplib

server = smtplib.SMTP_SSL(host,port,timeout=5)

server.login(usernm,passwd)

server.sendmail(fromaddr,toaddr,msg)
Οπως θα παρατηρειται το αντικειμενο που δημιουργησα ειναι SMTP_SSL. Και αυτο γιατι για Gmail λογαριασμους απαιτειται κρυπτογραφιση ssl. Ευτυχως το smtp module εχει αυτη και πολλες αλλες δυνατοτητες.

Τωρα το αντικειμενο smtp και smtp_ssl περνει καποιες παραμετρους. Η host ειναι η διευθυνση του smtp server. Η port η πορτα του server. Και τα δυο μπορουν να παραλυφθουν και τοτε θα χρησιμοποιήσουν το localhost και τη default πορτα για smtp, δηλ 25. Εγω απλα ελεγξα και το timeout, επιπλεον. Και για τα δυο αντικειμενα υπαρχουν επιπλεον επιλογες τις οποιες μπορειτε να βρειτε το doc της python.

Για να κανω πιο ενδιαφερον, πιο λειτουργικο και για να δειξω κατι ακομα απο το smtplib συνδυασα το παραπανω με μερικα ακομα πραγματα. Ηθελα λοιπον να ξεκιναω το προγραμμα με παραμετρο το mail account μου. Οταν ξεκιναγε λοιπον με ρωταγε που θα στειλω το μηνυμα και ποιο ηταν αυτο. Ολα περναγανε σε μεταβλητες που καταχωρουνταν στις παραπανω μεθοδους. Τελος ενεργοποίησα το debug mode για να βλεπω ολα τα μηνυματα της επικοινωνιας του server. Χωρις αλλα λογια:
import smtplib
import sys, getpass

usernm=sys.argv[1]
passwd=getpass.getpass("Give a passwd: ")

host='smtp.gmail.com'
port=465
def prompt(prompt):
    return raw_input(prompt).strip()

fromaddr=usernm
toaddr=prompt("To: ")
print "enter msg, end with ^D:"
msg=("from: %s\r\nTo: %s\r\n\r\n" % (fromaddr, ", ".join(toaddr)))

while 1:
    try:
        line=raw_input()
    except EOFError:
        break
    if not line:
        break
    msg=msg+line
print "Message length is "+repr(len(msg))

try:
    """create an SMTP object"""
    server = smtplib.SMTP_SSL(host,port,timeout=5)
    server.set_debuglevel(1)
    """log in to the server"""
    server.login(usernm,passwd)

except smtplib.SMTPException:
    print "General Error!!!"


""" send the mail"""
server.sendmail(fromaddr,toaddr,msg)
server.close()

Λιγα λογια ακομα. Το passwd αποθηκευει το password του λογαριασμου για το login. Ακομα δεν εχω πιστει αν αυτος ειναι ο πιο ασφαλες τρόπος αλλα anyway. Χρεισιμοποιουμε τις host, port, fromaddr, toaddr & msg για αποθηκευσουμε οτι πληροφοριες χρειαζομαστε. Και εχουμε μια loop για να διαβαζει γραμμη γραμμη το μηνυμα. Το οποιο τερματιζει οταν σε καινουργια γραμμη αντι για χαρακτηρας πληκτρολογηται ^D. Αυτο για Linux. Για Windows θελει ^Z.

Απο δω και περα ισως θελετε περισσοτερα, οπως το να βαλετε subject, ή να συμπεριλαβετε συννυμενα. Οκ γινεται αλλα πρεπει να παιξετε με ενα αλλο module, το email. Γενικα εμενα ολα αυτα μου φερανε πολλες εφαρμογες στο μυαλο για τη συνεχεια, αλλα το βασικα ειναι οτι τωρα εχω το δικο μου, γρηγορο και απλο τροπο να στελνω mail.