Eén bestand aan een e-mail toevoegen

Vergeef me alsjeblieft vooraan. Wanneer ik heb geprobeerd om deze vraag te onderzoeken, kijk ik uiteindelijk naar code die ik gewoon niet kan bevatten. Ik heb ongeveer 3 uur ervaring met Python en probeer waarschijnlijk meer dan ik aankan.

Het probleem is eenvoudig. Ik kan Python vanuit R (mijn analysesoftware) met succes bellen om een ​​e-mail te verzenden. Het bericht, onderwerp, toevoegen aan en van velden die ik kan doen. Ik wil graag een bijlage kunnen verzenden. Het leven zou geweldig zijn als ik maar één bijlage kon sturen.

De code die ik tot nu toe heb is

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()

When I run this code, I get the message string payload expected: [type 'list'] (but with < not [)

Ik heb mijn limiet voor zelflerend vandaag. Ik hoop dat dit een voor de hand liggende oplossing is voor iemand die meer ervaring heeft dan ikzelf.

Ik hoop dat jullie allemaal een geweldige dag hebben.

5
Een soortgelijke code lijkt voor mij te werken. Kun je alsjeblieft de volledige traceback plaatsen? Ook lijkt dit niets met r te maken te hebben, dus ik zal die tag verwijderen.
toegevoegd de auteur Michael Hoffman, de bron
Ik weet niet veel Python, maar omdat jouw gebruik van "[" is in de regels beginnend met "msg [Van", "msg [Naar" en "msg [Onderwerp" dat zeker klinkt als de plaats om te vervangen [] met <>.
toegevoegd de auteur Carl Witthoft, de bron
Je lijkt gelijk te hebben. Toen ik vanochtend kwam en het runde, werkte het prima. Ik heb de aanpassing gepost in een R-functie hieronder. Bedankt voor het kijken.
toegevoegd de auteur Benjamin, de bron

2 antwoord

U kunt proberen 'mailer' te gebruiken in plaats van te proberen SMTP rechtstreeks te gebruiken. Mailer is hier te vinden.

Hier is een aantal eenvoudige code die laat zien hoe het werkt.

messages=[]
message = mailer.Message()
message.attach('filename.txt')
message.From = 'Cool guy '
message.To = 'Random Dude '
message.Cc = 'Cards Fan '
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)

Ik legde dit samen uit een paar voorbeelden die ik lokaal had. De bovenvermelde mailerpagina toont ook andere voorbeelden. Nadat ik deze code had gevonden, heb ik al mijn andere python-e-mailcode geconverteerd om dit pakket te gebruiken.

1
toegevoegd
Ik heb dit geprobeerd voordat ik iets aan het werk kreeg. Helaas, zonder een distributie van Python en het uitvoeren van mijn code via R, leek het pakket niet te worden herkend en wist ik niet hoe ik aan het werk moest. Sorry, ik zou geen productievere student kunnen zijn.
toegevoegd de auteur Benjamin, de bron

Ik weet dat het een slechte vorm is om mijn eigen vraag te beantwoorden, maar het begon wonderbaarlijk te werken zonder veranderingen aan te brengen. Wat een manier om mijn eerste indruk te maken, toch?

Hoe dan ook, ik wikkelde het in een R-functie. Dit verzendt van Gmail, maar ik heb nog niet geprobeerd het vanaf andere accounts te verzenden. Ik ben het meest geïnteresseerd in het verzenden vanuit Outlook, omdat ik dit zou gebruiken om analyserapporten vanuit mijn scripts te verzenden. Toen ik de SMTP-server van mijn werkgever binnenging, kreeg ik de foutmelding "SMTP AUTH-extensie wordt niet ondersteund door de server". Ik vermoed dat ik dit zal moeten oplossen met mijn technici.

Dit werkt waarschijnlijk alleen op Windows, dankzij de functies WinDialog (). Maar het is een goed begin.

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")
}
0
toegevoegd
Geen slechte vorm om je eigen vraag helemaal te beantwoorden - het wordt zelfs aangemoedigd! meta.stackexchange.com/questions/9933/…
toegevoegd de auteur Chadwick, de bron