void procMail(string uid, OpenPop.Mime.Message message) { FileInfo file = new FileInfo(_folder_name + "/" + uid + ".txt"); if (file.Exists) { logToFile(uid + "mail txt file exists but not be processed. >< !!!"); return; } else { logToFile(uid + "mail save to txt file."); message.Save(file); } MailMessage msg1 = message.ToMailMessage(); msg1.From = new MailAddress(_account + "@ntu.edu.tw", _account, System.Text.Encoding.UTF8); msg1.To.Clear(); if (isFindContent(file.OpenText())) { msg1.To.Add("*****@*****.**"); send_msg(msg1); logToFile(uid + " mail content include 醫學 => forword mail. !!!"); return; } String value = parseHeader(file.OpenText()); //MessageBox.Show(value); logToFile(uid + " Mail parse header to: " + value); if (value == "") { logToFile(uid + " mail header X-Ntu-Recipient: dose not exist. >< !!!"); return; } for (int i = 0; i < value.Length; ++i) { switch (value[i]) { case 'f': msg1.To.Add("*****@*****.**"); break; case 's': msg1.To.Add("*****@*****.**"); break; case 'u': switch (value[i + 1]) { case 'b': msg1.To.Add("*****@*****.**"); break; case 'r': msg1.To.Add("*****@*****.**"); break; case 'd': msg1.To.Add("*****@*****.**"); break; } break; } } send_msg(msg1); logToFile(uid + " Mail Send Successfully ^^!!!"); /* * MessageBox.Show("Form1 create success!!"); * MailMessage msg = new MailMessage(); * //msg.To.Add(string.Join(",", MailList.ToArray())); * msg.To.Add("*****@*****.**"); * msg.From = new MailAddress( _account + "@ntu.edu.tw", _account, System.Text.Encoding.UTF8); * msg.Subject = message.Headers.Subject; * msg.SubjectEncoding = System.Text.Encoding.UTF8; * msg.Body = "body is test."; * msg.IsBodyHtml = true; * msg.BodyEncoding = System.Text.Encoding.UTF8;//郵件內容編碼 * msg.Priority = MailPriority.Normal;//郵件優先級 */ }
private void LeerCorreo(object IdOperador) { Int32 idProcesoPersonal = idProceso; try { Int32 idOperador = (int)IdOperador; using (CobranzasDataContext db = new CobranzasDataContext()) { List <Entidades.CorreosFiltros> Filtros = db.CorreosFiltros./*Where(x => x.idOperador == idOperador).*/ ToList(); String Ruta = Parametro("RutaCorreos", db); Entidades.Operadores op = db.Operadores.Single(x => x.idOperador == idOperador); Log("Leyendo: " + op.Nombre, idProcesoPersonal, idOperador); String Servidor = (op.POP3Host ?? Parametro("POP3Host", db)); if (Servidor == null) { Log("Saltando, por no tener definido un servidor", idProcesoPersonal, idOperador); return; } Int32 Puerto = (op.POP3Port ?? Convert.ToInt32(Parametro("POP3Port", db))); Boolean SSL = op.POP3SSL ?? (Parametro("POP3SSL", db) == "1"); String Usuario = op.POP3Login; String Password = op.POP3Password; if (op.POP3Password == null) { Log("Saltando, por no tener contraseña", idProcesoPersonal, idOperador); return; } DateTime?UltimaFecha = op.UltimaFechaCorreoEntrante; using (OpenPop.Pop3.Pop3Client POP3 = new OpenPop.Pop3.Pop3Client())//Iniciando el servidor POP3; { POP3.Connect(Servidor, Puerto, SSL); POP3.Authenticate(Usuario, Password); int Count = POP3.GetMessageCount(); Int32 Inicio = Count; while (true) { OpenPop.Mime.Header.MessageHeader mh = POP3.GetMessageHeaders(Inicio); if (db.Correos.Any(x => x.idOperador == idOperador && x.IdPop3 == mh.MessageId)) { break; } Inicio--; if (Inicio == 0) { break; } } Inicio++; //Inicio = UltimaFecha == null ? 1 : BuscarIdPorFecha(1, Count, POP3, UltimaFecha.Value); //Inicio -= 4; //if (Inicio < 1) Inicio = 1; Log(op.Login + " Inicio:" + Inicio + ", Total:" + Count, idProcesoPersonal, idOperador); Int32 ErroresSeguidos = 0; if (Inicio > Count) { Log("No hay correos nuevos para: " + op.Login, idProcesoPersonal, idOperador); } for (int i = Inicio; i <= Count; i++)//últimos 5 correos para verificar. { if (ErroresSeguidos == 5) { Log("Abortando Lectura de " + op.Login + " Por 5 erorres consecutivos", idProcesoPersonal, idOperador); break; } try { OpenPop.Mime.Header.MessageHeader mh = POP3.GetMessageHeaders(i); /*if (UltimaFecha != null && mh.DateSent.ToLocalTime() <= UltimaFecha) * { * Log("Saltando Mensaje", idProcesoPersonal, i); * continue; * }*/ if (db.Correos.Any(x => x.idOperador == idOperador && x.IdPop3 == mh.MessageId)) { Log("Saltando Mensaje de " + op.Login + " " + i.ToString() + "/" + Count.ToString(), idProcesoPersonal, idOperador); continue; } Log("Leyendo Mensaje de " + op.Login + " " + i.ToString() + "/" + Count.ToString(), idProcesoPersonal, idOperador); OpenPop.Mime.Message m = POP3.GetMessage(i); UltimaFecha = mh.DateSent.ToLocalTime(); String idLimpio = Limpiar(mh.MessageId); String Directorio = UltimaFecha.Value.ToString("yyyyMMdd") + "\\"; String Prefijo = UltimaFecha.Value.ToString("mmss") + "_"; String RutaCompleta = Ruta + Directorio + Prefijo + idLimpio + ".eml"; Int32 idCorreoNuevo = 0; if (!File.Exists(RutaCompleta)) { Directory.CreateDirectory(Ruta + Directorio); m.Save(new FileInfo(RutaCompleta)); } Entidades.Correos Correo = new Entidades.Correos(); Correo.IdPop3 = mh.MessageId; Correo.idOperador = idOperador; Correo.Asunto = Limitar(mh.Subject, 2000); Correo.Remitente = Limitar(mh.From.Raw, 500); Correo.FechaCreacion = mh.DateSent.ToLocalTime(); Correo.Destinatarios = Limitar(String.Join(",", mh.To.Select(x => x.Raw)), 5000); Correo.DestinatariosCopia = Limitar(String.Join(",", mh.Cc.Select(x => x.Raw)), 5000); Correo.DestinatariosCopiaOculta = Limitar(String.Join(",", mh.Bcc.Select(x => x.Raw)), 5000); Correo.RutaEml = Directorio + Prefijo + idLimpio; var Personas = Filtros.Where(x => mh.From.Address.ToLower() == x.De.ToLower()).Select(x => x.idPersona); foreach (int idPersona in Personas) { Correo.Correos_Personas.Add(new Entidades.Correos_Personas() { idPersona = idPersona }); } db.Correos.InsertOnSubmit(Correo); Correo.Fecha = DateTime.Now; db.SubmitChanges(); idCorreoNuevo = Correo.idCorreo; db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, op); op.UltimaFechaCorreoEntrante = UltimaFecha; db.SubmitChanges(); Log("Leido Mensaje de " + op.Login + " " + i.ToString() + "/" + Count.ToString() + "#" + idCorreoNuevo, idProcesoPersonal, idOperador); ErroresSeguidos = 0; } catch (OpenPop.Pop3.Exceptions.InvalidLoginException Ex) { ErroresSeguidos++; Log("Error en Mensaje: IL Op: " + op.Login + "(" + i.ToString() + "/" + Count.ToString() + "), Mensaje:" + Ex.Message, idProcesoPersonal, idOperador); } catch (OpenPop.Pop3.Exceptions.InvalidUseException Ex) { ErroresSeguidos++; Log("Error en Mensaje: IU Op: " + op.Login + "(" + i.ToString() + "/" + Count.ToString() + "), Mensaje:" + Ex.Message, idProcesoPersonal, idOperador); } catch (OpenPop.Pop3.Exceptions.LoginDelayException Ex) { ErroresSeguidos++; Log("Error en Mensaje: LD Op: " + op.Login + "(" + i.ToString() + "/" + Count.ToString() + "), Mensaje:" + Ex.Message, idProcesoPersonal, idOperador); } catch (OpenPop.Pop3.Exceptions.PopServerException Ex) { ErroresSeguidos++; Log("Error en Mensaje: PS Op: " + op.Login + "(" + i.ToString() + "/" + Count.ToString() + "), Mensaje:" + Ex.Message, idProcesoPersonal, idOperador); } catch (OpenPop.Pop3.Exceptions.PopServerLockedException Ex) { ErroresSeguidos++; Log("Error en Mensaje: PSL Op: " + op.Login + "(" + i.ToString() + "/" + Count.ToString() + "), Mensaje:" + Ex.Message, idProcesoPersonal, idOperador); } catch (OpenPop.Pop3.Exceptions.PopServerNotAvailableException Ex) { ErroresSeguidos++; Log("Error en Mensaje: PSNA Op: " + op.Login + "(" + i.ToString() + "/" + Count.ToString() + "), Mensaje:" + Ex.Message, idProcesoPersonal, idOperador); } catch (OpenPop.Pop3.Exceptions.PopServerNotFoundException Ex) { ErroresSeguidos++; Log("Error en Mensaje: SNF Op: " + op.Login + "(" + i.ToString() + "/" + Count.ToString() + "), Mensaje:" + Ex.Message, idProcesoPersonal, idOperador); } catch (OpenPop.Pop3.Exceptions.PopClientException Ex) { ErroresSeguidos++; Log("Error en Mensaje: PC Op: " + op.Login + "(" + i.ToString() + "/" + Count.ToString() + "), Mensaje:" + Ex.Message, idProcesoPersonal, idOperador); } catch (Exception Ex) { ErroresSeguidos++; Log("Error en Mensaje: Op: " + op.Login + "(" + i.ToString() + "/" + Count.ToString() + "), Mensaje:" + Ex.Message, idProcesoPersonal, idOperador); } } POP3.Disconnect(); } Log("Fin Lectura: " + op.Nombre, idProcesoPersonal, idOperador); } } catch (Exception Ex) { if (Ex.Message == "Server did not accept user credentials") { try { using (CobranzasDataContext db = new CobranzasDataContext()) { db.Operadores.Single(x => x.idOperador == (Int32)IdOperador).POP3Password = null; db.SubmitChanges(); db.Avisos.InsertOnSubmit(new Entidades.Avisos { Aviso = "El servidor ha rechazado su contraseña, por favor actualice su contraseña de correo nuevamente", FechaAviso = DateTime.Now.AddMinutes(2), FechaCrea = DateTime.Now, FechaOriginal = DateTime.Now.AddMinutes(2), idOperador = (Int32)IdOperador, idOperadorCrea = 1, VecesMostrada = 0 }); db.SubmitChanges(); } } catch { } } Log("Error General: Op:" + IdOperador + ", Mensaje:" + Ex.Message, idProcesoPersonal, (int)IdOperador); } }