Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Fallo en el envío de correo (https://www.clubdelphi.com/foros/showthread.php?t=79387)

Loviedo 30-06-2012 01:12:39

Fallo en el envío de correo
 
Al enviar correo (un solo destino), este còdigo funciona correctamente, pero si envío un correo masivo, si un destino falla, no llega al
resto de destinatarios. Sin embargo si todos los destinos son correctos no hay problema.
Utilizo delphi7, indy, yahoo.
Si alguien conoce este error, le agradezco su ayuda.
Gracias anticipada. Saludos.

Código Delphi [-]
procedure TFCorreo1.Enviocorreo1;
var
  i: integer;
begin
  SMTP.Host := mHost;
  SMTP.Port := 25;
  SMTP.username := mUsuario;
  SMTP.password := mPassword;

  MailMessage.Clear;
  MailMessage.From.Address := mEmail;
  MailMessage.From.Name := mNombre;
  MailMessage.Recipients.EMailAddresses := mEmail;
  MailMessage.Subject := 'Comunidad de Propietarios';
  MailMessage.Body.Text := Memo1.text;

   // Envío masivo
  for i := 0 to CLB1.Items.count-1 do  // CLB1 es un TCheckListBox
    if CLB1.State[i] = cbChecked then
      MailMessage.CCList.add.Address := Query4EMAIL.Text; {destino}

  for i := 0 to LB1.Items.count-1 do      // LB1 es un TListBox
    if FileExists(LB1.Items[i]) then
       TIdAttachment.Create(MailMessage.MessageParts,LB1.Items[i]);
  try
    try
      SMTP.Connect(1000);
      SMTP.Send(MailMessage);
    except
      showmessage('Fallo en el Envío de Correo');
    end;
  finally
    SMTP.Disconnect;
  end;
end;

mamcx 30-06-2012 03:10:50

Cita:

Empezado por Loviedo (Mensaje 436422)
Si alguien conoce este error, le agradezco su ayuda.

Si, alguien conoce el error.

Quien? No se. No se cual es el error.

Un mensaje amistoso del grupo de "Lee la guía de estilo" ;)

Loviedo 30-06-2012 10:16:05

El error es el siguiente:

paco@yahoo.es
pepe@yahoo.es
pedro@yahoo.es

El envío es correcto, los tres reciben el correo.

paco@yahoo.es
pepe@yah
pedro@yahoo.es

Nadie recibe el correo, entiendo que paco y pedro deberían recibirlo.
Saludos.

Casimiro Notevi 30-06-2012 10:20:36

Además de nuestra guía de estilo, también tenemos "la otra guía de estilo", cuyo punto 3 dice:
Cuando te aparezca un mensaje de error, no te molestes en decirnos cuál es. Nos encanta tratar de adivinar.

Aquí está:
Cita:

La otra guía de estilo
  1. No te preocupes por dónde colocar tus preguntas. A nosotros nos encanta abrir todos los mensajes sin importar en qué foro estén.
  2. Ni pienses qué título ponerle a tu mensaje. "Tengo una duda" es suficiente para que nosostros entendamos que estás en problemas.
  3. Cuando te aparezca un mensaje de error, no te molestes en decirnos cuál es. Nos encanta tratar de adivinar.
  4. Cuando publiques código no te preocupes porque quede bien presentado. Nosotros distinguimos perfectamente los bloques sin necesidad de ninguna indentación.
  5. Si tienes un problema con bases de datos no es necesario que nos digas qué motor usas, nosotros sabemos la respuesta para cualquiera de ellos.
  6. Si no se entiende lo que preguntas, ni te molestes en aclarar. Nos fascinan los misterios.
  7. No te esfuerces en oprimir F1. Nosotros ya lo hemos hecho y podemos darte la respuesta más rápido.
  8. La opción de búsqueda en los foros sólo está para adornar la página. Es divertidísimo contestar una y otra vez lo mismo.
  9. ¿Google? Eso es para nerds como nosotros.
  10. Ante un problema, no te molestes en tratar de entenderlo. Nosotros ya nos hemos quemado las pestañas por tí y estamos felices de escribirte el código.
  11. Si te plase, eskribe con kas y faltas de hortografia. Komo nosotros no entramos a los chats nos encanta pensar ke estamos en 1.
  12. Si en cinco minutos nadie te ha contestado, siéntete en libertad de abrir cuantos hilos puedas para preguntar lo mismo. Tú no mereces ese trato.
  13. Nunca des las gracias. Nos encanta responder sin más aliciente que ver nuestro nombre escrito.
  14. Cuando escribas un mensaje, siéntente en libertad de no volver en tres semanas. Nosotros estaremos aquí resolviendo tu problema.
  15. Si eres nuevo, acláralo desde el principio. Con eso basta para que nosotros resolvamos tu problema. Tú aún no puedes consultar la ayuda.
  16. Si alguien te remite a la guía de estilo, no te molestes en leerla. Tú tienes cosas más importantes que hacer y a fin de cuentas, nadie la lee.
  17. Si encuentras la solución tú mismo, no te molestes en explicarla. Bastará con un "Ya lo resolví, gracias". Nos emociona ver gente autosuficiente.
  18. No dudes en pedir que te envíen la solución a tu correo. El foro está sólo para los ociosos y tú no tienes tiempo que perder.

:D:D:D Está gracioso.

Con respecto a tu problemita con ese código, creo que deberías cambiar la forma en que lo haces, me explico:

Loviedo 30-06-2012 13:38:55

Creo que la ayuda solicitada está perfectamente detallada pero no hay inconveniente en describir el error, porque creo que aclara menos que la pregunta.

error:
syntax error in arguments

Tengo 62 años, esto para mí es un hobby, no es mi profesión ni me lucro con ello, llevo mucho tiempo en este foro, pero a veces es decepcionante las respuestas que se dan, es muchos más elegante no responder, pués nadie está obligado a ello, no se si preguntas poco clara aumenta mucho el trabajo de los moderadores. Lo siento.
saludos.

marcoszorrilla 30-06-2012 13:46:37

Con el código que tienes, por qué no te construyes una función para enviar un solo correo cada vez, mediante un bucle llamas a la función pasándole una dirección cada vez así el fallo de alguna de las direcciones no afectaría a las otras, aunque no estaría demás dentro del Try incluir un mensaje la dirección xxx no pudo procesarse.

Un Saludo.

Loviedo 30-06-2012 14:01:43

Gracias por la respuesta, pensé en ello, pero como es un tema muy tratado en el foro (correo automático), y como sólo es un hobby,
tenía curiosidad por una posible solución al envío masivo.
Saludos.

Loviedo 30-06-2012 14:21:01

Optaré por la solución del Sr. Marcoszorrilla. Gracias.
Saludos.

Casimiro Notevi 30-06-2012 15:56:24

Cita:

Empezado por Loviedo (Mensaje 436434)
Creo que la ayuda solicitada está perfectamente detallada pero no hay inconveniente en describir el error, porque creo que aclara menos que la pregunta.
error:
syntax error in arguments
Tengo 62 años, esto para mí es un hobby, no es mi profesión ni me lucro con ello, llevo mucho tiempo en este foro, pero a veces es decepcionante las respuestas que se dan, es muchos más elegante no responder, pués nadie está obligado a ello, no se si preguntas poco clara aumenta mucho el trabajo de los moderadores. Lo siento.
saludos.

Hola, el detallar lo mejor posible la pregunta, ni aumenta ni disminuye el trabajo de los moderadores, lo único que consigues es que te ayuden antes y mejor :)
Si las respuestas son decepcionantes pueden deberse a varios motivos:
1. Que la pregunta es decepcionante, por lo que es imposible ayudar.
2. Que la pregunta no es clara, por lo que induce a equívocos al tratar de "descifrar" lo que se pregunta, por lo que se dan respuestas variadas.
3. Que el que responde contesta lo que buenamente sabe, por tratar de ayudar, para encaminar o para dar alguna pista de por donde van los "tiros".

Por ejemplo, ahora dices que el error es "syntax error in arguments", eso es muy diferente a lo que dijiste antes. Es como si vas al médico y le dices que te duele la cabeza y el brazo derecho... pero se te "olvida" contarle que te caiste con la moto ;)

Si se quieren respuestas buenas entonces habría que ver exactamente el mensaje del error, en qué línea del código se ha producido, qué valores tienen las variables involucradas, etc.

Por cierto, el que sea un hobby no implica que podamos dar respuestas distintas. El "médico por hobby" tiene que hacer su trabajo igual que el profesional, salvo que no le importe "perder" a sus pacientes ;)

Aquí también somos todos voluntarios, que ayudamos cada uno en lo que podemos, también hay muchas más personas que están igual que tú, que tiene todo esto como hobby. Y por la edad, bueno, no creas que somos todos unos jovencitos tampoco, ojalá :rolleyes:

Resumiendo, puedes hacer un bucle y enviar un mensaje cada vez con un try except, tal y como se te ha explicado o puedes usar un "truco" que no sé si te vale en tu caso, te explico:
Si todos los emails son iguales y van dirigidos a distintas direcciones, puedes enviarlos como "CCO", o sea, que todos las direcciones van en un único email enviado, pero todas las direcciones van en CCO (copia oculta, creo recordar que se llama), así de esa manera cada uno recibe su email pero no ve las direcciones de nadie más, no puede saber a quién más se le ha enviado.
Te puedo pasar un ejemplo, aunque no está hecho con Indy, pero para darte una idea, voy a buscarlo y te lo copio a continuación.

Casimiro Notevi 30-06-2012 16:16:31

Bueno, aquí está el código, a ver si te sirve para algo, es muy antiguo, de hace unos 11 años, pero hay muchas empresas que siguen usándolo, sin problemas:

Uso el MAPImail de Scalabium Software

Código Delphi [-]
procedure TfrmMailing.btSendEmailClick(Sender: TObject);
var
  iX, iEmails : Cardinal;
begin
  mapiEmail.Recipients.Text:='';
  mapiEmail.Attachments.Text:='';
  iEmails := 0;
  //
  if (edMailTo.Text='') or (edSubject.Text='') then
  begin
    MensajeAviso('Debe escribir una dirección de email y un asunto');
    edMailTo.SetFocus;
    abort;
  end;
  //
  mapiEmail.Recipients.Add( edMailTo.Text );
  inc( iEmails );   // el edMailTo
  //
  try // Ahora le damos las direcciones para BCC
    mtD.DisableControls;  // <- esto es una tabla en memoria, en tu caso el checklistbox
    mtD.First;
    while not mtD.Eof do
    begin
      if mtD.FieldByName('sacar').AsInteger = 1 then
      begin
        mapiEmail.Recipients.Add( 'BCC:'+mtD.FieldByName('email').AsString );
        Inc( iEmails );
      end;
      mtD.Next;
    end;
    mtD.First;
    mtD.EnableControls;
  except
    MensajeError('Error al crear los emails BCC');
    abort;
  end;
  //
  if iEmails < 1 then
  begin
    MensajeAviso('No hay ningún destinatario para el email');
    exit; //abort;
  end;
  //
  if MensajeConfirmacion('Se va a enviar el mensaje a '+
                          IntToStr(iEmails)+' destinos, ¿Desea continuar?')<>mrYes then
    exit; //abort;
  //
  if lbAdj.Items.Count > 0 then
  begin
    try // Añadimos los Adjuntos
      for iX := 0 to lbAdj.Items.Count-1 do
        mapiEmail.Attachments.Add( lbAdj.Items.Strings[iX] );
    except
      MensajeError('Error al añadir los archivos adjuntos');
      exit; //abort;
    end;
  end;
  //
  try // Enviar el mensaje
    mapiEmail.Subject := edSubject.Text;
    mapiEmail.Body := reText.Lines.Text;
    //
    mapiEmail.EditDialog := false; //true;  PARA QUE SE MUESTRE EL PROGRAMA DE CORREO O NO. !!!!!!!
    //
    mapiEmail.Send;
    //
    iX := mapiEmail.LastError;
    if iX <> SUCCESS_SUCCESS then
      MensajeAviso('No se pudo enviar el mailing'#13#10'Error: '+IntToStr(iX)+' -> '+MAPIErrorDescription(iX))
    else
      MensajeAviso('Mailing enviado.');
  except
    MensajeError('Error de datos para el email');
    abort;
  end;
end;

Loviedo 30-06-2012 17:02:54

Gracias. Lo probaré.
Saludos.

marcoszorrilla 30-06-2012 17:16:42

Aunque no es exactamente lo que quieres quizás te sirva alguna parte del código:

Código Delphi [-]
procedure TfrConAlumnos.spCorreoClick(Sender: TObject);
Var
i:integer;
stlCorreo:TStringList;
nVacios:Integer;
s:String;
begin
stlCorreo:= TStringList.Create;
nVacios:=0;

  for i := 0 to frConAlumnos.Reja.SelectedRows.Count-1 do
  begin
  frConAlumnos.Reja.DataSource.DataSet.Bookmark := frConAlumnos.Reja.SelectedRows[i];

   if (pos('@',DmoJuanes.AlumnosCorreoel.AsString) > 0) and (pos('.',DmoJuanes.AlumnosCorreoel.AsString) > 0) then
   stlCorreo.Add(Trim(DmoJuanes.AlumnosCorreoel.Value)+';')
   else
   nVacios:=nVacios + 1;

  end;

  if nVacios > 0 then
  ShowMessage('Atención: Se han encontrado direcciones incorrectas en la selección y se han omitido.');

ShellExecute(0, 'open', PAnsiChar('Mailto:'+stlcorreo.CommaText), nil, nil,0);
stlCorreo.Free;
end;

Un Saludo.

Loviedo 30-06-2012 17:58:51

Lo del Sr. Casimaimiro no me da error, pero llama al 'outlook', yo utilizo 'yahoo', también probé con 'gmail', pero el resultado es el mismo.
Muchas gracias. la solucíon del Sr. Marcoszorrilla de momento funciona. El envío masivo es para una comunidad de propietarios, y solo somos 26.
Saludos.

Loviedo 30-06-2012 20:48:30

Encontré el fallo.
El componente Indy no admite 'pepe@yahoo' como dirección de correo, pero si 'pepe@yah.es' aunque las dos son incorrectas.
Saludos.

Casimiro Notevi 30-06-2012 20:56:11

Cita:

Empezado por Loviedo (Mensaje 436449)
Encontré el fallo.
El componente Indy no admite 'pepe@yahoo' como dirección de correo, pero si 'pepe@yah.es' aunque las dos son incorrectas.
Saludos.

Claro, no puedes saber si una dirección es correcta o no, sólo puedes verificar que tiene la arroba y el punto. Pero de todas formas, Indy (o lo que uses) debe enviar el mensaje a su destinatario, aunque no exista. Ya se encargará yahoo/gmail/elquesea de devolverte el mensaje indicando que la dirección no existe.

Así que si verificas y eliminas las direcciones incorrectas, por ejemplo con el código que te ha pasado antes marcoszorrilla, ya podrás enviar todos tus emails sin problemas.
Aunque para enviar 26 emails, que son muy poquitos, puedes verificarlo visualmente tú mismo en unos segundos de que están correctos y te quitas de problema.
Saludos.

Loviedo 30-06-2012 22:37:53

En el primer caso (pepe@yahoo) el error lo detecta el componente Indy, en el segundo (pepe@yah.es), es Yahoo quien avisa de que la direccion no existe.
Saludos y gracias por todo.

Casimiro Notevi 01-07-2012 08:14:51

Exacto, sólo debes controlar de que la dirección está bien "formada", un texto, una arroba, un texto, un punto, un texto. Antes de la arroba pueden ir puntos también, por lo que la "plantilla" sería:
cualquiercosa@cualquiercosa.algo
Como pueden ir puntos antes, entonces mejor verificar tras la arroba
cualquier.cosa@cualquiercosa.algo


La franja horaria es GMT +2. Ahora son las 11:46:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi