Gmail API em pythonanywhere

112 views
Skip to first unread message

Amauri Rossetti Giovani

unread,
Sep 8, 2016, 12:06:49 AM9/8/16
to web2py-users-brazil
Estou com um problema com a Gmail API em pythonanywhere.
Localmente funciona mas no pythonanywhere não encontra o arquivo client_secret.json que está no mesmo diretório de default.py, em controllers.
Alguém saberia me informar porque acontece isso?
Mudei o caminho no default.py e agora ele localiza o arquivo, porém surgiu outro problema: <type 'exceptions.EOFError'> EOF when reading a line. Pesquisei na internet incansavelmente sem encontrar uma solução para o caso. Agradeço se alguém puder ajudar.

Carlos Costa

unread,
Sep 8, 2016, 7:30:13 AM9/8/16
to web2py-us...@googlegroups.com
Mostra o trecho de código que causa isso pra ficar mais fácil de tentar ajudar.

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--


Carlos J. Costa
Cientista da Computação  | BS Computer Science
Esp. Gestão em Telecom   |
PgC Telecom Mangement
<º))><

Amauri Rossetti Giovani

unread,
Sep 8, 2016, 7:54:50 PM9/8/16
to web2py-users-brazil
Olá Carlos.

Antes de mais nada, obrigado pelo interesse.
O código está um pouco grande e não há nada de errado com ele pois funciona localmente. O mesmo código em Pythonanywhere é que não funciona. De qualquer forma, vou colocá-lo aqui. 
Para testar o código abaixo, terá que criar chave da API para gerar o arquivo "client_secret.json" no Google e instalar as dependências. Se quiser, pode seguir os passos em https://developers.google.com/gmail/api/quickstart/python . 

A função a seguir está em controllers/default.py e na view email.html. As funções foram copiadas do Gmail API e só fiz as alterações necessárias para enviar o email.
Na linha "CLIENT_SECRET_FILE = 'client_secret.json'" tem que colocar o caminho correto. A forma como está é com o arquivo no mesmo diretório de default, como manda a Gmail API. No meu caso, mudei para a pasta "private" e indiquei o caminho.


from __future__ import print_function

import base64
import os
from email.mime.text import MIMEText

import httplib2
import oauth2client
from apiclient import discovery
from apiclient import errors
from oauth2client import client
from oauth2client import tools


def email():
    
    try:
        import argparse
        flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
    except ImportError:
        flags = None

    # If modifying these scopes, delete your previously saved credentials
    # at ~/.credentials/gmail-python-quickstart.json
    CLIENT_SECRET_FILE = 'client_secret.json'
    APPLICATION_NAME = 'Gmail API Python Quickstart'


    def get_credentials():
        """Gets valid user credentials from storage.

        If nothing has been stored, or if the stored credentials are invalid,
        the OAuth2 flow is completed to obtain the new credentials.

        Returns:
            Credentials, the obtained credential.
        """
        home_dir = os.path.expanduser('~')
        credential_dir = os.path.join(home_dir, '.credentials')
        if not os.path.exists(credential_dir):
            os.makedirs(credential_dir)
        credential_path = os.path.join(credential_dir,
                                       'gmail-python-quickstart.json')

        store = oauth2client.file.Storage(credential_path)
        credentials = store.get()
        if not credentials or credentials.invalid:
            flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
            flow.user_agent = APPLICATION_NAME
            if flags:
                credentials = tools.run_flow(flow, store, flags)
            else: # Needed only for compatibility with Python 2.6
                credentials = tools.run(flow, store)
            print('Storing credentials to ' + credential_path)
        return credentials


    def SendMessage(service, user_id, message):
        """Send an email message.

        Args:
        service: Authorized Gmail API service instance.
        user_id: User's email address. The special value "me"
        can be used to indicate the authenticated user.
        message: Message to be sent.

        Returns:
        Sent Message.
        """

        try:
            message = (service.users().messages().send(userId="me", body=message).execute())
            print ('Message Id: %s' %message['id'])
            return message
        except errors.HttpError, error:
            print ('An error occurred: %s' % error)


    def create_message(sender, to, subject, message_text):
        """Create a message for an email.

        Args:
        sender: Email address of the sender.
        to: Email address of the receiver.
        subject: The subject of the email message.
        message_text: The text of the email message.

        Returns:
        An object containing a base64url encoded email object.
        """
        message = MIMEText(message_text)
        message['to'] = to
        message['from'] = sender
        message['subject'] = subject
        return {'raw': base64.urlsafe_b64encode(message.as_string())}

    def main():
        """Shows basic usage of the Gmail API.

        Creates a Gmail API service object and outputs a list of label names
        of the user's Gmail account.
        """
        credentials = get_credentials()
        http = credentials.authorize(httplib2.Http())
        service = discovery.build('gmail', 'v1', http=http)

        destinatarios = ["seue...@teste.com.br", "seuout...@teste.com"]

        assunto_email = "E-mail enviado de um script em Python"

        texto_mensagem = """
        Mensagem de teste.
        """

        for destinatario in destinatarios:
            print(destinatario)
            message = create_message(
                'me', destinatario, assunto_email, texto_mensagem
            )
            SendMessage(service, destinatario, message)
    main()
    return dict()


Valeu!!!

Carlos Costa

unread,
Sep 9, 2016, 12:50:55 AM9/9/16
to web2py-us...@googlegroups.com
Pelo que voce disse e ja que voce nao apontou a linha ou o stack trace do erro, estou deduzindo que o erro esta no carregamento do arquivo local.
Porem se nao confirmou isso ainda, seria bom averiguar onde exatamente ocorre esse erro pois pode ser numa leitura via http, ou seja, ja na comunicacao com o google.

Nao sei agora a url que essa api usa, mas se for gmail... alguma coisa, ela nao esta no whitelist no pythonanywhere e portanto vai ser recusada.
Isso nas contas gratuitas, que tambem nao sei se e o caso.

ps.: desculpa a falta de acentuacao. Deu a pau aqui e to com preguica de arrumar agora.

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Amauri Rossetti Giovani

unread,
Sep 9, 2016, 1:21:06 AM9/9/16
to web2py-users-brazil
Puxa, obrigado Carlos. Eu não sabia dessa lista no pythonanywhere para contas gratuitas. Só coloquei lá para testar mesmo. Procurarei outra alternativa então. Algum que você indicaria só para testar por enquanto? Heroku?
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com

Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Carlos Costa

unread,
Sep 9, 2016, 7:23:12 AM9/9/16
to web2py-us...@googlegroups.com
Nunca usei Heroku.
Além de Pythonanywhere só usei vps pago.
Tenho usado o minivps que é bem barato e tem assistência e pagamento no Brasil.
Pago R$ 35.

Pesquise por "freep vps", talvez encontre algum que seja viável para você testar.


Para se desinscrever, envie email a: web2py-users-brazil+unsubscribe...@googlegroups.com

Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsubscribe...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--


Carlos J. Costa
Cientista da Computação  | BS Computer Science
Esp. Gestão em Telecom   |
PgC Telecom Mangement
<º))><

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com

Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Amauri Rossetti Giovani

unread,
Sep 9, 2016, 9:41:03 AM9/9/16
to web2py-users-brazil
Obrigado pelas dicas Carlos.
Assim que eu tiver uma solução que funcione, coloco aqui e marco como concluído.

Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--


Carlos J. Costa
Cientista da Computação  | BS Computer Science
Esp. Gestão em Telecom   |
PgC Telecom Mangement
<º))><

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Amauri Rossetti Giovani

unread,
Sep 13, 2016, 5:39:38 PM9/13/16
to web2py-users-brazil
Olá Carlos.
Vou continuar esse projeto de outra forma, enviando login pelo mailler mesmo. Pelo menos está funcionando pra teste no pythonanywhere. Só que tive que ativar o acesso a aplicativos desconhecidos no Gmail.
Outra coisa, a senha não pode ficar exposta no meu código em db.py. Tem alguma forma de escondê-la? Fiz uma função para converter em base64 mas não sei se é a melhor forma de se fazer isso.
Ou o que você sugere para envio de e-mails sem passar por essas questões acima?
Tenho chave e aplicativo na API do Gmail porém estou com essa dificuldade.
Agradeço pela atenção.

Filipe Cifali

unread,
Sep 13, 2016, 5:40:35 PM9/13/16
to web2py-us...@googlegroups.com
Me intrometendo: base64 tem decode...

O mais prático é gravar a senha em uma variável de ambiente

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com

Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
[ ]'s

Filipe Cifali Stangler

Marlysson Silva

unread,
Sep 19, 2016, 9:39:14 AM9/19/16
to web2py-users-brazil
Para o caso da chave do gmail adiciona ela em um arquivo chaves.json na pasta privates do diretório do web2py e adiciona ela no .gitignore para não enviar pro repositório, usando um repo privado tipo o bitbucket.

Mas se vai usar um repo público a solução é variáveis de ambiente.

Para esconder dados sensíveis é recomendável como foi falado usar variáveis de ambiente, usando .getenv() do módulo do python.
Assim só seria definido na sua máquina ou se alguém baixasse seu projeto teria que definir essas variáveis e começar a usar.

Amauri Rossetti Giovani

unread,
Sep 20, 2016, 9:30:06 AM9/20/16
to web2py-users-brazil
Obrigado Filipe. Tentarei essa alternativa mas estou focado em fazer funcionar com a API Gmail, já que funcionou perfeitamente na máquina local. Retorno informando sobre a questão da variável de ambiente.

Amauri Rossetti Giovani

unread,
Sep 20, 2016, 9:38:53 AM9/20/16
to web2py-users-brazil
Obrigado Marlysson.
A princípio não estou tão preocupado em esconder esse arquivo. Quero entender porque não funciona no pythonanywhere e no Heroku também . Não sei se preciso configurar wsgi, especificar algo no Google APIs ou outra coisa. Estou pesquisando porém estou com dificuldades.
Assim que tiver uma conclusão, posto o passo a passo.

Amauri Rossetti Giovani

unread,
Sep 24, 2016, 5:26:36 PM9/24/16
to web2py-users-brazil
Voltando aqui com a primeira parte sobre como configurei as variáveis de ambiente no Pythonanywhere. A outra parte postarei quando implementar a API Gmail que não usará essas configurações.
Se tiver algo que possa melhorar, por favor postem aqui pra que sirva de exemplo pra quem precisar.

Esse código está funcionando perfeitamente no Pythonanywhere com Web2Py. 
Só precisa mudar os endereços de email pra funcionar e a senha, claro, rss.

No Gmail tem que desativar a proteção contra aplicativos menos seguros:
Minha conta -> Aplicativos e sites conectados -> Permitir aplicativos menos seguros: ATIVADA

No arquivo "amaurirg_pythonanywhere_com_wsgi.py":
os.environ["EMAIL"] = "amauri....@gmail.com"
os.environ["PASS"] = "senha"

No model "db.py":
mail = auth.settings.mailer
mail.settings.server = 'smtp.gmail.com:587'
mail.settings.sender = 'Amauri'
email = os.environ.get('EMAIL')
password = os.environ.get('PASS')
email_pass = '{0}:{1}'.format(email, password)
mail.settings.login = email_pass
# mail.settings.tls = myconf.get('smtp.tls') or False
# mail.settings.ssl = myconf.get('smtp.ssl') or False

No controller "default.py":
def send_email():
    envio = mail.send(to=['em...@destinatario.com'],
        subject='Teste de envio',
        message="""<html><p>Este e-mail foi enviado através do app em Web2Py 
hospedado em Pythonanywhere</p></html>""")
    return dict(envio=envio, email=os.getenv("EMAIL"), password=os.getenv("PASS"))

Somente para testar, criei essa view bem simples "send_email.html":
{{extend "layout.html"}}
    <h5>ENVIO: {{=envio}}</h5>
    <h5>EMAIL: {{=email}}</h5>
    <h5>PASSWORD: {{=password}}</h5>
    {{if envio == True:}}
        <h3>Email enviado com sucesso!</h3>
    {{else:}}
        <h3>ERRO no envio do e-mail.</h3>
    {{pass}}


As duas opções funcionam com os.getenv("PASS") ou os.environ.get('PASS') para pegar a variável de ambiente.














Como esse tópico acabou se  dividindo em duas partes, uma com SMTP e outra(não concluída ainda), posso marcar como concluído agora ou dá pra continuar o tópico até a solução para API do Gmail?


Valeu pela ajuda até agora.

Amauri


Em quinta-feira, 8 de setembro de 2016 01:06:49 UTC-3, Amauri Rossetti Giovani escreveu:

Marlysson Silva

unread,
Sep 26, 2016, 6:31:14 AM9/26/16
to web2py-users-brazil
Isso vale um post sobre problemas com envio de emails que podem surgir no web2py hein kkk

Esse envio já não foi com o servidor do gmail?

Amauri Rossetti Giovani

unread,
Sep 26, 2016, 2:00:08 PM9/26/16
to web2py-users-brazil
Sim, foi enviado com o servidor do gmail, porém tem aquele negócio de deixar sua conta desprotegida de aplicativos menos seguros.
Onde costumam postar?

Com a API Gmail, o remetente libera o acesso no gmail autorizando um aplicativo criado no console.developers.google.com a enviar o email uma única vez e deixa a conta protegida de aplicativos menos seguros.
Como você mencionou anteriormente Marlysson, existe o caso do arquivo "client_secret.json" em "private" na minha app. O que não entendo é porque quando está no pythonanywhere, ele não cria um arquivo que vai para a pasta ".credentials" com o nome da aplicação. Localmente roda sem problemas porque esse arquivo é criado. Se souber de algo que possa ajudar pois estou confuso com essa parte.
Segue o trecho do código:

home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
      os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir,
                          'gmail-python-quickstart.json')
store = oauth2client.file.Storage(credential_path)
credentials = store.get()


Amauri

Marlysson Silva

unread,
Sep 26, 2016, 7:10:37 PM9/26/16
to web2py-users-brazil
Com relação à postar , uso um blog hospedado no github :D , cria um blog pra postar essas coisas e tal..

Posso estar errado mas pastas começando com "." ficam ocultas não? tenta dá um ls na pasta private pra ver..

Amauri Rossetti Giovani

unread,
Sep 27, 2016, 3:05:11 PM9/27/16
to web2py-users-brazil
Legal Marlysson. Acho que vou usar o github pages então pra criar um blog com essas postagens. Tenho mais outras coisas que ajudarão outras pessoas.

Outra coisa: a pasta ".credentials' ele cria na raiz mas o arquivo não. O que eu fiz: upload do arquivo que roda localmente "gmail-python-quickstart.json" (que foi criado com o código que postei anteriormente) e coloquei dentro dessa pasta ".credentials". Daí ele envia e-mail com Gmail API e com a conta protegida de aplicativos menos seguros. Mas não é o certo. Preciso descobrir porque ele não cria esse arquivo. Não sei como retornar a resposta do google pra verificar esse erro.

Amauri Rossetti Giovani

unread,
Sep 27, 2016, 3:07:39 PM9/27/16
to web2py-users-brazil
Carlos, acho que não é problema de whitelist e sim o que mencionei no post acima. Mas vou verificar direito antes de afirmar. Pode ser que ele não acesse https://accounts.google.com/o/oauth2/token pra autenticar? Mas "accounts" é subdomínio do ".google.com" como especifica na whitelist. Então acho que não haveria problema. Estou certo?


Em sexta-feira, 9 de setembro de 2016 01:50:55 UTC-3, Carlos Costa escreveu:
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com

Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Carlos Costa

unread,
Sep 27, 2016, 4:33:09 PM9/27/16
to web2py-us...@googlegroups.com
se filtram subdomínio ou não, aí depende de como eles fazem



Para se desinscrever, envie email a: web2py-users-brazil+unsubscribe...@googlegroups.com

Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsubscribe...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--


Carlos J. Costa
Cientista da Computação  | BS Computer Science
Esp. Gestão em Telecom   |
PgC Telecom Mangement
<º))><

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com

Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Leandro Paz

unread,
May 30, 2017, 5:39:55 PM5/30/17
to web2py-users-brazil
Fiz conforme  https://developers.google.com/gmail/api/quickstart/python

Criei as credenciais e gerei o arquivo client_secret.json

Mas onde devo colocar o arquivo client_secret.json?

Executei no terminal do servidor o arquivo quickstart.py no mesmo diretório  client_secret.json, pediu minha conta do gmail e minha senha. Logou no terminal! Mas continuo com o problema de envio de emails na aplicação! 

A pasta ".credentials" está vazia.

Erro:
Mail.send failure:[Errno 1] _ssl.c:510: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 

Uma aplicação web sem envio de email não serve! Preciso de solução alternativa.

Alguém tem alguma sugestão que tenha funcionado?


Milton A

unread,
May 30, 2017, 5:42:38 PM5/30/17
to web2py-us...@googlegroups.com

Leandro Paz

unread,
May 30, 2017, 7:15:36 PM5/30/17
to web2py-users-brazil
Obrigado Carlos.
Funcionou! Continuo sem a função de recuperação de senha pois ela usa mail.send mas pelo menos tenho uma alternativa que funciona para o resto da aplicação.

Leandro Paz

unread,
May 30, 2017, 7:23:48 PM5/30/17
to web2py-users-brazil
Para a recuperação de senha a solução foi comentar a comentar a seguinte linha (em db.py)
#mail.settings.ssl = myconf.get('smtp.ssl') or False

Carlos Costa

unread,
May 31, 2017, 7:30:10 AM5/31/17
to web2py-us...@googlegroups.com
Muito bom.

Em 30 de maio de 2017 20:23, Leandro Paz <leandro....@gmail.com> escreveu:
Para a recuperação de senha a solução foi comentar a comentar a seguinte linha (em db.py)
#mail.settings.ssl = myconf.get('smtp.ssl') or False

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages