|
442
|
Programación / .NET (C#, VB.NET, ASP) / Menús en modo consola
|
en: 3 Febrero 2019, 08:54 am
|
Hola: Estoy usando la consola de C#, me dio ahora por el retro.  Hice este menú de opciones, pero no hace nada. Por ahora solo selecciona las opciones. Lo que no se es como entrar en otra opción dentro de ella en DOS al pulsar Enter. Estoy en el submenú que sale un menaje que diga. Estoy dentro de la opción DOS. Con capacidad de pulsar Escape y vuelva al menú principal. Lo que he hecho hasta ahora es solo esto. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Menu_consola_02_cs { class Program { static void Main(string[] args) { // Título de la ventana. Console.Title = "Menú de opciones"; // Tamaño ventana consola. Console.WindowWidth = 20; // X anchura. Console.WindowHeight = 8; // Y altura. // Cursor invisible. Console.CursorVisible = false; //Contador de teclas y navegador int contador = 0; //tomar la tecla para validar luego ConsoleKey tecla; //escondo el cursor Console.CursorVisible = false; do { //****************************************************************** //Pinto el menú Console.Clear(); Console.Write("╔══════════════════╗\n"); if (contador == 0) { Console.BackgroundColor = ConsoleColor.White; Console.ForegroundColor = ConsoleColor.Black; Console.Write("║ UNO ║\n"); Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; } else { Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; Console.Write("║ UNO ║\n"); } if (contador == 1) { Console.BackgroundColor = ConsoleColor.White; Console.ForegroundColor = ConsoleColor.Black; Console.Write("║ DOS ║\n"); Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; } else { Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; Console.Write("║ DOS ║\n"); } if (contador == 2) { Console.BackgroundColor = ConsoleColor.White; Console.ForegroundColor = ConsoleColor.Black; Console.Write("║ TRES ║\n"); Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; } else { Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; Console.Write("║ TRES ║\n"); } if (contador == 3) { Console.BackgroundColor = ConsoleColor.White; Console.ForegroundColor = ConsoleColor.Black; Console.Write("║ CUATRO ║\n"); Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; } else { Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; Console.Write("║ CUATRO ║\n"); } if (contador == 4) { Console.BackgroundColor = ConsoleColor.White; Console.ForegroundColor = ConsoleColor.Black; Console.Write("║ ESC = SALIR ║\n"); Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; } else { Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.White; Console.Write("║ ESC = SALIR ║\n"); } Console.Write("╚══════════════════╝\n"); //Fin de pintar el menú //****************************************************************** //leer tecla ingresada por el usuario tecla = Console.ReadKey(true).Key; //validar el tipo de tecla if (tecla == ConsoleKey.DownArrow) { contador += 1; } if (tecla == ConsoleKey.UpArrow) { contador -= 1; } //valido que el conteo de teclas no supere el rango establecido por los Ifs de más arriba if (contador > 4) { contador = 4; } if (contador < 0) { contador = 0; } //uso la tecla escape como salida } while (tecla != ConsoleKey.Escape); } } }
No logro cuajarlo como si se ha hecho por aquí en este otro ejemplo de abajo. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Menu_y_opciones_consola_02_cs { class Program { static void Main(string[] args) { // Título de la ventana. Console.Title = "Menú y opciones C# 2017"; // Tamaño ventana consola. Console.WindowWidth = 30; // X. Ancho. Console.WindowHeight = 17; // Y. Alto. // Cursor invisible. Console.CursorVisible = false; // Cuadro doble borde ventana. Menu_y_opciones_consola_02_cs.Cuadro.cuadrado(); // Posición del mansaje en la ventana. Console.SetCursorPosition(2, 2); Console.WriteLine("Elija una opción:"); Console.WriteLine(""); Console.SetCursorPosition(2, 4); Console.WriteLine("1 - Opción A."); Console.SetCursorPosition(2, 5); Console.WriteLine("2 - Opción B."); Console.SetCursorPosition(2, 6); Console.WriteLine("3 - Opción C."); Console.SetCursorPosition(2, 7); Console.WriteLine("Escape - Salir."); Console.SetCursorPosition(2, 8); Console.Write("==============="); ConsoleKey key; do { // Cursor invisible Console.CursorVisible = false; // Lee cualquier tecla. key = Console.ReadKey(true).Key; // Variable de mensaje vacío. string mensaje = string.Empty; // Leer tecla selecconada por el usuario. switch (key) { case ConsoleKey.D1: // Tecla principal 1. case ConsoleKey.NumPad1: // Tecla extendida 1. Console.SetCursorPosition(2, 10); mensaje = "OPCIÓN A."; // Mostrar mensaje en pantalla. break; case ConsoleKey.D2: case ConsoleKey.NumPad2: mensaje = "OPCIÓN B."; break; case ConsoleKey.D3: case ConsoleKey.NumPad3: mensaje = "OPCIÓN C."; break; } // Posición de los mensajes. Console.SetCursorPosition(2, 10); Console.Write(" "); // 13 espacios. Console.SetCursorPosition(2, 10); Console.Write(mensaje); } // Salir de la plicación al pulsar la tecla Escape o número 4. while (key != ConsoleKey.Escape); } } }
Saludos.
|
|
|
445
|
Programación / .NET (C#, VB.NET, ASP) / Re: Enviar email con C#
|
en: 13 Enero 2019, 13:11 pm
|
Hola: Es un puntazo hacer lo mismo con el PowerShell. Me alegro que lo hicieras. Quiero ver el código completo si no te importa.Estaba un tiempo con él y me moló. Lo único que he hecho con él hasta ahora son tonterías como abrir y cerrar la bandeja del disco DVD del lector, tanto en modo consola como modo visual. Eso si, hecho gracias por los compañeros de este foro poco a poco. Modo consola PowerShell $MemDef = @" [DllImport("winmm.dll", CharSet = CharSet.Ansi)] public static extern int mciSendStringA( string lpstrCommand, string lpstrReturnString, int uReturnLength, IntPtr hwndCallback); "@
$winnm = Add-Type -memberDefinition $MemDef -ErrorAction 'SilentlyContinue' -passthru -name mciSendString function Set-CDAudioDoor { Param( [ValidateSet("open", "closed")][String[]]$Mode = 'open' ) $winnm::mciSendStringA("set cdaudio door $mode", $null, 0,0)}
function mostrarMenu { param ([string]$Titulo = ' Control bandeja del lector ', [string]$PS = ' PowerShell ') cls Write-Host "╔====================================╗" Write-Host "║ $PS║" Write-Host "╠====================================╣" Write-Host "║ $Titulo ║" Write-Host "╠====================================╣" Write-Host "║ ║" Write-Host "║ A) Abrir. ║" Write-Host "║ C) Cerrar. ║" Write-Host "║ I) Información. ║" Write-Host "║ S) Presiona 'S' para salir. ║" Write-Host "║ ║" Write-Host "╚====================================╝" }
do { mostrarMenu $input = Read-Host " Elegir una Opción" switch ($input) { 'a' { cls 'Abriendo...' Set-CDAudioDoor open cls 'Abierto.' } 'c' { cls 'Cerrando...' Set-CDAudioDoor closed cls 'Cerrado.' } 'i' { cls 'PowerShell' '==========' Get-Host 'Electrónica PIC' '===============' '' 'e-mail: metaconta@gmail.com' '' #pause } 's' { return } } pause } until ($input -eq 's') Modo Visual en PowerShell. $Diskmaster = New-Object -ComObject IMAPI2.MsftDiscMaster2 $DiskRecorder = New-Object -ComObject IMAPI2.MsftDiscRecorder2 $DiskRecorder.InitializeDiscRecorder($DiskMaster)
function Set-CDAudioDoor { Param( [ValidateSet("open", "closed")][String[]]$mode ) if ($mode -eq 'open'){ $label_Mensaje.Text = "Abriendo..." $DiskRecorder.EjectMedia() $label_Mensaje.Text = "Abierto." } else { $label_Mensaje.Text = "Cerrando..." $DiskRecorder.CloseTray() $label_Mensaje.Text = "Cerrado." } }
# Cargo los Assemblies. (Necesario para definir el form). [void][reflection.assembly]::loadwithpartialname("System.Windows.Forms") [void][reflection.assembly]::loadwithpartialname("System.Drawing")
# Formulario. $Form = New-Object system.Windows.Forms.Form $Form.Text = "PowerShell 2017" $Form.Size = New-Object system.Drawing.Size(300, 300) $Form.FormBorderStyle = "FixedDialog" $Form.TopMost = $true $Form.MaximizeBox = $false $Form.MinimizeBox = $false $Form.ControlBox = $true $Form.StartPosition = "CenterScreen" $Form.Font = "Segoe UI"
# Botón abrir. $button_Abrir = New-Object system.windows.Forms.Button $button_Abrir.Text = "Abrir" $button_Abrir.Width = 75 $button_Abrir.Height = 23 $button_Abrir.location = new-object system.drawing.point(40, 150) $button_Abrir.Font = "Microsoft Sans Serif,10" $Form.controls.Add($button_Abrir)
# Botón cerrar. $button_Cerrar = New-Object system.windows.Forms.Button $button_Cerrar.Text = "Cerrar" $button_Cerrar.Width = 75 $button_Cerrar.Height = 23 $button_Cerrar.location = new-object system.drawing.point(174, 150) $button_Cerrar.Font = "Microsoft Sans Serif,10" $Form.controls.Add($button_Cerrar)
# Label. $label_Mensaje = New-Object system.windows.Forms.Label $label_Mensaje.Text = "?" $label_Mensaje.AutoSize = $true $label_Mensaje.location = new-object system.drawing.point(20,26) $label_Mensaje.Size = new-object system.drawing.point(54,10) $label_Mensaje.Font = "Microsoft Sans Serif, 36, style=Bold" $Form.controls.Add($label_Mensaje)
# Botón abrir bandeja. $button_Abrir.Add_Click({Set-CDAudioDoor open})
# Botón cerrar bandeja. $button_Cerrar.Add_Click({Set-CDAudioDoor closed})
[void]$Form.ShowDialog() $Form.Dispose() Fuera off-toppic. No me deja en hotmail, como está vinculado el gmail para la recuperación de cuentas, me salga el mismo mensaje de seguridad en la entrada de hotmail. Siempre pasa algo que no me deje.
|
|
|
447
|
Programación / .NET (C#, VB.NET, ASP) / Re: Enviar email con C#
|
en: 13 Enero 2019, 10:11 am
|
Si no te llegara a entender, choco con la pared. Es importante el enlace que nos proporcinó nuestro compañero. https://myaccount.google.com/lesssecureappsNos dio el enlace directamente, no se que paso hay que darle para llegar a él. Ahora si funciona con Windows Form.  using System; using System.Windows.Forms; using System.Net; // No olvidar. using System.Net.Mail; // No olvidar. namespace Enviar_e_mail_01_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button_Enviar_Click(object sender, EventArgs e) { // La cadena "servidor" es el servidor de correo que enviará tu mensaje. string servidor = comboBox_smtp.SelectedItem.ToString(); // smtp.gmail.com // Crea el mensaje estableciendo quién lo manda y quién lo recibe. MailMessage mensaje = new MailMessage ( textBox_Emisor.Text, textBox_Receptor.Text, textBox_Asunto.Text, richTextBox_Mensaje.Text); // Envía el mensaje. SmtpClient cliente = new SmtpClient (servidor ); cliente.DeliveryMethod = SmtpDeliveryMethod.Network; cliente.UseDefaultCredentials = false; cliente.EnableSsl = true; cliente .Credentials = new NetworkCredential (textBox_Emisor .Text, textBox_Contraseña .Text); // usuario@gmail.com, Contraseña. cliente.Port = Int32.Parse(comboBox_Puerto.Text); ; // 587 cliente.Host = servidor; // smtp.gmail.com // Añade credenciales si el servidor lo requiere. //cliente.Credentials = CredentialCache.DefaultNetworkCredentials; cliente.Send(mensaje); } } }
Ahora me toca por mi parte, mejorar el código, hacer el programa más completo. Por fin funciona. Muchas gracias a todos. Edito: Me dio por curiosidad probarlo en modo consola y no funciona, el mismo problema y no se parece nada de los credenciales. Algo no lo veo.  using System; using System.Net.Mail; using System.Text; using System.Net; namespace Enviar_e_mail_Consola_03_cs { class Program { static void Main(string[] args) { string usuario, contraseña, destinatario, asunto, mensaje; // Título de la ventana. Console.Title = "Enviar e-mail con Consola C#"; // Tamaño ventana consola. Console.WindowWidth = 100; // X. Ancho. Console.WindowHeight = 40; // Y. Alto. Console.WriteLine("\t\t----------------------------------------"); Console.WriteLine("\t\t\tEnviar Correo Electrónico"); Console.WriteLine("\t\t----------------------------------------"); Console.WriteLine("\n"); Console.Write("\t\tIngresa tu correo electrónico: "); usuario = Console.ReadLine(); Console.Write("\t\tIngresa tu password: "); contraseña = leerPassword(); Console.Write("\t\tDestinatario: "); destinatario = Console.ReadLine(); Console.Write("\t\tAsunto: "); asunto = Console.ReadLine(); Console.Write("\t\tMensaje: "); mensaje = Console.ReadLine(); MailMessage correo = new MailMessage (usuario, destinatario, asunto, mensaje ); SmtpClient servidor = new SmtpClient ("smtp.gmail.com"); servidor.Port = 587; NetworkCredential credenciales = new NetworkCredential (usuario, contraseña ); servidor.Credentials = credenciales; servidor.EnableSsl = true; try { Console.WriteLine("Enviando..."); servidor.Send(correo); Console.WriteLine("\t\tCorreo enviado de manera exitosa."); correo.Dispose(); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine("\t\tNo se ha enviado nada."); Console.ReadKey(); } } // A la hora de introducir la contraseña, se sustituye por asterístos (*) en pantalla. public static string leerPassword() { ConsoleKeyInfo cki; StringBuilder sb = new StringBuilder (); do { cki = Console.ReadKey(true); if (cki.Key != ConsoleKey.Enter) { sb.Append(cki.Key); Console.Write("*"); } else break; } while (true); Console.WriteLine(); return sb.ToString(); } } }
Por mucho que compare el de Windows Form, no lo pillo. Saludos.
|
|
|
448
|
Programación / .NET (C#, VB.NET, ASP) / Re: Enviar email con C#
|
en: 12 Enero 2019, 23:06 pm
|
Pues así a bote pronto no se me ocurre nada :/
PD: Espero que lo que has dejado en tu anterior post no sea la verdadera contraseña de tu Gmail, por si acaso algún moderador caritativo que lo edite
Lo puse falso la contraseña. Gracias de todas formas. @Eleкtro (sin pilas) Pinché el enlace que pusiste, aún persiste el problema.  Otra cosa, no me quiero entrometer mucho, pero el 2FA(doble factor de autenticacion de gmail) quizás deba tenerlo también desactivado para descartar.
No se nada de ese tema y como hacerlo. Veo que estás utilizando las DefaultCredentials después de instanciar NetworkCredentials con tus credenciales. Quita toda referencia a las DefaultCredentials y deja el UseDefaultCredentials en false. Por algún momento (creo) que estás enviando la auth equivocada.
Si te refieres esta parte del código. cliente.Credentials = CredentialCache.DefaultNetworkCredentials;
No se puede poner más nada. Si no es lo que te digo, entonces no se a que te refieres. No sabía que fuese tan pesado enviar correos con C#. Saludos. Edito: Me está funcionando el código en modo consola, no en Windows Form. using System; using System.Text; using System.Net.Mail; // No olvidar. namespace Enviar_e_mail_Consola_02_cs { class Program { static void Main(string[] args) { SendMail(); } public static Boolean SendMail() { // Título de la ventana. Console.Title = "Enviar e-mail con Consola C#"; // Tamaño ventana consola. Console.WindowWidth = 100; // X. Ancho. Console.WindowHeight = 40; // Y. Alto. try { string email = "metaconta@gmail.com"; //Configuración del Mensaje MailMessage mail = new MailMessage (); SmtpClient SmtpServer = new SmtpClient ("smtp.gmail.com"); //Especificamos el correo desde el que se enviará el Email y el nombre de la persona que lo envía mail .From = new MailAddress (email, "Meta", Encoding .UTF8); //Aquí ponemos el asunto del correo mail.Subject = "Prueba de Envío de Correo"; //Aquí ponemos el mensaje que incluirá el correo mail.Body = "Prueba de Envío de Correo de Gmail desde C#..............."; //Especificamos a quien enviaremos el Email, no es necesario que sea Gmail, puede ser cualquier otro proveedor mail.To.Add(email); //Si queremos enviar archivos adjuntos tenemos que especificar la ruta en donde se encuentran //mail.Attachments.Add(new Attachment(@"C:\Documentos\carta.docx")); //Configuracion del SMTP SmtpServer.Port = 587; //Puerto que utiliza Gmail para sus servicios //Especificamos las credenciales con las que enviaremos el mail SmtpServer .Credentials = new System.Net.NetworkCredential(email, "password"); SmtpServer.EnableSsl = true; SmtpServer.Send(mail); Console.WriteLine("Mensaje enviado."); Console.ReadKey(); return true; } catch (Exception ex) { Console.WriteLine("ERROR: Mensaje no enviado."); Console.ReadKey(); return false; } } } }
|
|
|
450
|
Programación / .NET (C#, VB.NET, ASP) / Re: Enviar email con C#
|
en: 12 Enero 2019, 15:21 pm
|
Había hecho eso antes de ponerlo entrue, pero me sale este mensaje. System.Net.Mail.SmtpException: 'El servidor SMTP requiere una conexión segura o el cliente no se autenticó. La respuesta del servidor fue: 5.5.1 Authentication Required. Learn more at' using System; using System.Windows.Forms; using System.Net; // No olvidar. using System.Net.Mail; // No olvidar.
namespace Enviar_e_mail_01_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button_Enviar_Click(object sender, EventArgs e) { //La cadena "servidor" es el servidor de correo que enviará tu mensaje string servidor = comboBox_smtp.SelectedItem.ToString(); // smtp.gmail.com
// Crea el mensaje estableciendo quién lo manda y quién lo recibe MailMessage mensaje = new MailMessage( textBox_Emisor.Text, textBox_Receptor.Text, textBox_Asunto.Text, richTextBox_Mensaje.Text);
//Envía el mensaje. SmtpClient cliente = new SmtpClient(servidor); cliente.DeliveryMethod = SmtpDeliveryMethod.Network; cliente.UseDefaultCredentials = true; cliente.EnableSsl = true; cliente.Credentials = new System.Net.NetworkCredential(textBox_Emisor.Text, textBox_Contraseña.Text); cliente.Port = Int32.Parse(comboBox_Puerto.Text); ; // 587 //cliente.Port = 25; cliente.Host = servidor; // smtp.gmail.com
//Añade credenciales si el servidor lo requiere. cliente.Credentials = CredentialCache.DefaultNetworkCredentials; cliente.Send(mensaje); } } }
|
|
|
|
|
|
|