02 lutego 2009
Wysyłanie maila z konsoli - skrypt Pythona
Jakiś czas temu postawiłem subversion na serwerze developerskim, który służył do testowania aplikacji którą piszę. Chciałem żeby informacje o każdym commit-cie były wysyłane na maila. Postanowiłem zrobić to przy pomocy skryptu w Pythonie.
import smtplib
import getopt
import email.Message
import sys
def main(argv):
opts, args = getopt.getopt(argv, "u:p:s:h:t:r:t:", ["server=", "port=", "sender=", password=", "to=", "subject=", "text="])
for opt, arg in opts:
if opt in ["-u", "--server"]:
serverURL = arg
elif opt in ["-p", "--port"]:
port = arg
elif opt in ["-s", "--sender"]:
sender = arg
elif opt in ["-h", "--password"]:
password = arg
elif opt in ["-t", "--to"]:
to = arg
elif opt in ["-r", "--subject"]:
subject = arg
elif opt in ["-t", "--text"]:
text = arg
message = email.Message.Message()
message["To"] = to
message["From"] = sender
message["Subject"] = subject
message.set_payload(text)
if port:
mailServer = smtplib.SMTP(serverURL, port)
else:
mailServer = smtplib.SMTP(serverURL)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(sender, password)
mailServer.sendmail(sender, to, message.as_string())
mailServer.quit()
Wiadomość ma wysyłać się z serwera SMTP na gmailu, więc istotna jest tu część kodu:
mailServer.ehlo() mailServer.starttls() mailServer.ehlo()
Żeby wysłać maila, wystarczy wpisać polecenie: python /srv/mail.py --server=smtp.gmail.com --port=587 --sender=<adres_nadawcy> --password=<hasło_nadawcy> --to=<adres_odbiorcy> --subject="temat" --text="tresc wiadomosci"
4 komentarze
A polskie literki obsługuje to poprawnie? Wydaje mi się, że nie -- nie widzę ani kodowania nagłówków, ani ustalania kodowania znaków dla treści (jedno i drugie da się zrobić przy pomocy modułu 'email').
Jeżeli obsługa znaków spoza ASCII była umyślnie pominięta, to warto wyraźnie o tym wspomnieć. Inaczej ktoś może tego użyć w środowisku, gdzie używa się polskich znaczków, a to skończyłoby się problemami.
Poza tym całkiem elegancki skrypcik, ale ja użyłbym gotowca – np. "nail" ;)
A po co to wymyślać koło na nowo? Ja używam do tego małego i lekkiego ssmtp i puszczam standardowo przez mail.
Ale nakombinowane ;) Dlaczego używasz mało wygodnego getopt, a nie optparse?
@Jajcuś: nie skupiałem się na polskich literkach, potrzebowałem to tylko do wysyłania informacji o rewizjach z svn.
@trójkąt: pierwsze rozwiązanie które przyszło mi do głowy i w miarę szybko je zastosowałem. Nie zagłębiałem się i nie szukałem innych.
@zen: można powiedzieć, że w zasadzie zaczynam programować w Pythonie, więc nawet nie wiedziałem o istnieniu optparse.