[zope-pt] Re: Imagem no contact-info

2008-04-18 Por tôpico Davi Medeiros
Compartilhando com a lista o sucesso obtido com a ajuda do Fabiano
Weimar do João Bueno na minha missão de enviar um anexo por email
junto a uma adaptação do /contact-info do Plone. Se alguém quiser
melhorar algo, sugerir melhores práticas, só temos a agradecer.

Customizei o CPT contact-info adicionando via HTML um campo do
type=file name=imagem, baseado nos campos já existentes. Como a
imagem não era obrigatória não precisei atualizar a validação dos
campos. Porém alterei a action de sucesso, customizando o
portal_skins/plone_form_scripts/send_feedback_site para
custom/send_seu_jeito que ficou assim:




REQUEST=context.REQUEST

from Products.CMFPlone.utils import transaction_note
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone import PloneMessageFactory as _
from ZODB.POSException import ConflictError

##
## This may change depending on the called (portal_feedback or author)
state_success = success
state_failure = failure

plone_utils = getToolByName(context, 'plone_utils')
urltool = getToolByName(context, 'portal_url')
portal = urltool.getPortalObject()
url = urltool()

## make these arguments?
subject = REQUEST.get('subject', '')
message = REQUEST.get('message', '')
sender_from_address = REQUEST.get('sender_from_address', '')
sender_fullname = REQUEST.get('sender_fullname', '')
imagem = REQUEST.get('imagem', '').read()

send_to_address = portal.getProperty('email_from_address')
envelope_from = portal.getProperty('email_from_address')

state.set(status=state_success) ## until proven otherwise

host = context.MailHost
encoding = plone_utils.getSiteEncoding()

variables = {'sender_from_address' : sender_from_address,
 'sender_fullname' : sender_fullname,
 'url' : url,
 'subject' : subject,
 'message' : message
}

try:
message = context.seu_jeito_feedback_template(context, **variables)
context.run_send_seu_jeito(sender_from_address, send_to_address,
subject, message, imagem)
except ConflictError:
raise
except: # TODO Too many things could possibly go wrong. So we catch all.
exception = plone_utils.exceptionString()
message = _(u'Unable to send mail: ${exception}',
mapping={u'exception' : exception})
plone_utils.addPortalMessage(message)
return state.set(status=state_failure)

## clear request variables so form is cleared as well
REQUEST.set('message', None)
REQUEST.set('subject', None)
REQUEST.set('sender_from_address', None)
REQUEST.set('sender_fullname', None)
REQUEST.set('imagem', None)


plone_utils.addPortalMessage(_(u'Mail sent.'))
return state





E por fim criei um External Method chamado run_send_seu_jeito que lê o
seguinte arquivo mailer.py (module: mailer, function: send) guardado
dentro da pasta Extensions do meu Plone 2.5.3.





import sys, smtplib, MimeWriter, base64, StringIO, os, string, time

def send(self, sender_from_address, send_to_address, subject,
message_text, imagem):
context = self
REQUEST = context.REQUEST
message = StringIO.StringIO()
writer = MimeWriter.MimeWriter(message)
writer.addheader('MIME-Version', '1.0')
writer.addheader('Subject', subject)
writer.addheader('To', send_to_address )

# get ready to send attachment
writer.startmultipartbody('mixed')

# start off with a text/html part
part = writer.nextpart()
body = part.startbody('text/html')

body.write(message_text)

# 
# add Image attachment
# 
if imagem:
image_type = JPG
part = writer.nextpart()
part.addheader('Content-Transfer-Encoding', 'base64')
body = part.startbody('image/%s; name=%s' % (image_type,
Imagem-Ilustrativa.jpg))
# image file
body.write(base64.encodestring(imagem))
# finish off
writer.lastpart()

# ..
# send the mail
# . if user supplied userid/password then deal w/it
# ..
smtp = smtplib.SMTP(context.MailHost.smtp_host)
if context.MailHost.smtp_userid:
   smtp.ehlo()
   smtp_userid64 = base64.encodestring(context.MailHost.smtp_userid)
   smtp.docmd(auth, login  + smtp_userid64[:-1])
   if context.MailHost.smtp_pass:
  smtp_pass64 = base64.encodestring(self.MailHost.smtp_pass)
  smtp.docmd(smtp_pass64[:-1])
smtp.sendmail(sender_from_address, send_to_address,
message.getvalue())
smtp.quit()




Muito obrigado! O aprendizado ficou!

Até mais,
Davi Lima


--- Em zope-pt@yahoogrupos.com.br, Fabiano Weimar dos Santos
[EMAIL PROTECTED] escreveu

 Oi Davi,
 
 da uma olhada nesse link:
 

http://www.redcor.ch/web/intranet_zope_plone/tutorial/faq/SendingMailWithAttachmentsViaPython
 
 É um pouco chato de fazer, mas se você mandar uma mensagem como quer
 para você, analisar o código fonte da mensagem e 

[zope-pt] Re: Imagem no contact-info

2008-04-18 Por tôpico ROBSON VIRINO - GEINF
Show de Bola, Davi, sua atitude.

Acho que essa idéia já passou até por aqui, mas reforçando, seria 
interessante até depois catalogarmos as dúvidas solucionadas na lista em 
uma página,
como uma espécie de apostila Zope-pt, ou até uma revista virtual Zope-pt 
com soluções em artigos.
Com certeza, aqui na lista, varrendo as mensagens antigas, tem truques 
que não se encontram por aí em outros sites sobre Plone, inclusive no 
Tchezope ou Plone.org;

Isso seria ótimo pra quem é recém-chegado no Plone, visto que 
catalogaríamos artigos em mutirão de forma coesa, um resumo de várias 
threads em um só canto.
Pois o que acontece quando as pessoas procuram na lista, mesmo 
pesquisando dúvidas já respondidas, perguntam novamente, pois há o 
cansaço de juntar as idéias externalizadas em várias threads em torno de 
uma solução...

Eu posso dedicar uma hora por dia para fazer varredura de soluções 
encontradas na lista.
Com a ajuda de todos, economizaríamos centenas de threads repetidas, 
facilitando a difusão do desenvolvimento Plone.
Enfim, como faríamos isso? Colhamos idéias!

[ ]s

Robson Virino.

Davi Medeiros escreveu:

 Compartilhando com a lista o sucesso obtido com a ajuda do Fabiano
 Weimar do João Bueno na minha missão de enviar um anexo por email
 junto a uma adaptação do /contact-info do Plone. Se alguém quiser
 melhorar algo, sugerir melhores práticas, só temos a agradecer.

 Customizei o CPT contact-info adicionando via HTML um campo do
 type=file name=imagem, baseado nos campos já existentes. Como a
 imagem não era obrigatória não precisei atualizar a validação dos
 campos. Porém alterei a action de sucesso, customizando o
 portal_skins/plone_form_scripts/send_feedback_site para
 custom/send_seu_jeito que ficou assim:

 

 REQUEST=context.REQUEST

 from Products.CMFPlone.utils import transaction_note
 from Products.CMFCore.utils import getToolByName
 from Products.CMFPlone import PloneMessageFactory as _
 from ZODB.POSException import ConflictError

 ##
 ## This may change depending on the called (portal_feedback or author)
 state_success = success
 state_failure = failure

 plone_utils = getToolByName(context, 'plone_utils')
 urltool = getToolByName(context, 'portal_url')
 portal = urltool.getPortalObject()
 url = urltool()

 ## make these arguments?
 subject = REQUEST.get('subject', '')
 message = REQUEST.get('message', '')
 sender_from_address = REQUEST.get('sender_from_address', '')
 sender_fullname = REQUEST.get('sender_fullname', '')
 imagem = REQUEST.get('imagem', '').read()

 send_to_address = portal.getProperty('email_from_address')
 envelope_from = portal.getProperty('email_from_address')

 state.set(status=state_success) ## until proven otherwise

 host = context.MailHost
 encoding = plone_utils.getSiteEncoding()

 variables = {'sender_from_address' : sender_from_address,
 'sender_fullname' : sender_fullname,
 'url' : url,
 'subject' : subject,
 'message' : message
 }

 try:
 message = context.seu_jeito_feedback_template(context, **variables)
 context.run_send_seu_jeito(sender_from_address, send_to_address,
 subject, message, imagem)
 except ConflictError:
 raise
 except: # TODO Too many things could possibly go wrong. So we catch all.
 exception = plone_utils.exceptionString()
 message = _(u'Unable to send mail: ${exception}',
 mapping={u'exception' : exception})
 plone_utils.addPortalMessage(message)
 return state.set(status=state_failure)

 ## clear request variables so form is cleared as well
 REQUEST.set('message', None)
 REQUEST.set('subject', None)
 REQUEST.set('sender_from_address', None)
 REQUEST.set('sender_fullname', None)
 REQUEST.set('imagem', None)

 plone_utils.addPortalMessage(_(u'Mail sent.'))
 return state

 

 E por fim criei um External Method chamado run_send_seu_jeito que lê o
 seguinte arquivo mailer.py (module: mailer, function: send) guardado
 dentro da pasta Extensions do meu Plone 2.5.3.

 

 import sys, smtplib, MimeWriter, base64, StringIO, os, string, time

 def send(self, sender_from_address, send_to_address, subject,
 message_text, imagem):
 context = self
 REQUEST = context.REQUEST
 message = StringIO.StringIO()
 writer = MimeWriter.MimeWriter(message)
 writer.addheader('MIME-Version', '1.0')
 writer.addheader('Subject', subject)
 writer.addheader('To', send_to_address )

 # get ready to send attachment
 writer.startmultipartbody('mixed')

 # start off with a text/html part
 part = writer.nextpart()
 body = part.startbody('text/html')

 body.write(message_text)

 # 
 # add Image attachment
 # 
 if imagem:
 image_type = JPG
 part = writer.nextpart()
 part.addheader('Content-Transfer-Encoding', 'base64')
 body = part.startbody('image/%s; name=%s' % (image_type,
 Imagem-Ilustrativa.jpg))
 # image file
 body.write(base64.encodestring(imagem))
 # finish off
 writer.lastpart()

 # ..
 # send the mail
 # . if user supplied userid/password then deal w/it
 # 

[zope-pt] Re: Imagem no contact-info

2008-04-18 Por tôpico Davi Medeiros
Robson, já estou com um projeto desses em mente, semi-estruturado e
engatilhado inclusive, acho que dentro de alguns dias podemos começar
a valer. Já tem eu, você e o Edgard Costas dispostos.

Mais gente?

Davi

--- Em zope-pt@yahoogrupos.com.br, ROBSON VIRINO - GEINF [EMAIL PROTECTED]
escreveu

 Show de Bola, Davi, sua atitude.
 
 Acho que essa idéia já passou até por aqui, mas reforçando, seria 
 interessante até depois catalogarmos as dúvidas solucionadas na
lista em 
 uma página,
 como uma espécie de apostila Zope-pt, ou até uma revista virtual
Zope-pt 
 com soluções em artigos.
 Com certeza, aqui na lista, varrendo as mensagens antigas, tem truques 
 que não se encontram por aí em outros sites sobre Plone, inclusive no 
 Tchezope ou Plone.org;
 
 Isso seria ótimo pra quem é recém-chegado no Plone, visto que 
 catalogaríamos artigos em mutirão de forma coesa, um resumo de várias 
 threads em um só canto.
 Pois o que acontece quando as pessoas procuram na lista, mesmo 
 pesquisando dúvidas já respondidas, perguntam novamente, pois há o 
 cansaço de juntar as idéias externalizadas em várias threads em
torno de 
 uma solução...
 
 Eu posso dedicar uma hora por dia para fazer varredura de soluções 
 encontradas na lista.
 Com a ajuda de todos, economizaríamos centenas de threads repetidas, 
 facilitando a difusão do desenvolvimento Plone.
 Enfim, como faríamos isso? Colhamos idéias!
 
 [ ]s
 
 Robson Virino.
 
 Davi Medeiros escreveu:
 
  Compartilhando com a lista o sucesso obtido com a ajuda do Fabiano
  Weimar do João Bueno na minha missão de enviar um anexo por email
  junto a uma adaptação do /contact-info do Plone. Se alguém quiser
  melhorar algo, sugerir melhores práticas, só temos a agradecer.
 
  Customizei o CPT contact-info adicionando via HTML um campo do
  type=file name=imagem, baseado nos campos já existentes. Como a
  imagem não era obrigatória não precisei atualizar a validação dos
  campos. Porém alterei a action de sucesso, customizando o
  portal_skins/plone_form_scripts/send_feedback_site para
  custom/send_seu_jeito que ficou assim:
 
  
 
  REQUEST=context.REQUEST
 
  from Products.CMFPlone.utils import transaction_note
  from Products.CMFCore.utils import getToolByName
  from Products.CMFPlone import PloneMessageFactory as _
  from ZODB.POSException import ConflictError
 
  ##
  ## This may change depending on the called (portal_feedback or author)
  state_success = success
  state_failure = failure
 
  plone_utils = getToolByName(context, 'plone_utils')
  urltool = getToolByName(context, 'portal_url')
  portal = urltool.getPortalObject()
  url = urltool()
 
  ## make these arguments?
  subject = REQUEST.get('subject', '')
  message = REQUEST.get('message', '')
  sender_from_address = REQUEST.get('sender_from_address', '')
  sender_fullname = REQUEST.get('sender_fullname', '')
  imagem = REQUEST.get('imagem', '').read()
 
  send_to_address = portal.getProperty('email_from_address')
  envelope_from = portal.getProperty('email_from_address')
 
  state.set(status=state_success) ## until proven otherwise
 
  host = context.MailHost
  encoding = plone_utils.getSiteEncoding()
 
  variables = {'sender_from_address' : sender_from_address,
  'sender_fullname' : sender_fullname,
  'url' : url,
  'subject' : subject,
  'message' : message
  }
 
  try:
  message = context.seu_jeito_feedback_template(context, **variables)
  context.run_send_seu_jeito(sender_from_address, send_to_address,
  subject, message, imagem)
  except ConflictError:
  raise
  except: # TODO Too many things could possibly go wrong. So we
catch all.
  exception = plone_utils.exceptionString()
  message = _(u'Unable to send mail: ${exception}',
  mapping={u'exception' : exception})
  plone_utils.addPortalMessage(message)
  return state.set(status=state_failure)
 
  ## clear request variables so form is cleared as well
  REQUEST.set('message', None)
  REQUEST.set('subject', None)
  REQUEST.set('sender_from_address', None)
  REQUEST.set('sender_fullname', None)
  REQUEST.set('imagem', None)
 
  plone_utils.addPortalMessage(_(u'Mail sent.'))
  return state
 
  
 
  E por fim criei um External Method chamado run_send_seu_jeito que lê o
  seguinte arquivo mailer.py (module: mailer, function: send) guardado
  dentro da pasta Extensions do meu Plone 2.5.3.
 
  
 
  import sys, smtplib, MimeWriter, base64, StringIO, os, string, time
 
  def send(self, sender_from_address, send_to_address, subject,
  message_text, imagem):
  context = self
  REQUEST = context.REQUEST
  message = StringIO.StringIO()
  writer = MimeWriter.MimeWriter(message)
  writer.addheader('MIME-Version', '1.0')
  writer.addheader('Subject', subject)
  writer.addheader('To', send_to_address )
 
  # get ready to send attachment
  writer.startmultipartbody('mixed')
 
  # start off with a text/html part
  part = writer.nextpart()
  body = part.startbody('text/html')
 
  body.write(message_text)
 
  # 
  # add Image attachment
  # 

Re: [zope-pt] Re: Imagem no contact-info

2008-02-23 Por tôpico Fabiano Weimar dos Santos
Oi Davi,

da uma olhada nesse link:

http://www.redcor.ch/web/intranet_zope_plone/tutorial/faq/SendingMailWithAttachmentsViaPython

É um pouco chato de fazer, mas se você mandar uma mensagem como quer
para você, analisar o código fonte da mensagem e tentar gerar
cabeçalhos parecidos, não deve ser tão difícil.

Um abraço,

Fabiano Weimar


2008/2/21 Davi Medeiros [EMAIL PROTECTED]:






 Ricardo, adicionar o campo é fácil, preciso saber é como enviar anexa
  a imagem por email. Encontrei o script que faz o envio do mail via
  MailHost: /portal_skins/plone_form_scripts/send_feedback_site

  Agora preciso saber como enviar a imagem anexa. Por exemplo, lá tem:
  message = REQUEST.get('message', '')

  Creio que eu precisaria de um:

  imagem = REQUEST.get('imagem', '')

  Mas e depois, como usar a sintaxe do /MailHost para incluir um anexo?
  É possível?

  Abraço!
  Davi Lima

  --- Em zope-pt@yahoogrupos.com.br, Ricardo Dani [EMAIL PROTECTED] 
 escreveu

  
   Procure pelo contact-info.pt , é lá que você deve fazer isso.
  
   2008/2/19 Davi Medeiros [EMAIL PROTECTED]:

   
   
   
   
   
   
O que eu preciso fazer para acrescentar um campo de imagem (input
type=file) ao formulário de contact-info e ele ser enviado anexo para
o email? Onde fica a classe que faz esse mailing? É o melhor jeito de
obter esse resultado?
   
Por favor, quem puder, me tire essa dúvida.
   
Obrigado!
Davi Lima
   
   
  
  
  
   --
   Ricardo Lapa Dani
   http://www.paradigma.com.br
  

  



-- 
Fabiano Weimar dos Santos (xiru)
Weimar Consultoria

Hospedagem Plone, Zope e Python
http://www.pytown.com