J'écris une application qui teste les adresses e-mail, pour une partie de cela, j'ai besoin d'envoyer une petite quantité de données à une adresse email pour la valider complètement, j'utilise actuellement des sockets pour cela. Pendant que je testais, j'ai utilisé un serveur SMTP d'amis pour tester, et mon socket fonctionnait bien, mais quand j'essayais la même chose sur un gros fournisseur d'email (gmail, hotmail, etc.) il n'en avait pas. Maintenant que j'en suis arrivé à la conclusion qu'il s'agit d'authentification et de sécurité, j'ai testé l'envoi d'un message à gmail en utilisant .Nets construit dans SmtpClient et divers objets Mail en utilisant SslEnabled et en lui donnant les informations d'identification demandées. travailler.C# SMTP Problèmes de socket
Ce que je dois accomplir est:
envoyer ces données sans avoir à fournir des détails de connexion purement agissant comme un échange. également un moyen d'encorper la sécurité SSL dans ma socket.
Toute aide avec tout cela serait géniale et appréciée! Code ci-dessous ...
/// <summary>
/// Opens up the socket and begins trying to connect to the provided domain
/// </summary>
/// <param name="domain">The domain listening on SMTP ports</param>
/// <param name="recipient">The email recipient</param>
/// <returns>Bool verifying success</returns>
public static bool ActivateSocket(string domain, string recipient)
{
//X509Certificate cert = new X509Certificate();
//Prepare our first command
string SMTPcommand = "HELO www.codegremlin.co.uk\r\n";
Encoding ASCII = Encoding.ASCII;
//convert to byte array and get the buffers ready
Byte[] ByteCommand = ASCII.GetBytes(SMTPcommand);
Byte[] RecvResponseCode = new Byte[3];
Byte[] RecvFullMessage = new Byte[256];
//method response value
bool TransactionSuccess = false;
try
{
// do all of this outside so its fresh after every iteration
Socket s = null;
IPEndPoint hostEndPoint;
IPAddress hostAddress = null;
int conPort = 587;
// get all the ip's assosciated with the domain
IPHostEntry hostInfo = Dns.GetHostEntry(domain);
IPAddress[] IPaddresses = hostInfo.AddressList;
// go through each ip and attempt a connection
for (int index = 0; index < IPaddresses.Length; index++)
{
hostAddress = IPaddresses[index];
// get our end point
hostEndPoint = new IPEndPoint(hostAddress, conPort);
// prepare the socket
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.ReceiveTimeout = 2000;
s.SendTimeout = 4000;
try { s.Connect(hostEndPoint); }
catch { Console.WriteLine("Connection timed out..."); }
if (!s.Connected)
{
// Connection failed, try next IPaddress.
TransactionSuccess = false;
s = null;
continue;
}
else
{
// im going through the send mail, SMTP proccess here, slightly incorrectly but it
//is enough to promote a response from the server
s.Receive(RecvFullMessage);
Console.WriteLine(ASCII.GetString(RecvFullMessage));
s.Send(ByteCommand, ByteCommand.Length, 0);
s.Receive(RecvFullMessage);
Console.WriteLine(ASCII.GetString(RecvFullMessage));
ByteCommand = ASCII.GetBytes("MAIL FROM:[email protected]\r\n");
s.Send(ByteCommand, ByteCommand.Length, 0);
s.Receive(RecvFullMessage);
Console.WriteLine(ASCII.GetString(RecvFullMessage));
ByteCommand = ASCII.GetBytes("RCPT TO:[email protected]\r\n");
s.Send(ByteCommand, ByteCommand.Length, 0);
s.Receive(RecvFullMessage);
Console.WriteLine(ASCII.GetString(RecvFullMessage));
ByteCommand = ASCII.GetBytes("DATA\r\n");
s.Send(ByteCommand, ByteCommand.Length, 0);
s.Receive(RecvFullMessage);
Console.WriteLine(ASCII.GetString(RecvFullMessage));
ByteCommand = ASCII.GetBytes("this email was sent as a test!\r\n.\r\n");
s.Send(ByteCommand, ByteCommand.Length, 0);
s.Receive(RecvFullMessage);
Console.WriteLine(ASCII.GetString(RecvFullMessage));
ByteCommand = ASCII.GetBytes("SEND\r\n");
s.Send(ByteCommand, ByteCommand.Length, 0);
s.Receive(RecvFullMessage);
Console.WriteLine(ASCII.GetString(RecvFullMessage));
ByteCommand = ASCII.GetBytes("QUIT\r\n");
s.Send(ByteCommand, ByteCommand.Length, 0);
s.Receive(RecvFullMessage);
Console.WriteLine(ASCII.GetString(RecvFullMessage));
int i = 0;
TransactionSuccess = true;
}
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
catch (NullReferenceException e)
{
Console.WriteLine("NullReferenceException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
catch (Exception e)
{
Console.WriteLine("Exception caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
return TransactionSuccess;
}
Désolé, supprimé mon message car il était inexact. Merci pour les corrections, @Daniel A. White et @Storm – David
Salut, quel est le but de ce code? Il ressemble à un épurateur de liste de diffusion à des fins de spam. De toute façon, je vous suggère de regarder l'erreur que vous recevez du serveur auquel vous vous connectez et d'en déduire une solution. Sans une indication claire du problème, il est difficile de suggérer des solutions. – Lazarus
le but est purement la validation par courriel, im sur le bon côté de la guerre sur le spam: P – DevlopingTheNextGen