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 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" <gauchoo@> escreveu
> >
> >  >
> >  > Procure pelo contact-info.pt , é lá que você deve fazer isso.
> >  >
> >  > 2008/2/19 Davi Medeiros <davi@>:
> >
> >  > >
> >  > >
> >  > >
> >  > >
> >  > >
> >  > >
> >  > > 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
>


Responder a