
Mandar email con adjunto
#1
Escrito 03 marzo 2014 - 11:37
he probado con un montón de códigos y los mensajes de error son de lo mas diversos y no he logrado sacar ni un triste email y llevo horas y nada, asi que prefiero solicitar ayuda, antes de que me duela más la cabeza.
Lo que quiero hacer por si os vale de ayuda, es lo siguiente.
1º) se selecciona si quiero mandar un email (ok)
2º) si es así, crea del documento un archivo Pdf (oK)
3º) Paso los datos a un formulario para mandar el email, los datos son:
El email ,El asunto, la ruta del archivo, el nombre del archivo y el cuerpo del mensaje
Para llegar a este paso el cliente debe tener email (ok todo)
4) Pulso el botón mandar email, aquí lo primero que hace es comprobar si debemos mandar el texto de la ley de protección de datos (mediante un simple checkbox OK)
coge nuestros datos de la bd. configuración, Nombre de usuario, Email, Servidor en este caso 'smtp.gmail.com' y por último la contraseña (ok)
Y aquí es donde falla, salir el email
Como siempre siempre agradezco vuestra ayuda
#2
Escrito 03 marzo 2014 - 12:07
A ver si te sirve ésto de nuestro amigo poliburro.
http://elpoli.delphi...das-con-delphi/
Saludos
#3
Escrito 03 marzo 2014 - 12:09
#4
Escrito 04 marzo 2014 - 03:26

e puesto un componente IdSSLIOHandlerSocketOpenSSL vinculado a mi IDSMTP y la propiedad UseTLS en sus diferentes modos y nada, la verdad es que me tiene totalmente parado ya que es una parte fundamental en el trabajo que estoy haciendo, así que os pido ayuda nuevamente
Así es como paso los datos

Y así es el form en diseño con los componentes que veis únicamente

#5
Escrito 04 marzo 2014 - 04:26
procedure TForm1.Button1Click(Sender: TObject);
function EnviarEmail(aData, aHora : TDateTime; aHost, aLogin, aSenha,aListaEmail, aAssunto, aCorpo : String; Mifile:string) : Boolean;
var
IdSMTP : TIdSMTP;
IdMessage : TIdMessage;
Cabecalho: string;
begin
Cabecalho:= '';
Result:= False;
IdSMTP := TIdSMTP .Create(nil);
IdMessage := TIdMessage.Create(nil);
try
IdSMTP.Host:= aHost;
IdSMTP.AuthType:= satDefault;
IdSMTP.Username:= aLogin;
IdSMTP.Password:= aSenha;
IdSMTP.Connect;
IdMessage.From.Address:= aLogin;
IdMessage.Recipients.EMailAddresses:= aListaEmail;
IdMessage.Subject:= aAssunto;
IdMessage.Body.Text:='Data: '+DateToStr(aData)+#13#10+'Hora: '+TimeToStr(aHora)+#13#10+ aCorpo;
IdMessage.MessageParts.Clear;
if Mifile<>'' then TIdAttachmentFile.Create(IdMessage.MessageParts,Mifile);
try
IdSMTP.Send(IdMessage);
except
on E: Exception do
begin
MessageDlg('Error al intentar enviar este correo '+#13#10+e.Message,mtWarning,[mbok],0);
Exit;
end;
end;
finally
IdSMTP .Disconnect;
IdSMTP .Free;
IdMessage.Free;
end;
Result:= True;
end;
begin //Servido Email Correo Origen //Clave Origen Correo Destino Asunto Mensaje
// EnviarEmail(Date,Time, 'smtp.eresmas.com','Desart@eresmas.com','xxx', 'info@jl68.es','Evido de email','Enviando email via programa��o utilizando os recursos da poderosa paleta indy',fichero);
EnviarEmail(Date,Time, 'smtp.eresmas.com','Desart@eresmas.com','xxx', Edit1.text,Edit2.Text,Memo1.Lines.Text,fichero);
end;
a esta le he añadido para adjuntar ficheros en mifile con esta única linea
if Mifile<>'' then TIdAttachmentFile.Create(IdMessage.MessageParts,Mifile);
y me sale el error

que como veis es totalmente diferente, en cambio si lo mando sin fichero, funciona perfectamente, siempre y cuando no lo mande desde una cuenta Gmail, en la que me da el error antes comentado.
#6
Escrito 04 marzo 2014 - 07:24
que como veis es totalmente diferente, en cambio si lo mando sin fichero, funciona perfectamente, siempre y cuando no lo mande desde una cuenta Gmail, en la que me da el error antes comentado.
Igual es una chorrada... pero ¿te has fijado que las comillas del nombre de fichero se cierran en la siguiente línea del mensaje de error?
Igual MiFile lleva un chr(10) al final o algo del estilo.
#7
Escrito 04 marzo 2014 - 08:07
#8
Escrito 04 marzo 2014 - 03:52
Prueba con algo como 'file://c:/1.txt' en formato de URL, a ver si así le gusta, y prueba con los \ de la ruta cambiados y sin cambiar, es decir, si el primero falla, prueba con 'file://c:\1.txt' y cruza los dedos.
En la ayuda del componente debería darte más pista de estas cosas, pero no tengo yo esos componentes en D7 creo.
#9
Escrito 05 marzo 2014 - 06:48
#10
Escrito 06 marzo 2014 - 02:16
librery32dll y ssleay32.dll de la web http://indy.fulgan.com/SSL/, se supone que son para Windows 64 y mis indi son los 10.5.5, en cuanto a cargar las Dll, me he limitado a soltarlas en el directorio del programa y no he usado la tipica linea de código
stdcall; external 'xxx.dll';
para llamarlas, ya que no veo que se haga en ninguno de los ejemplos aportados, puede que hay ocurra mi error, pero si es asi, en que proceso las llamo y son las librerias correctas
#11
Escrito 06 marzo 2014 - 02:41

y este es el código que estoy usando
with IdMessage do
begin
Body.Clear();
Recipients.Clear();
Sender.Address := xxxxx@gmail.com';
Recipients.EMailAddresses := xxx@xxx.es';
Subject := edit2.Text; El asunto
Body.AddStrings(Memo1.Lines);
Adjunto:=Edit3.Text+Edit4.Text;
ShowMessage('['+Adjunto+']');
if FileExists(Adjunto) then
with TIdAttachmentFile.Create(MessageParts,Adjunto) do
begin
ContentType := 'binary';
end
end;
with IdSMTP do
begin
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23; // sslv : SSLv2, SSLv3, TLSv1, SSLv23.
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode := [];
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 0;
Port := 465;
Host := 'smtp.gmail.com';
AuthType := satDefault;
Username := 'xxxxxxx@gmail.com';
Password := 'xxxxxxxx';
try
Connect;
except
raise Exception.Create('Error de Conexión');
end;
// btnEnviarEmail.Enabled := false;
// try
// Send(IdMessage);
// ShowMessage('Correo enviado con éxito');
// finally
// btnEnviarEmail.Enabled := true;
// end;
if Connected then
Disconnect();
end;
#12
Escrito 06 marzo 2014 - 02:45
P.D. y ahora me hago un par de preguntas y cuando funcione, si en vez de mandarlo por Gmail, lo manda por una cuenta diferente, el código seguiría valiendo o habría que cambiarlo todo.
Como podéis ver no os he mentido, cuando digo que estoy verde en muchos aspectos e internet y sus comunicaciones es uno de mis puntos más débiles