Далучэнне аднаго файла да электроннай пошце

Калі ласка, прабачце мяне наперадзе. Калі я спрабаваў даследаваць гэтае пытанне, я ў канчатковым выніку, гледзячы на ​​код, які я проста не магу зразумець. У мяне ёсць каля 3 гадзін вопыту работы з Python, і я, верагодна, спрабуе больш, чым я магу справіцца.

Праблема простая. Я магу паспяхова называць Python з R (мой аналіз праграмнага забеспячэння) для адпраўкі па электроннай пошце. Даданне паведамлення, прадмет, і з палёў я магу зрабіць. Я хацеў бы мець магчымасць адпраўляць ўкладанні. Жыццё было б вельмі добра, калі б я мог адправіць толькі адзін ўкладанне.

Код ў мяне да гэтага часу з'яўляецца

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

Я на мой ліміт для самастойнага навучання сёння. Я спадзяюся, што гэта відавочны фікс для кагосьці больш дасведчанага, чым я сам.

Я спадзяюся, што вы ўсё маюць вялікі дзень.

5
Аналагічны код, здаецца, працуе для мяне. Ці можаце вы апублікаваць поўны адсочвае? Акрамя таго, гэта, здаецца, не маюць нічога агульнага з г, так што я збіраюся выдаліць гэты тэг.
дададзена аўтар Michael Hoffman, крыніца
Я не ведаю шмат Python, але так як yourr толькі выкарыстанне «[» знаходзіцца ў радках, якія пачынаюцца з «Той, хто паведаміў [From», «Той, хто паведаміў [To» і «Той, хто паведаміў [Subject», што ўпэўнены, што гучыць як месца, каб замяніць [] з <>.
дададзена аўтар Carl Witthoft, крыніца
Вы, здаецца правільным. Калі я прыйшоў у гэтую раніцу, і пабег, ён працаваў нармальна. Я адправіў адаптацыю ў функцыі R ніжэй. Дзякуй за погляд яго.
дададзена аўтар Benjamin, крыніца

2 адказы

Вы можаце паспрабаваць выкарыстоўваць «паштар» замест таго, каб спрабаваць выкарыстоўваць SMTP непасрэдна. Mailer можна знайсці .

Вось некаторыя просты код, які паказвае, як яна працуе.

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)

Я брукаваную гэта разам з некаторымі прыкладамі, якія я меў на мясцовым узроўні. Старонка паштовай праграмы звязана вышэй, таксама паказвае іншыя прыклады. Пасля таго, як я знайшоў гэты код, я ператварыў усю іншы код пітона электроннай пошты, каб выкарыстаць гэты пакет.

1
дададзена
Я паспрабаваў гэта, перш чым нешта працаваць. На жаль, без размеркавання на Python і працуе мой код праз R, ён, падобна, не прызнае пакет, і я не ведаў, як прыступіць да працы. На жаль, я не мог быць больш прадуктыўным студэнтам.
дададзена аўтар Benjamin, крыніца

Я ведаю, што гэта дрэнная форма, каб адказаць на мой уласны пытанне, але ён пачаў цудоўна працаваць без зменаў. Які спосаб зрабіць сваё першае ўражанне, ці не так?

Ва ўсякім выпадку, я загарнуў яго ў функцыю R. Гэта будзе пасылаць з Gmail, але я не спрабаваў адправіць яго ад іншых рахункаў кліентаў. Я больш за ўсё зацікаўлены ў адпраўцы з Outlook, так як я буду выкарыстоўваць гэта для адпраўкі справаздач аналізу ўнутры маіх сцэнарыяў. Калі я ўвайшоў у SMTP-сервер майго працадаўцы, ён даў памылку «пашырэнне AUTH SMTP не падтрымліваецца серверам.» Я падазраю, што я буду працаваць у гэтым з маімі хлопцамі тэхнічнай падтрымкі.

Гэта верагодна, будзе працаваць толькі на Windows, дзякуючы функцыі winDialog (). Але гэта добры пачатак.

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
дададзена
Не дрэнная форма, каб адказаць на сваё пытанне на ўсіх - гэта нават вітаецца! meta.stackexchange.com/questions/9933/…
дададзена аўтар Chadwick, крыніца