La Web del Programador: Comunidad de Programadores
 
    Pregunta:  54354 - CONTROLAR APLICACION OUTLOOK
Autor:  Lithium Flower
Hola, me gustaría saber si se puede hacer lo siguiente, ya que he probado mil cosas y siempre hay algún detallito que me falla, necesito orientación hacia la luz por favor!!!

MEdiante una función, crear un mensaje de correo electrónico de Outlook Express, pero que no se envíe automáticamente, sino con la opción .Display(true), en este caso nos interesa que se abra la ventana para meter texto de última hora, o agregar alguna dirección demás, o algún retoque de última hora. Necesito que se vea el mensaje y que el usuario lo pueda enviar como siempre, dándole él mismo al botón "ENVIAR".

El problema es cómo controlar desde la función si el mensaje se ha llegado a enviar, o si se ha cerrado la ventana del outlook sin llegar a enviar, o si se ha cancelado... vamos, necesito saber si se ha llegado a enviar o no.

He probado con la opción .Sent pero lo debo de estar haciendo mal porque me dice que el elemento de movió o eliminó. Como si no encontrase el email actual.

Y luego otro problema es que al enviar no me cierra el formulario de outlook sino que lo tengo que cerrar yo a mano y eso sí me gustaría que se hiciese automático. Pensé que con el .CLose() lo haría pero que va. Lo sigue dejando abierto.

No he encontrado nada en el web relativo a esto, vamos, a controlar lo que devuelva la aplicacion de Outlook, si es que se puede, por eso os escribo esta pregunta. Un saludo y gracias.

  Respuesta:  Lithium Flower
Hola, bueno he conseguido hacerlo de la siguiente manera:

En lugar de Outlook he utilizado el sistema de protocolo SMTP y un formulario con una apariencia similar a los del outlook, el único inconveniente que veo es el tema de la lista de direcciones que habría que descargar la libreta de direcciones del outlook.

Envío el código.

[CODIGO]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Collections;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.Odbc;
using System.IO;
using System.Text.RegularExpressions;
//using System.Web.Mail; //esta no vale porque es un sistema obsoleto
using System.Net.Mail;//para generar los emails con protocolo SMTP
using System.Net.Sockets;//para las conexiones con el servidor
using System.Runtime.InteropServices;//para los objetos COM (Outlook)
using System.Runtime.InteropServices.ComTypes;// controlar excepciones de los objetos COM

/// <summary>
/// Envío de Emails a través del sistema SMTPCLient.
/// </summary>
/// <param name="eSubject">Asunto del mensaje (Subject)</param>
/// <param name="eDe">Remitente/s del mensaje (From)</param>
/// <param name="eDestinatario">Destinatario/s del mensaje (To)</param>
/// <param name="eDestOcultos">Destinatario/s ocultos del mensaje (CCO)</param>
/// <param name="eTextoEmail">Texto del email (Body)</param>
/// <param name="eAdjuntos">Ficheros Adjuntos del mensaje (Attachments)</param>
public void crearEMAILsmtp(string eSubject, string eDe, string eDestinatario,
string eDestOcultos, string eTextoEmail, string eAdjuntos)
{
// System.Web.Mail.SmtpMail.SmtpServer está obsoleta
// System.Net.Mail.SmtpClient es la clase recomendada
SmtpClient smtpClient = new SmtpClient();
MailMessage message = new MailMessage();

try
{
try
{
Attachment adjunto = new Attachment(eAdjuntos);
message.Attachments.Add(adjunto);
MailAddress fromAddress = new MailAddress(tbFrom.Text, System.Reflection.Missing.Value.toString());

//especificar el servidor
smtpClient.Host = "nombre del host";

//especificar el puerto
smtpClient.Port = 25;

//remitente del email (valor parametrizado en la Base de Datos)
message.From = fromAddress;

// To: colección de direcciones de mails, o un string formado por la unión de todas con ;

string[] dests = eDestinatario.Split(';');
if (dests.Rank > 0)
{
foreach (string email in dests)
{
message.To.Add(new MailAddress(email, System.Reflection.Missing.Value.ToString()));
}
}

message.Subject = eSubject;
if (!eDestOcultos.Equals(""))
{
foreach (string email in eDestOcultos.Split(new string[] { ";" }, StringSplitOptions.None))
{
message.Bcc.Add(new MailAddress(email, System.Reflection.Missing.Value.ToString()));
}
}

//FOrmato texto, no HTML
message.IsBodyHtml = false;

// Texto del mensaje
message.Body = eTextoEmail;

// Envía el email
smtpClient.Send(message);

MessageBox.Show("Email enviado con éxito.", "ENVIO DE EMAILS:",
MessageBoxButtons.OK, MessageBoxIcon.Information);
estadoEmail = 1;
}
catch(SmtpFailedRecipientsException exAll)
{
//no se ha podido enviar a todos los destinatarios
MessageBox.Show("No se ha podido enviar a todos los destinatarios: " +
exAll.Message.ToString(), "ENVIO DE EMAILS:", MessageBoxButtons.OK, MessageBoxIcon.Error);
estadoEmail = 0;
}
}
catch (SmtpException ex)
{
estadoEmail = 0;
//no se ha podido enviar el email correctamente
//MessageBox.Show("información del Envío: " + ex.StatusCode.ToString(), "ENVIO DE EMAILS:",
// MessageBoxButtons.OK, MessageBoxIcon.Information );

MessageBox.Show("El envío ha fallado. " + ex.Message.ToString(), "ENVIO DE EMAILS:",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

En donde EstadoEmail controla si el email se ha llegado a enviar o por algún motivo el email no se ha llegado a enviar. Espero que sea útil para los demás.