recibir proceso por persona pasos para otra mandar envio enviar electrónico electronico documento correo como celular c# winforms multithreading smtp backgroundworker

c# - proceso - pasos para enviar un correo electronico



Necesita enviar un correo electrónico usando el proceso de trabajo en segundo plano (2)

Hay un gran ejemplo de cómo hacer esto con un "intermediario de servicios" en el capítulo 8 del libro de Richard Kiessig "Ultra-Fast ASP.NET".

Aquí está el enlace al libro en el sitio web del editor donde puede descargar el código de muestra del libro. Nuevamente, capítulo 8 ...

http://apress.com/book/view/9781430223832

Tengo un código escrito para enviar un correo electrónico en C #, pero la aplicación se cuelga cuando la aplicación envía correos con un tamaño de archivos adjuntos de más de 2 MB. Se me recomendó utilizar el proceso de trabajo en segundo plano para el mismo por parte de los usuarios de SO.

He pasado por el ejemplo del proceso de trabajo en segundo plano de MSDN y también lo he buscado en Google, pero no sé cómo integrarlo en mi código.

Por favor guíame en eso ...

Gracias

ACTUALIZADO: Código de correo electrónico agregado

public static void SendMail(string fromAddress, string[] toAddress, string[] ccAddress, string[] bccAddress, string subject, string messageBody, bool isBodyHtml, ArrayList attachments, string host, string username, string pwd, string port) { Int32 TimeoutValue = 0; Int32 FileAttachmentLength = 0; { try { if (isBodyHtml && !htmlTaxExpression.IsMatch(messageBody)) isBodyHtml = false; // Create the mail message MailMessage objMailMsg; objMailMsg = new MailMessage(); if (toAddress != null) { foreach (string toAddr in toAddress) objMailMsg.To.Add(new MailAddress(toAddr)); } if (ccAddress != null) { foreach (string ccAddr in ccAddress) objMailMsg.CC.Add(new MailAddress(ccAddr)); } if (bccAddress != null) { foreach (string bccAddr in bccAddress) objMailMsg.Bcc.Add(new MailAddress(bccAddr)); } if (fromAddress != null && fromAddress.Trim().Length > 0) { //if (fromAddress != null && fromName.trim().length > 0) // objMailMsg.From = new MailAddress(fromAddress, fromName); //else objMailMsg.From = new MailAddress(fromAddress); } objMailMsg.BodyEncoding = Encoding.UTF8; objMailMsg.Subject = subject; objMailMsg.Body = messageBody; objMailMsg.IsBodyHtml = isBodyHtml; if (attachments != null) { foreach (string fileName in attachments) { if (fileName.Trim().Length > 0 && File.Exists(fileName)) { Attachment objAttachment = new Attachment(fileName); FileAttachmentLength=Convert.ToInt32(objAttachment.ContentStream.Length); if (FileAttachmentLength >= 2097152) { TimeoutValue = 900000; } else { TimeoutValue = 300000; } objMailMsg.Attachments.Add(objAttachment); //objMailMsg.Attachments.Add(new Attachment(fileName)); } } } //prepare to send mail via SMTP transport SmtpClient objSMTPClient = new SmtpClient(); if (objSMTPClient.Credentials != null) { } else { objSMTPClient.UseDefaultCredentials = false; NetworkCredential SMTPUserInfo = new NetworkCredential(username, pwd); objSMTPClient.Host = host; objSMTPClient.Port = Int16.Parse(port); //objSMTPClient.UseDefaultCredentials = false; objSMTPClient.Credentials = SMTPUserInfo; //objSMTPClient.EnableSsl = true; //objSMTPClient.DeliveryMethod = SmtpDeliveryMethod.Network; } //objSMTPClient.Host = stmpservername; //objSMTPClient.Credentials //System.Net.Configuration.MailSettingsSectionGroup mMailsettings = null; //string mailHost = mMailsettings.Smtp.Network.Host; try { objSMTPClient.Timeout = TimeoutValue; objSMTPClient.Send(objMailMsg); //objSMTPClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); objMailMsg.Dispose(); } catch (SmtpException smtpEx) { if (smtpEx.Message.Contains("secure connection")) { objSMTPClient.EnableSsl = true; objSMTPClient.Send(objMailMsg); } } } catch (Exception ex) { AppError objError = new AppError(AppErrorType.ERR_SENDING_MAIL, null, null, new AppSession(), ex); objError.PostError(); throw ex; } } }

No puedo modificar el código aquí, ya que es un método común que se llama cuando el correo se envía desde mi aplicación.


Puede iniciar un hilo de fondo para bucle continuo y enviar correo electrónico:

private void buttonStart_Click(object sender, EventArgs e) { BackgroundWorker bw = new BackgroundWorker(); this.Controls.Add(bw); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerAsync(); } private bool quit = false; void bw_DoWork(object sender, DoWorkEventArgs e) { while (!quit) { // Code to send email here } }

Manera alternativa de hacerlo:

private void buttonStart_Click(object sender, EventArgs e) { System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(); client.SendCompleted += new System.Net.Mail.SendCompletedEventHandler(client_SendCompleted); client.SendAsync("[email protected]", "[email protected]", "subject", "body", null); } void client_SendCompleted(object sender, AsyncCompletedEventArgs e) { if (e.Error == null) MessageBox.Show("Successful"); else MessageBox.Show("Error: " + e.Error.ToString()); }

Específico para su ejemplo, debe reemplazar lo siguiente:

try { objSMTPClient.Timeout = TimeoutValue; objSMTPClient.Send(objMailMsg); //objSMTPClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); objMailMsg.Dispose(); } catch (SmtpException smtpEx) { if (smtpEx.Message.Contains("secure connection")) { objSMTPClient.EnableSsl = true; objSMTPClient.Send(objMailMsg); } }

con lo siguiente:

objSMTPClient.Timeout = TimeoutValue; objSMTPClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); objSMTPClient.SendAsync(objMailMsg, objSMTPClient);

y más abajo, incluyen:

void SendCompletedCallback(object sender, AsyncCompletedEventArgs e) { if (e.Error == null) MessageBox.Show("Successful"); else if (e.Error is SmtpException) { if ((e.Error as SmtpException).Message.Contains("secure connection")) { (e.UserState as SmtpClient).EnableSsl = true; (e.UserState as SmtpClient).SendAsync(objMailMsg, e.UserState); } else MessageBox.Show("Error: " + e.Error.ToString()); } else MessageBox.Show("Error: " + e.Error.ToString()); }