2011-10-27 13 views
5

Proszę wybaczyć mi z góry. Kiedy próbowałem zbadać to pytanie, w końcu zajrzałem do kodu, którego po prostu nie mogę zrozumieć. Mam około 3 godziny doświadczenia z Pythonem i prawdopodobnie próbuję więcej niż mogę obsłużyć.Dołączanie pojedynczego pliku do wiadomości e-mail

Problem jest prosty. Mogę skutecznie wywołać Python z R (moje oprogramowanie analityczne), aby wysłać wiadomość e-mail. Dodanie wiadomości, tematu, do iz pól, które mogę zrobić. Chciałbym móc wysłać załącznik. Życie byłoby wspaniałe, gdybym mógł wysłać tylko jedno przywiązanie.

kod mam tak daleko jest

import smtplib 
import os 
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEBase import MIMEBase 
from email.MIMEText import MIMEText 
from email.Utils import COMMASPACE, formatdate 
from email import Encoders 
import email.utils 

fromaddr = '[email protected]' 
toaddrs = '[email protected]' 
msg = MIMEMultipart(MIMEText('This is the body of the e-mail')) 
msg['From'] = email.utils.formataddr(('Benjamin Nutter', fromaddr)) 
msg['To'] = email.utils.formataddr(('Benjamin Nutter', toaddrs)) 
msg['Subject'] = 'Simple test message' 
f = 'filename.pdf' 
part=MIMEBase('application', 'octet-stream') 
part.set_payload(open(f, 'rb').read()) 
Encoders.encode_base64(part) 
part.add_header('Content-Disposition', 'attachment; filename=\"%s\"' % os.path.basename(f)) 
msg.attach(part) 

"username = 'user' 
"password = 'pw' 

server = smtplib.SMTP('smtp.gmail.com:587') 
server.ehlo() 
server.starttls() 
server.ehlo() 
server.login(username,password) 
server.sendmail(fromaddr, toaddrs, msg.as_string()) 
server.quit() 

Kiedy uruchomić ten kod, otrzymuję wiadomość ciąg ładowność spodziewanych: [type 'list'] (ale z < nie [)

Dzisiaj jestem na granicy możliwości samodzielnego uczenia się. Mam nadzieję, że to oczywiste rozwiązanie dla kogoś bardziej doświadczonego niż ja.

Mam nadzieję, że wszyscy świetnie się bawiliście.

+0

nie wiem dużo Python, ale ponieważ yourr tylko zastosowanie „[” znajduje się na linii zaczynające się od „msg [OD”, „msg [TO” oraz „msg [Subject”, które na pewno brzmi jak miejsce do zastąpienia [] za pomocą <>. –

+1

Podobny kod wydaje się działać dla mnie. Czy możesz opublikować pełne informacje zwrotne? Nie wydaje się to mieć nic wspólnego z r, więc zamierzam usunąć ten tag. –

+0

Wyglądasz na poprawny. Kiedy wszedłem dziś rano i przebiegłem, wszystko działało dobrze. Poniżej zamieściłem adaptację w funkcji R. Dzięki za obejrzenie tego. – Benjamin

Odpowiedz

0

Wiem, że to źle jest odpowiedzieć na moje własne pytanie, ale zaczęło działać cudownie bez żadnych zmian. Jaki sposób na zrobienie mojego pierwszego wrażenia, prawda?

W każdym razie owinąłem go w funkcję R. Spowoduje to wysłanie wiadomości z Gmaila, ale nie próbowałem jeszcze wysyłać go z innych kont. Najbardziej interesuje mnie wysyłanie z Outlooka, ponieważ używałbym tego do wysyłania raportów analitycznych z moich skryptów. Kiedy wszedłem na serwer SMTP mojego pracodawcy, pojawił się błąd "Rozszerzenie SMTP AUTH nie obsługiwane przez serwer". Podejrzewam, że będę musiał to załatwić z moimi technikami wsparcia technicznego.

To prawdopodobnie działa tylko w systemie Windows, dzięki funkcji winDialog(). Ale to dobry początek.

send.email <- function(to, from, subject, 
    message, attachment=NULL, 
    username, password, 
    server="smtp.gmail.com:587", 
    confirmBeforeSend=TRUE){ 
    # to: a list object of length 1. Using list("Recipient" = "[email protected]") will send the message to the address but 
    #  the name will appear instead of the address. 
    # from: a list object of length 1. Same behavior as 'to' 
    # subject: Character(1) giving the subject line. 
    # message: Character(1) giving the body of the message 
    # attachment: Character(1) giving the location of the attachment 
    # username: character(1) giving the username. If missing and you are using Windows, R will prompt you for the username. 
    # password: character(1) giving the password. If missing and you are using Windows, R will prompt you for the password. 
    # server: character(1) giving the smtp server. 
    # confirmBeforeSend: Logical. If True, a dialog box appears seeking confirmation before sending the e-mail. This is to 
    #     prevent me to send multiple updates to a collaborator while I am working interactively. 

    if (!is.list(to) | !is.list(from)) stop("'to' and 'from' must be lists") 
    if (length(from) > 1) stop("'from' must have length 1") 
    if (length(to) > 1) stop("'send.email' currently only supports one recipient e-mail address") 
    if (length(attachment) > 1) stop("'send.email' can currently send only one attachment") 
    if (length(message) > 1){ 
    stop("'message' must be of length 1") 
    message <- paste(message, collapse="\\n\\n") 
    } 

    if (is.null(names(to))) names(to) <- to 
    if (is.null(names(from))) names(from) <- from 
    if (!is.null(attachment)) if (!file.exists(attachment)) stop(paste("'", attachment, "' does not exist!", sep="")) 

    if (missing(username)) username <- winDialogString("Please enter your e-mail username", "") 
    if (missing(password)) password <- winDialogString("Please enter your e-mail password", "") 

    require(rJython) 
    rJython <- rJython() 

    rJython$exec("import smtplib") 
    rJython$exec("import os") 
    rJython$exec("from email.MIMEMultipart import MIMEMultipart") 
    rJython$exec("from email.MIMEBase import MIMEBase") 
    rJython$exec("from email.MIMEText import MIMEText") 
    rJython$exec("from email.Utils import COMMASPACE, formatdate") 
    rJython$exec("from email import Encoders") 
    rJython$exec("import email.utils") 

    mail<-c(
    #Email settings 
    paste("fromaddr = '", from, "'", sep=""), 
    paste("toaddrs = '", to, "'", sep=""), 
    "msg = MIMEMultipart()", 
    paste("msg.attach(MIMEText('", message, "'))", sep=""), 
    paste("msg['From'] = email.utils.formataddr(('", names(from), "', fromaddr))", sep=""), 
    paste("msg['To'] = email.utils.formataddr(('", names(to), "', toaddrs))", sep=""), 
    paste("msg['Subject'] = '", subject, "'", sep="")) 

    if (!is.null(attachment)){ 
    mail <- c(mail, 
     paste("f = '", attachment, "'", sep=""), 
    "part=MIMEBase('application', 'octet-stream')", 
    "part.set_payload(open(f, 'rb').read())", 
    "Encoders.encode_base64(part)", 
    "part.add_header('Content-Disposition', 'attachment; filename=\"%s\"' % os.path.basename(f))", 
    "msg.attach(part)") 
    } 

#SMTP server credentials 
    mail <- c(mail, 
    paste("username = '", username, "'", sep=""), 
    paste("password = '", password, "'", sep=""), 

#Set SMTP server and send email, e.g., google mail SMTP server 
    paste("server = smtplib.SMTP('", server, "')", sep=""), 
    "server.ehlo()", 
    "server.starttls()", 
    "server.ehlo()", 
    "server.login(username,password)", 
    "server.sendmail(fromaddr, toaddrs, msg.as_string())", 
    "server.quit()") 

    message.details <- 
    paste("To:    ", names(to), " (", unlist(to), ")", "\n", 
      "From:    ", names(from), " (", unlist(from), ")", "\n", 
      "Using server:  ", server, "\n", 
      "Subject:   ", subject, "\n", 
      "With Attachments: ", attachment, "\n", 
      "And the message:\n", message, "\n", sep="") 

    if (confirmBeforeSend) 
    SEND <- winDialog("yesnocancel", paste("Are you sure you want to send this e-mail to ", unlist(to), "?", sep="")) 
    else SEND <- "YES" 

    if (SEND %in% "YES"){ 
    jython.exec(rJython,mail) 
    cat(message.details) 
    } 
    else cat("E-mail Delivery was Canceled by the User") 
} 
+1

Niezła forma, aby w ogóle odpowiedzieć na własne pytanie - nawet zachęca! http://meta.stackexchange.com/questions/9933/is-there-a-convention-for-accepting-my-own-answer-to-my-own-question – Chadwick

1

Możesz spróbować użyć 'mailer', zamiast próbować bezpośrednio korzystać z SMTP. Mailer można znaleźć here.

Oto prosty kod, który pokazuje, jak to działa.

messages=[] 
message = mailer.Message() 
message.attach('filename.txt') 
message.From = 'Cool guy <[email protected]>' 
message.To = 'Random Dude <[email protected]>' 
message.Cc = 'Cards Fan <[email protected]>' 
message.Subject = 'Test Email' 
message.body = 'Here is the body of the email.' 
messages.append(message) 

emailer = mailer.Mailer(smtphost.example.com) 
emailer.send(messages) 

Zrobiłem to razem z kilku przykładów, które miałem lokalnie. Strona linkowana powyżej pokazuje także inne przykłady. Kiedy znalazłem ten kod, przekonwertowałem cały mój inny kod pocztowy Pythona, aby użyć tego pakietu.

+0

Próbowałem tego zanim zacząłem działać. Niestety, bez dystrybucji Pythona i uruchomienia mojego kodu przez R, nie rozpoznałem pakietu i nie wiedziałem, jak dostać się do pracy. Przepraszam, nie mogłem być bardziej produktywnym uczniem. – Benjamin

Powiązane problemy