Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 12 Enero 2019, 09:41 am



Título: Enviar email con C#
Publicado por: Meta en 12 Enero 2019, 09:41 am
Hola:

Me da error al enviar mensaje por emmail desde C#.

(https://www.subeimagenes.com/img/email2-1990515.PNG)

El código por ahora es este.

Código:
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.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
            cliente.EnableSsl = true;

            //Añade credenciales si el servidor lo requiere.
            cliente.Credentials = CredentialCache.DefaultNetworkCredentials;
            cliente.Send(mensaje);
        }
    }
}

Error indicado aquí. Da igual sea con hotmail o gmail.

(https://www.subeimagenes.com/img/email-1990516.PNG)

Me llegó un mensaje al gmail de seguridad por usar formulario C#.

Citar
Se ha bloqueado un intento de inicio de sesión
   metaconta@gmail.com

Alguien acaba de usar tu contraseña para intentar iniciar sesión en tu cuenta desde una aplicación que no es de Google. Aunque Google ha bloqueado el acceso, deberías averiguar qué ha pasado. Revisa la actividad de la cuenta y comprueba que solo tú tienes acceso a ella.

Pincho y eso sale.
Se ha bloqueado una aplicación poco segura
Hemos bloqueado la aplicación que intentabas usar porque no cumple nuestros estándares de seguridad.
Algunos dispositivos y aplicaciones utilizan una tecnología de inicio de sesión menos segura, lo que hace que tu cuenta sea más vulnerable. Te recomendamos que desactives el acceso de estas aplicaciones, aunque también puedes activarlo si quieres usarlas a pesar de los riesgos que conllevan.
Más información (http://"https://support.google.com/accounts/answer/6010255?p=lsa_blocked&hl=es&visit_id=636828790611266312-2521199507&rd=1")

Citar
Permitir el acceso a cuentas desde aplicaciones menos seguras

Si una aplicación o un dispositivo no cumple con nuestros estándares de seguridad, Google bloqueará a cualquier persona que intente iniciar sesión desde esa aplicación o dispositivo. El bloqueo contribuye a mantener la seguridad de tu cuenta, ya que es muy fácil acceder a estas aplicaciones y dispositivos sin autorización.

A continuación, se muestran algunos ejemplos de aplicaciones que no son compatibles con la última versión de los estándares de seguridad:

    La aplicación Mail para iPhone o iPad con la versión 6 o versiones anteriores
    La aplicación Mail en un teléfono con una versión de Windows Phone anterior a la 8.1
    Algunos clientes de correo electrónico para ordenadores, como Microsoft Outlook y Mozilla Thunderbird

Cambiar el acceso a la cuenta para aplicaciones menos seguras

Para mantener más protegidas tus cuentas de Google del trabajo, del centro educativo o de otro grupo, bloqueamos las aplicaciones menos seguras para que no puedan acceder a ellas. Si tienes una cuenta de este tipo, se te mostrará el error "Contraseña incorrecta" cuando intentes iniciar sesión. Si es así, tienes dos opciones:

    Opción 1: instala una aplicación más segura que utilice medidas de seguridad más sólidas. Todos los productos de Google, como Gmail, utilizan las medidas de seguridad más recientes.
    Opción 2: cambia la configuración para permitir que las aplicaciones poco seguras accedan a tu cuenta. Esta opción no es recomendable porque puede facilitar el acceso a tu cuenta a otra persona. Si, aún así, quieres utilizarla, sigue estos pasos:
        Ve a tu cuenta de Google.
        En el panel de navegación de la izquierda, haz clic en Seguridad.
        En el panel Acceso de aplicaciones poco seguras de la parte inferior de la página, haz clic en Activar acceso.
             Si no ves este ajuste, es posible que el administrador haya desactivado el acceso de las aplicaciones poco seguras a la cuenta.

Si sigues sin poder iniciar sesión en tu cuenta, obtén más información sobre el error "Contraseña incorrecta"

¿Alguna grandísima idea?

Hace años no pasaba estas cosas.

Saludos:)


Título: Re: Enviar email con C#
Publicado por: Eleкtro en 12 Enero 2019, 13:01 pm
para poder enviar e-mails por GMail de forma programática, primero tienes que permitir el uso de aplicaciones de terceros, puedes hacerlo desde aquí:
  • http://www.google.com/settings/security/lesssecureapps


Título: Re: Enviar email con C#
Publicado por: Meta en 12 Enero 2019, 14:51 pm


Hola:

Lo he activado y sigue con el mismo problema.

Citar
'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'

Saludos.


Título: Re: Enviar email con C#
Publicado por: warcry. en 12 Enero 2019, 15:01 pm
vaya por delante que no tengo ni pajolera idea de C#

asi a bote pronto lo que veo es que no mandas ninguna credencial

Código:
cliente.UseDefaultCredentials = false;

en el ejemplo de aqui

https://docs.microsoft.com/es-es/dotnet/api/system.net.mail.smtpclient.enablessl?view=netframework-4.7.2#System_Net_Mail_SmtpClient_EnableSsl

esta en true

Código:
public static void CreateTestMessage(string server)
{
string to = "jane@contoso.com";
string from = "ben@contoso.com";
MailMessage message = new MailMessage(from, to);
message.Subject = "Using the new SMTP client.";
message.Body = @"Using this new feature, you can send an email message from an application very easily.";
SmtpClient client = new SmtpClient(server);
// Credentials are necessary if the server requires the client
// to authenticate before it will send email on the client's behalf.
client.UseDefaultCredentials = true;
                      client.EnableSsl = true;
client.Send(message);
}



Título: Re: Enviar email con C#
Publicado por: Meta en 12 Enero 2019, 15:21 pm
Había hecho eso antes de ponerlo entrue, pero me sale este mensaje.

Citar
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'

Código:
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);
        }
    }
}


Título: Re: Enviar email con C#
Publicado por: warcry. en 12 Enero 2019, 15:51 pm
Cómo he dicho antes no se de C# y lo mismo meto la pata

En bash cuando defino una variable

Variable=12345678

Para luego invocarla tengo que poner $Variable

No sé si en c# se invocan así, pero en tu código leo

Código:
cliente.Credentials = new System.Net.NetworkCredential(textBox_Emisor.Text, textBox_Contraseña.Text);


Parece que no invocas nada, lo mismo el campo va en null, prueba a meterle a mano, sin el formulario, usuario y contraseña para descartar.


Título: Re: Enviar email con C#
Publicado por: Meta en 12 Enero 2019, 16:05 pm
Lo había hecho y lo volví hacer.

Código
  1. cliente.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");

Sigue con lo mismo.


Título: Re: Enviar email con C#
Publicado por: warcry. en 12 Enero 2019, 18: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


Título: Re: Enviar email con C#
Publicado por: Eleкtro en 12 Enero 2019, 20:02 pm
Logicamente debe enviar sus credenciales, es una obviedad de requisito, y así lo estaba haciendo ya que de lo contrario no le habría llegado ese mail a la cuenta de Gmail avisando de un intento de inicio de sesión.



Vamos a ver, @Meta, el mensaje que obtienes en tu correo es claro:

Cita de: Google
...Google ha bloqueado el acceso...
...
Se ha bloqueado una aplicación poco segura
Hemos bloqueado la aplicación que intentabas usar porque no cumple nuestros estándares de seguridad.
...

No le des más vueltas. El problema se debe a que no has activado el uso de "aplicaciones menos seguras" en esa cuenta de gmail que estás intentando usar como emisor del mensaje.

Que no te confunda el mensaje de esta excepción:
Citar
System.Net.Mail.SmtpException: 'El servidor SMTP requiere una conexión segura o el cliente no se autenticó.
...siempre y cuando el valor de la propiedad SmtpClient.EnableSsl sea true, ese mismo mensaje de error también te aparecerá precisamente por no haber activado las "aplicaciones menos seguras".

Aparte, en el comentario mio que te enlacé, si pinchas en él puedes ver un código que escribí, el cual puedes tomar como referencia (convirtiendolo a C#), donde puedes comprobar como usar las credenciales y que valores asignar a todas las propiedades necesarias para enviar un e-mail mediante el SMTP de Gmail, aparte del comentario específico que cité sobre el requisito de activar la opción del uso de "aplicaciones menos seguras".

Saludos.


Título: Re: Enviar email con C#
Publicado por: rub'n en 12 Enero 2019, 20:27 pm
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.


Título: Re: Enviar email con C#
Publicado por: kub0x en 12 Enero 2019, 21:33 pm
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 motivo (creo) que estás enviando la auth equivocada.


Título: Re: Enviar email con C#
Publicado por: Meta 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.
Código
  1. 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.

Código
  1. using System;
  2. using System.Text;
  3. using System.Net.Mail; // No olvidar.
  4.  
  5.  
  6. namespace Enviar_e_mail_Consola_02_cs
  7. {
  8.    class Program
  9.    {
  10.        static void Main(string[] args)
  11.        {
  12.            SendMail();
  13.        }
  14.  
  15.        public static Boolean SendMail()
  16.        {
  17.  
  18.            // Título de la ventana.
  19.            Console.Title = "Enviar e-mail con Consola C#";
  20.  
  21.            // Tamaño ventana consola.
  22.            Console.WindowWidth = 100; // X. Ancho.
  23.            Console.WindowHeight = 40; // Y. Alto.
  24.  
  25.            try
  26.            {
  27.                string email = "metaconta@gmail.com";
  28.                //Configuración del Mensaje
  29.                MailMessage mail = new MailMessage();
  30.                SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
  31.                //Especificamos el correo desde el que se enviará el Email y el nombre de la persona que lo envía
  32.                mail.From = new MailAddress(email, "Meta", Encoding.UTF8);
  33.                //Aquí ponemos el asunto del correo
  34.                mail.Subject = "Prueba de Envío de Correo";
  35.                //Aquí ponemos el mensaje que incluirá el correo
  36.                mail.Body = "Prueba de Envío de Correo de Gmail desde C#...............";
  37.                //Especificamos a quien enviaremos el Email, no es necesario que sea Gmail, puede ser cualquier otro proveedor
  38.                mail.To.Add(email);
  39.                //Si queremos enviar archivos adjuntos tenemos que especificar la ruta en donde se encuentran
  40.                //mail.Attachments.Add(new Attachment(@"C:\Documentos\carta.docx"));
  41.  
  42.                //Configuracion del SMTP
  43.                SmtpServer.Port = 587; //Puerto que utiliza Gmail para sus servicios
  44.                //Especificamos las credenciales con las que enviaremos el mail
  45.                SmtpServer.Credentials = new System.Net.NetworkCredential(email, "password");
  46.                SmtpServer.EnableSsl = true;
  47.                SmtpServer.Send(mail);
  48.                Console.WriteLine("Mensaje enviado.");
  49.                Console.ReadKey();
  50.                return true;
  51.            }
  52.            catch (Exception ex)
  53.            {
  54.                Console.WriteLine("ERROR: Mensaje no enviado.");
  55.                Console.ReadKey();
  56.                return false;
  57.            }
  58.        }
  59.    }
  60. }
  61.  


Título: Re: Enviar email con C#
Publicado por: kub0x en 13 Enero 2019, 02:01 am
Pues parece que me has entendido porque lo que quería transmitirte es que estabas suprimiendo tus credenciales con las credenciales de red en caché. Ahora tus credenciales si están siendo enviadas. No está de más que evalues línea a línea el porque del código ajeno.

Saludos.


Título: Re: Enviar email con C#
Publicado por: Meta 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/lesssecureapps

Nos dio el enlace directamente, no se que paso hay que darle para llegar a él.

Ahora si funciona con Windows Form.

(https://www.subeimagenes.com/img/email2-1990515.PNG)

Código
  1. using System;
  2. using System.Windows.Forms;
  3. using System.Net;       // No olvidar.
  4. using System.Net.Mail;  // No olvidar.
  5.  
  6. namespace Enviar_e_mail_01_cs
  7. {
  8.    public partial class Form1 : Form
  9.    {
  10.        public Form1()
  11.        {
  12.            InitializeComponent();
  13.        }
  14.  
  15.        private void button_Enviar_Click(object sender, EventArgs e)
  16.        {
  17.            // La cadena "servidor" es el servidor de correo que enviará tu mensaje.
  18.            string servidor = comboBox_smtp.SelectedItem.ToString(); // smtp.gmail.com
  19.  
  20.            // Crea el mensaje estableciendo quién lo manda y quién lo recibe.
  21.            MailMessage mensaje = new MailMessage(
  22.               textBox_Emisor.Text,
  23.               textBox_Receptor.Text,
  24.               textBox_Asunto.Text,
  25.               richTextBox_Mensaje.Text);
  26.  
  27.            // Envía el mensaje.
  28.            SmtpClient cliente = new SmtpClient(servidor);
  29.            cliente.DeliveryMethod = SmtpDeliveryMethod.Network;
  30.            cliente.UseDefaultCredentials = false;
  31.            cliente.EnableSsl = true;
  32.            cliente.Credentials = new NetworkCredential(textBox_Emisor.Text, textBox_Contraseña.Text); // usuario@gmail.com, Contraseña.
  33.            cliente.Port = Int32.Parse(comboBox_Puerto.Text); ; // 587
  34.            cliente.Host = servidor; // smtp.gmail.com
  35.  
  36.            // Añade credenciales si el servidor lo requiere.
  37.            //cliente.Credentials = CredentialCache.DefaultNetworkCredentials;
  38.            cliente.Send(mensaje);
  39.        }
  40.    }
  41. }

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.
(https://www.subeimagenes.com/img/captura-1990888.PNG)

Código
  1. using System;
  2. using System.Net.Mail;
  3. using System.Text;
  4. using System.Net;
  5.  
  6. namespace Enviar_e_mail_Consola_03_cs
  7. {
  8.    class Program
  9.    {
  10.        static void Main(string[] args)
  11.        {
  12.            string usuario, contraseña, destinatario, asunto, mensaje;
  13.  
  14.            // Título de la ventana.
  15.            Console.Title = "Enviar e-mail con Consola C#";
  16.  
  17.            // Tamaño ventana consola.
  18.            Console.WindowWidth = 100; // X. Ancho.
  19.            Console.WindowHeight = 40; // Y. Alto.
  20.  
  21.            Console.WriteLine("\t\t----------------------------------------");
  22.            Console.WriteLine("\t\t\tEnviar Correo Electrónico");
  23.            Console.WriteLine("\t\t----------------------------------------");
  24.  
  25.  
  26.            Console.WriteLine("\n");
  27.            Console.Write("\t\tIngresa tu correo electrónico: ");
  28.            usuario = Console.ReadLine();
  29.            Console.Write("\t\tIngresa tu password: ");
  30.            contraseña = leerPassword();
  31.  
  32.  
  33.            Console.Write("\t\tDestinatario: ");
  34.            destinatario = Console.ReadLine();
  35.            Console.Write("\t\tAsunto: ");
  36.            asunto = Console.ReadLine();
  37.            Console.Write("\t\tMensaje: ");
  38.            mensaje = Console.ReadLine();
  39.  
  40.            MailMessage correo = new MailMessage(usuario, destinatario, asunto, mensaje);
  41.  
  42.            SmtpClient servidor = new SmtpClient("smtp.gmail.com");
  43.            servidor.Port = 587;
  44.            NetworkCredential credenciales = new NetworkCredential(usuario, contraseña);
  45.            servidor.Credentials = credenciales;
  46.            servidor.EnableSsl = true;
  47.  
  48.            try
  49.            {
  50.                Console.WriteLine("Enviando...");
  51.                servidor.Send(correo);
  52.                Console.WriteLine("\t\tCorreo enviado de manera exitosa.");
  53.                correo.Dispose();
  54.                Console.ReadKey();
  55.            }
  56.            catch (Exception ex)
  57.            {
  58.                Console.WriteLine(ex.Message);
  59.                Console.WriteLine("\t\tNo se ha enviado nada.");
  60.                Console.ReadKey();
  61.            }
  62.        }
  63.  
  64.        // A la hora de introducir la contraseña, se sustituye por asterístos (*) en pantalla.
  65.        public static string leerPassword()
  66.        {
  67.            ConsoleKeyInfo cki;
  68.            StringBuilder sb = new StringBuilder();
  69.  
  70.            do
  71.            {
  72.                cki = Console.ReadKey(true);
  73.                if (cki.Key != ConsoleKey.Enter)
  74.                {
  75.                    sb.Append(cki.Key);
  76.                    Console.Write("*");
  77.                }
  78.  
  79.                else
  80.                    break;
  81.  
  82.            } while (true);
  83.            Console.WriteLine();
  84.            return sb.ToString();
  85.        }
  86.    }
  87. }

Por mucho que compare el de Windows Form, no lo pillo.

Saludos.


Título: Re: Enviar email con C#
Publicado por: warcry. en 13 Enero 2019, 12:45 pm
a mi desde powershell si que me funciona, tanto si fuerzo el uso de TLS 1.2

Código:
$from = "micorreo@gmail.com"
$to = "correodeprueba@hotmail.com"
$subject = "peticion"
$body = "Este es un correo de prueba

Un saludo ;)"
$smtpserver = "smtp.gmail.com"
$user= "micorreo@gmail.com"
$passwd =  ConvertTo-SecureString "miclave" -AsPlainText -Force
$credenciales= New-Object System.Management.Automation.PSCredential ($user,$passwd)


    foreach ($recipient in $to)
    {
        [System.Net.ServicePointManager]::SecurityProtocol = 'TLS12'
        write-host "Enviando mail a $to prúeba"
        Send-MailMessage -Encoding OEM  -smtpServer $smtpserver -Port 587 -UseSsl -from $from -to $recipient -subject $subject -body $body -credential $credenciales  }
   

Como si no fuerzo el uso de TLS 1.2

Código:
$from = "micorreo@gmail.com"
$to = "correodeprueba@hotmail.com"
$subject = "petición"
$body = "Este es un correo de prueba

Un saludo ;)"
$smtpserver = "smtp.gmail.com"
$user= "micorreo@gmail.com"
$passwd =  ConvertTo-SecureString "miclave" -AsPlainText -Force
$credenciales= New-Object System.Management.Automation.PSCredential ($user,$passwd)



    foreach ($recipient in $to)
    {
        write-host "Enviando mail a $to prúeba"
        Send-MailMessage -Encoding OEM  -smtpServer $smtpserver -from $from -to $recipient -subject $subject -body $body -credential $credenciales -UseSsl
    }

como has comentado tienes que activar el acceso a aplicaciones poco seguras

https://myaccount.google.com/lesssecureapps

pero aun asi me estan friendo a sms diciendo que han bloqueado mi pc de sobremesa, pero los correos siguen funcionando.

si lo haces con un hotmail en principio no tienes problemas de restricciones.

el smtp de hotmail es smtp.live.com


Título: Re: Enviar email con C#
Publicado por: Meta 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
Código:
$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.
Código:
$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.


Título: Re: Enviar email con C#
Publicado por: warcry. en 13 Enero 2019, 13:25 pm

Es un puntazo hacer lo mismo con el PowerShell. Me alegro que lo hicieras. Quiero ver el código completo si no te importa.


 :o No estoy haciendo lo mismo, no tengo conocimientos de programación, algo en powershell, algo en bash y algo en batch, osea para hacer un script y poco mas.

el código completo es el que tienes, lo haces en un txt y luego le cambias la extension por .ps1 y lo lanzas con boton derecho ejecutar con powershell, o editar si quieres modificar el texto y los adjuntos

al que podrías añadir si quieres mandar un adjunto

una variable que se llame por ejemplo $file con la dirección del archivo a remitir

Código:
$file = "C:\Users\Warcry\Desktop\archivoadjunto.txt"
y en la linea de Send-MailMessage con el parametro  -Attachments pasarle la variable del archivo.

Código:
Send-MailMessage -smtpServer $smtpserver -from $from -to $recipient -subject $subject  -body $body -Attachments $file  -credential $credenciales -UseSsl

para que te deje ejecutar script en powershell primero tienes que abrir la consola en modo administrador y luego introducir

Código:
Set-ExecutionPolicy Unrestricted

y dar "S" y enter