Problema ao enviar e-mail usando C #
Pergunta
Quando tento enviar e-mail usando C # com o servidor SMTP do Gmail, eu recebo este erro ..
"O certificado remoto é inválido de acordo com o procedimento de validação".
SSL está habilitado
Port utilizado é 587
nome do servidor utilizado é "Smtp.gmail.com".
nome de usuário e senha está correta ??p>
Outlook Express funciona bem no mesmo PC com as mesmas configurações
O # programa c também funciona bem em outros lugares ... nós receber este erro apenas no local clientes.
gostaria de receber qualquer ajuda ..
Graças
Edit: @ Andomar, Onde posso encontrar os certificados de raiz no cliente? Como faço para corrigir isso?
@ Alnitak, Como posso emitir STARTTLS usando biblioteca System.Net.Mail embora?
@ David, O que eu passar como parâmetro para "(object sender, certificado X509Certificate, cadeia X509Chain, SslPolicyErrors sslPolicyErrors)"
Graças David. Eu adicionei essas linhas. Mas, eu ainda estou confuso sobre o que está acontecendo uma vez que este código não tem qualquer ligação direta com System.Net.Mail tanto quanto a minha understanding.Hope o problema desaparece.
Solução
Além disso, verifique que os certificados de raiz estão em Trusted loja Autoridade Raiz do Cliente. Se esta é a partir de um serviço, em seguida, adicionar os certificados de raiz para o armazenamento do computador local também pode ajudar. Para obter uma melhor compreensão da razão, então eu encontrei a seguinte política de útil ...
public bool ValidateServerCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// No errors so continue…
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
// I’m just logging it to a label on the page,
// this should be stored or logged to the event log at this time.
lblStuff.Text += string.Format("Certificate error: {0} <BR/>", sslPolicyErrors);
// If the error is a Certificate Chain error then the problem is
// with the certificate chain so we need to investigate the chain
// status for further info. Further debug capturing could be done if
// required using the other attributes of the chain.
if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
{
foreach (X509ChainStatus status in chain.ChainStatus)
{
lblStuff.Text += string.Format("Chain error: {0}: {1} <BR/>", status.Status, status.StatusInformation);
}
}
// Do not allow this client to communicate
//with unauthenticated servers.
return false;
}
Para adicionar a diretiva, use o seguinte, isso só precisa ser feito uma vez para o domínio de aplicação.
using System.Net;
...
ServicePointManager.ServerCertificateValidationCallback =
new Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
Você também pode usar a política para remover o erro por completo, mas seria melhor para resolver o problema do que fazer isso.
Outras dicas
Verifique se os certificados raiz apropriados estão na loja do cliente. E data do sistema do cliente está correta.
Você está usando STARTTLS
ou assumindo que a conexão na porta 587 é SSL criptografada desde o início?
servidores do Google sobre smtp.gmail.com
exigem STARTTLS.
Você definiu
client.EnableSsl = true;
Como o Gmail precisa