PROBLEMA: Database Mail x SMTP

Olá pessoal tudo certo? Espero que sim!

Hoje vou falar sobre um problema que passei envolvendo o Database Mail do SQL Server.

O que é o Database Mail?

De acordo com o Books Online, o Database Mail é uma forma de enviar e-mails a partir do SQL Server, podendo incluir resultados de queries e outros.

O Database Mail pode parar de funcionar por algumas razões. No caso de hoje vou descrever uma falha envolvendo o relay em um servidor SMTP.

O problema...

Notei que deixei de receber alguns e-mails de alerta de uma instância do SQL Server.

Investigando...

O Database Mail possui algumas pontos a serem verificados, no site da Microsoft existe um passo a passo de como proceder:


Vou resumir brevemente cada um destes passos.

1. Para verificar se o Database Mail está habilitado, rode os comandos abaixo:

SP_CONFIGURE 'SHOW ADVANCED', 1;
GO
RECONFIGURE;
GO
SP_CONFIGURE;
GO
sp_configure 'Database Mail XPs'
GO

O valor deve ser = 1.

2. Para fazer uso do Database Mail, dentro do SQL Server os usuários devem ter permissões na Role DatabaseMailUserRole dentro da base msdb, usuários sysadmin e db_owner automaticamente já pertencem a esta Role. Rode o comando abaixo para listar os membros da Role:

EXEC msdb.sys.sp_helprolemember 'DatabaseMailUserRole'

Para adicionar usuários a Role rode o comando abaixo:

sp_addrolemember @rolename = 'DatabaseMailUserRole'
   ,@membername = '<database user>';

3. Ao menos um profile deve estar acessível aos usuários, para listar os usuários e profiles que eles possuem acesso rode o comando abaixo:

EXEC msdb.dbo.sysmail_help_principalprofile_sp;

Para testar um profile use o Send Test E-mail, conforme imagens abaixo:


4. O Database Mail deve estar iniciado, verifique isso com o comando abaixo:

EXEC msdb.dbo.sysmail_help_status_sp

Se ele não estiver iniciado, rode o comando abaixo:

EXEC msdb.dbo.sysmail_start_sp;

Se ele estiver iniciado, verifique o status da fila de e-mails com o comando abaixo:

EXEC msdb.dbo.sysmail_help_queue_sp @queue_type = 'mail';

O resultado deve ser deve ser RECEIVES_OCCURRING:

5. Por fim, para verificar erros do Database Mail, rode o comando abaixo:

SELECT * FROM msdb.dbo.sysmail_event_log;

Foi justamente no comando anterior que vi a primeira pista do problema. Nas ultimas linhas, que representavam os e-mails mais recentes que foram preparados para envio, havia a seguinte mensagem na coluna description:

The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2015-06-10T15:48:17). Exception Message: Cannot send mails to mail server. (Transaction failed. The server response was: 5.7.1 < ServidorSMTP.sqlmagu.com.br [99.999.9.999]>: Client host rejected: Access denied).

Notem o que marquei em amarelo. Pesquisando em alguns sites, descobri que este erro estava relacionado à comunicação com o servidor SMTP.

O que é SMTP?

O SMTP (Simple Mail Transfer Protocol) é um protocolo que permite o envio de e-mails. O Database Mail usa de um ou mais servidores SMTP para enviar e-mails.

Como resolver isso?

Tendo em mente que temos uma falha com o servidor SMTP, podemos seguir os passos do link abaixo e usar o Telnet para validar o seu funcionamento.


Faça o seguinte:

1. Veja quais os servidores SMTP que o Database Mail está utilizando. Os nomes dos servidores são retornados executando a procedure sysmail_help_account_sp no msdb, na coluna servername:

use msdb
go
sysmail_help_account_sp

2. Abra um prompt de comando elevado, digite “telnet” e pressione Enter:


3. Digite “set LocalEcho” e pressione Enter:


4. Digite “open mailrelay.sqlmagu.com.br 25” e pressione Enter (troque a parte em amarelo pelo nome do servidor SMTP obtido no passo 1).

Foi exatamente nesta etapa que confirmei o problema, vejam a mensagem que recebi quando tentei abrir comunicação no relay:

554 5.7.1 < ServidorSMTP.sqlmagu.com.br[99.999.9.99]>: Client host rejected
: Access denied

Connection to host lost.

Press any key to continue...

Obs: relay é uma condição que permite que e-mails sejam repassados entre servidores SMTP.

Lembram-se da mensagem no log do Database Mail?

The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2015-06-10T15:48:17). Exception Message: Cannot send mails to mail server. (Transaction failed. The server response was: 5.7.1 < ServidorSMTP.sqlmagu.com.br [99.999.9.999]>: Client host rejected: Access denied).

Pois bem, visto esta falha de comunicação entre o servidor da instância do SQL Server e o servidor de SMTP, acionei os responsáveis e estes efetuaram a liberação da comunicação, após isso, tentei novamente o comando de "open" e notem a diferença:

220 ServidorSMTP.sqlmagu.com.br ESMTP MAGU Inbound Relay

Feito o acerto da comunicação, podemos prosseguir com o teste...

5. Digite “helo me” e pressione Enter:

helo me250 ServidorSMTP.sqlmagu.com.br says HELO to 99.999.9.99:99999

6. Digite: "mail from: origem@sqlmagu. com.br"  e pressione Enter, trocando a parte em amarelo pela origem que desejar:

mail from: origem@sqlmagu.com.br250 MAIL FROM accepted

7. Digite: "rcpt to: destino@sqlmagu.com.br" e pressione Enter, trocando a parte em amarelo pelo destinatário que desejar:

rcpt to: destino@sqlmagu.com.br250 RCPT TO accepted

8. Digite “data” e pressione Enter:

data
354 continue.  finished with "\r\n.\r\n"

9. Digite: "Subject: This is a test" e pressione Enter duas vezes:

Subject: This is a test

10. Digite o corpo da mensagem, pressione Enter, digite “.” na nova linha e pressione Enter novamente:

this is a test...
.

250 OK EA/99-99999-99999999

11. Para finalizar, digite “quit” e pressione Enter:

quit
221 ServidorSMTP.sqlmagu.com.br closing connection

Connection to host lost.

Press any key to continue...

12. Pronto! Após estas etapas é esperado que um e-mail chegue até o destinatário que foi definido para o teste. Problema solucionado!

É isso pessoal! Espero que tenha sido útil! Um abraço!

Outras Fontes:

Nenhum comentário:

Postar um comentário