No guia anterior sobre envio de e-mails no OJS com Gmail e Google Workspace, mostramos como configurar a retransmissão (relay) de emails por IP, via smtp-relay.gmail.com (para servidores com IP dedicado). Na prática, porém, um número crescente de contas Google Workspace não oferece mais a opção de senha de app, descontinuada e hospedagens compartilhadas não têm IP dedicado para cadastrar no relay. Neste guia mostramos o terceiro caminho, mais robusto e que funciona nesses dois cenários: autenticação via OAuth2 (XOAUTH2).
Quando usar este guia
- Se você possui uma conta Google Workspace e utiliza o Gmail para envios do OJS;
- Sua instalação do OJS está em hospedagem compartilhada, sem IP fixo para cadastrar no serviço de retransmissão SMTP do Workspace.
- Se
myaccount.google.com/apppasswordsretorna "a configuração que você está procurando não está disponível para sua conta".
1. Criar um projeto no Google Cloud
Acesse o Google Cloud Console logado com uma conta do próprio Workspace do domínio da revista e crie um novo projeto. Dê um nome descritivo de fácil identificação.


Depois, clique no botão de menu (3 traços) ao lado do nome Google Cloud, no canto superior esquerdo da tela, acesse APIs e serviços → Biblioteca e ative a Gmail API.




2. Tela de consentimento como app Interno
Em Google Auth Platform, acesse Público-alvo para criar um público Interno (Tela de Permissão OAuth → Público-alvo → Vamos começar).


No formulário de criação do público, preencha os campos conforme instruções abaixo e clique em Avançar em cada etapa:
- Informações do app
- Nome do app: OJS Revista Exemplo (informe o seu título)
- Email para suporte do usuário: selecione o email disponível (conta do Google Workspace).
- Público
- Selecione Interno.
- Dados de contato
- Digite os emails desejados para receber notificações sobre mudanças do projeto. Você pode inserir mais de 1 aqui.
- Concluir
- Marque a caixa de consentimento e continuar.
- Clique em Criar.

Essa opção evita todo o processo de verificação que o Google exige de apps externos que pedem escopo do Gmail.
3. Criar o cliente OAuth 2.0
Em Clientes, clique em Criar cliente, escolha o tipo Aplicativo da Web , dê um Nome ao cliente (pode ser o mesmo utilizado nas etapas anteriores) e adicione a URL https://developers.google.com/oauthplayground em URIs de redirecionamento autorizados e clique em Criar.



Na tela exibida, copie o Client ID e o Client Secret gerados e guarde em um bloco de notas. Vamos usá-los no próximo passo.

4. Gerar o refresh token
No OAuth 2.0 Playground (developers.google.com/oauthplayground), abra as configurações (ícone de engrenagem) e marque "Use your own OAuth credentials", colando o Client ID e o Client Secret do passo anterior, que você notou no bloco de notas. Clique em "Close", na sequência.

No Step 1, informe o escopo https://mail.google.com/ no campo abaixo da lista de escopos e clique no botão "Authorize APIs" ao lado. Faça login com a conta que vai enviar os emails pela revista e autorize o app.

No Step 2, clique em "Exchange authorization code for tokens" e copie o refresh_token — ele não expira. Armazene-o no bloco de notas, junto do Client ID e Client Secret.

5. Configurar o config.inc.php
Agora é a hora de utilizar o Client ID, Client Secret e Refresh Token armazenados no bloco de notas. Aplique as configurações abaixo no config.inc.php do seu OJS.
smtp = On
smtp_server = smtp.gmail.com
smtp_port = 587
smtp_auth = tls
smtp_authtype = XOAUTH2
smtp_username = Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.
; smtp_password =
smtp_oauth_provider = Google
smtp_oauth_email = Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.
smtp_oauth_clientid = [client id]
smtp_oauth_clientsecret = [client secret]
smtp_oauth_refreshtoken = [refresh token]
Repare que, nesta configuração, você não precisará preencher o campo smtp_password e, por isso, deve ficar comentado (ponto-vírgula à frente da linha).
6. Instalar a dependência no servidor
O OJS precisa da biblioteca league/oauth2-google, que normalmente não vem pronta na instalação. Via SSH, no diretório lib/pkp da sua instalação, execute os seguintes comandos:
cd ~/raiz-ojs/lib/pkp
curl -sS https://getcomposer.org/installer | php
/usr/local/phpXX/bin/php composer.phar require league/oauth2-google:^4.0
Troque phpXX pela versão de PHP do seu site (confirme com php -v).
Saída:
$ curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...
Composer (version 2.10.3) successfully installed to: /home/seu_usuario/raiz_ojs/lib/pkp/composer.phar
Use it: php composer.phar
$ /usr/local/php82/bin/php composer.phar require league/oauth2-google:^4.0
Deprecation Notice: Creation of dynamic property cweagans\Composer\Patches::$installedPatches is deprecated in /home/seu_usuario/raiz_ojs/lib/pkp/lib/vendor/cweagans/composer-patches/src/Patc./composer.json has been updated
More deprecation notices were hidden, run again with `-v` to show them.
Running composer update league/oauth2-google
Gathering patches for root package.
Loading composer repositories with package information Updating dependencies
Lock file operations: 3 installs, 0 updates, 0 removals
- Locking league/oauth2-client (2.7.0)
- Locking league/oauth2-google (4.2.0)
- Locking paragonie/random_compat (v9.99.100)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 38 installs, 0 updates, 0 removals
- Downloading paragonie/random_compat (v9.99.100)
- Downloading league/oauth2-client (2.7.0)
- Downloading league/oauth2-google (4.2.0)
- Downloading webmozart/assert (1.9.1)
- Downloading phpdocumentor/reflection-common (2.2.0)
- Downloading phpdocumentor/type-resolver (1.4.0)
- Downloading phpdocumentor/reflection-docblock (5.2.2)
- Downloading sebastian/version (3.0.2)
- Downloading sebastian/type (2.3.1)
- Downloading sebastian/resource-operations (3.0.3)
- Downloading sebastian/recursion-context (4.0.4)
- Downloading sebastian/object-reflector (2.0.4)
- Downloading sebastian/object-enumerator (4.0.4)
- Downloading sebastian/global-state (5.0.2)
- Downloading sebastian/exporter (4.0.3)
- Downloading sebastian/environment (5.1.3)
- Downloading sebastian/diff (4.0.4)
- Downloading sebastian/comparator (4.0.6)
- Downloading sebastian/code-unit (1.0.8)
- Downloading sebastian/cli-parser (1.0.1)
- Downloading phpunit/php-timer (5.0.3)
- Downloading phpunit/php-text-template (2.0.4)
- Downloading phpunit/php-invoker (3.1.1)
- Downloading phpunit/php-file-iterator (3.0.5)
- Downloading theseer/tokenizer (1.2.0)
- Downloading nikic/php-parser (v4.10.2)
- Downloading sebastian/lines-of-code (1.0.3)
- Downloading sebastian/complexity (2.0.2)
- Downloading sebastian/code-unit-reverse-lookup (2.0.3)
- Downloading phpunit/php-code-coverage (9.2.5)
- Downloading doctrine/instantiator (1.4.0)
- Downloading phpspec/prophecy (1.12.1)
- Downloading phar-io/version (3.0.4)
- Downloading phar-io/manifest (2.0.1)
- Downloading myclabs/deep-copy (1.10.2)
- Downloading phpunit/phpunit (9.5.2)
- Downloading dnoegel/php-xdg-base-dir (v0.1.1)
- Downloading psy/psysh (v0.10.4)
Gathering patches for root package.
Gathering patches for dependencies. This might take a minute.
- Installing paragonie/random_compat (v9.99.100): Extracting archive
- Installing league/oauth2-client (2.7.0): Extracting archive
- Installing league/oauth2-google (4.2.0): Extracting archive
- Installing webmozart/assert (1.9.1): Extracting archive
- Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
- Installing phpdocumentor/type-resolver (1.4.0): Extracting archive
- Installing phpdocumentor/reflection-docblock (5.2.2): Extracting archive
- Installing sebastian/version (3.0.2): Extracting archive
- Installing sebastian/type (2.3.1): Extracting archive
- Installing sebastian/resource-operations (3.0.3): Extracting archive
- Installing sebastian/recursion-context (4.0.4): Extracting archive
- Installing sebastian/object-reflector (2.0.4): Extracting archive
- Installing sebastian/object-enumerator (4.0.4): Extracting archive
- Installing sebastian/global-state (5.0.2): Extracting archive
- Installing sebastian/exporter (4.0.3): Extracting archive
- Installing sebastian/environment (5.1.3): Extracting archive
- Installing sebastian/diff (4.0.4): Extracting archive
- Installing sebastian/comparator (4.0.6): Extracting archive
- Installing sebastian/code-unit (1.0.8): Extracting archive
- Installing sebastian/cli-parser (1.0.1): Extracting archive
- Installing phpunit/php-timer (5.0.3): Extracting archive
- Installing phpunit/php-text-template (2.0.4): Extracting archive
- Installing phpunit/php-invoker (3.1.1): Extracting archive
- Installing phpunit/php-file-iterator (3.0.5): Extracting archive
- Installing theseer/tokenizer (1.2.0): Extracting archive
- Installing nikic/php-parser (v4.10.2): Extracting archive
- Installing sebastian/lines-of-code (1.0.3): Extracting archive
- Installing sebastian/complexity (2.0.2): Extracting archive
- Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive
- Installing phpunit/php-code-coverage (9.2.5): Extracting archive
- Installing doctrine/instantiator (1.4.0): Extracting archive
- Installing phpspec/prophecy (1.12.1): Extracting archive
- Installing phar-io/version (3.0.4): Extracting archive
- Installing phar-io/manifest (2.0.1): Extracting archive
- Installing myclabs/deep-copy (1.10.2): Extracting archive
- Installing phpunit/phpunit (9.5.2): Extracting archive
- Installing dnoegel/php-xdg-base-dir (v0.1.1): Extracting archive
- Installing psy/psysh (v0.10.4): Extracting archive
1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
74 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Found 80 security vulnerability advisories affecting 19 packages.
Run "composer audit" for a full list of advisories.
7. Testar
Reenvie uma notificação pelo próprio OJS e confira o log de e-mail. Se tudo estiver certo, o envio acontece sem erros de autenticação.
Isso funciona em qualquer servidor?
Os comandos deste tutorial não dependem da distribuição Linux do seu servidor e funcionam da mesma forma em qualquer host que ofereça acesso via SSH. O que realmente determina se você vai conseguir seguir os passos sem sustos é:
- Acesso SSH habilitado na sua conta. Alguns planos de hospedagem compartilhada mais simples não liberam isso por padrão e pode ser necessário solicitar ao suporte.
- Acesso de saída à internet liberado no terminal, para que o Composer consiga baixar os pacotes do GitHub e do Packagist. Hosts com firewall mais restritivo podem bloquear essa comunicação.
- A versão de PHP do terminal batendo com a versão do seu site. Sempre confira a versão do PHP com
php -vantes de rodar os comandos. Ophppadrão do shell pode estar numa versão diferente do PHP do site. - Memória suficiente liberada para o processo, já que hospedagens compartilhadas com limites baixos podem travar o Composer no meio da instalação.
O que muda de um provedor para outro, na prática, é só o caminho do binário do PHP. No servidor de exemplo (Ubuntu 24.04.4 LTS), usamos /usr/local/php82/bin/php; em servidores cPanel/WHM é comum encontrar algo como /opt/cpanel/ea-php82/root/usr/bin/php. Vale sempre confirmar esse caminho antes de repetir os comandos num servidor novo.
E na hora de atualizar o OJS?
Um detalhe importante a considerar: o processo padrão de atualização do OJS substitui todo o diretório lib/pkp, já que ele vem embutido no pacote da nova versão e e isso apaga a biblioteca league/oauth2-google que instalamos manualmente.
Assim, além de preservar os parâmetros de configuração SMTP no config.inc.php, será preciso repetir o passo de instalação via Composer depois de cada atualização de versão do OJS. Vale a pena conferir nas notas de lançamento de cada nova versão se essa dependência passou a vir inclusa por padrão, isso tornaria esse passo extra desnecessário no futuro.
Se você precisa de suporte técnico funcional ou avançado para melhor aproveitamento do seu OJS, entre em contato com a GeniusDesign e solicite uma cotação.
Quer receber mais tutoriais como este direto no seu e-mail? Assine nossa newsletter e fique por dentro das novidades sobre OJS, editoração científica e gestão de periódicos.