Buen dia compañeros, alguien sabe de algun componente ya sea Free ó de paga para enviar mensajes de texto a celulares, no importa que se pueda pagar un plan en telcel ó movistar son las 2 empresas de celulares de méxico .
El objetivo es enviar mensajes a celulares por algun componente.
Gracias....

Componente para enviar mensajes a celulares
Comenzado por
agag4
, oct 24 2011 01:30
6 respuestas en este tema
#1
Escrito 24 octubre 2011 - 01:30
#2
Escrito 24 octubre 2011 - 03:00
Ya comente un dia que nosotors enviamos mensajes a movil gratis usando las api de windows google.
A grandes rasgos, necesitas que google admita enviar avisos de la agenda al movil, es decir, tienen que tener un acuerdo tu compañia y google para que te permita esto. Según el pais esto es lo normal o lo raro, no se en mexico como anda pero puedes comprobarlo en tu cuenta de google calendar.
El esquema es simple: Nuestro programa da de alta una cuenta en google a travas de las api, creo que las llamamos usnado indy, le pone el movil y el email en su perfil y en el calendar activa lo de enviar avisos al movil por sms y al email, todo automatico.
El dueño del movil recibe un aviso de que si esta deacuerdo en recibir sms, y un email para activar lo de recibirlos en su email, le dice que si a los dos, y listo.
Cuando tenemos que enviarle algo, creamos un evento en su agenda con el texto, le decimos que avise por email y sms, y le ponemos como fecha y hora de activacion dentro de 2 segundos, enviamos y al cabo de unos segundos nos entra el mensaje sms y el email con el texto.
Los detalles no me los se, no lo programe yo, pero si quereis algun "tip" al respecto, pedirmelo y os busco el trozo de codigo, no es ningun secreto de estado como funcionan estas apis de google, la cosa es solo la idea.
A grandes rasgos, necesitas que google admita enviar avisos de la agenda al movil, es decir, tienen que tener un acuerdo tu compañia y google para que te permita esto. Según el pais esto es lo normal o lo raro, no se en mexico como anda pero puedes comprobarlo en tu cuenta de google calendar.
El esquema es simple: Nuestro programa da de alta una cuenta en google a travas de las api, creo que las llamamos usnado indy, le pone el movil y el email en su perfil y en el calendar activa lo de enviar avisos al movil por sms y al email, todo automatico.
El dueño del movil recibe un aviso de que si esta deacuerdo en recibir sms, y un email para activar lo de recibirlos en su email, le dice que si a los dos, y listo.
Cuando tenemos que enviarle algo, creamos un evento en su agenda con el texto, le decimos que avise por email y sms, y le ponemos como fecha y hora de activacion dentro de 2 segundos, enviamos y al cabo de unos segundos nos entra el mensaje sms y el email con el texto.
Los detalles no me los se, no lo programe yo, pero si quereis algun "tip" al respecto, pedirmelo y os busco el trozo de codigo, no es ningun secreto de estado como funcionan estas apis de google, la cosa es solo la idea.
#3
Escrito 24 octubre 2011 - 06:32
Si nos puedes hacer el gran favor de poner el trozo de código para el envio del mensaje con delphi - google te lo agradeceríamos muchos

#4
Escrito 25 octubre 2011 - 06:15
Os copio-pego el trozo, no lo he repasado ni quitado cosas "de la casa", quiero decir que bueno, que si algo no complia a la primera, que useis la intuicion 
Por ciuerto, Base.CuentaGmail( integer ) y Base.ClaveGamil( integer ) nos da estos dos datos del usuairo numero i, vosotros lo cambiais por vuestras cuentas y claves de gmail.
Primero los uses que tengo, no todos seran necesarios porque mi .pas incluye otra cosas, pero los "Id" de las Indy seguro que los necesitais, y el LibXmlParser tambien:
Ahora la definicion de los dos componentes (los creamos desde codigo, no los tenemos en la paleta y esas cosas visuales) que tenemos para hacer el trabajo interno:
Ahora lo importante, el codigo de los dos componentes:
Y bueno, usarlo ya es sencillito:

Por ciuerto, Base.CuentaGmail( integer ) y Base.ClaveGamil( integer ) nos da estos dos datos del usuairo numero i, vosotros lo cambiais por vuestras cuentas y claves de gmail.
Primero los uses que tengo, no todos seran necesarios porque mi .pas incluye otra cosas, pero los "Id" de las Indy seguro que los necesitais, y el LibXmlParser tambien:
delphi
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, CtrlGrid, Menus, IdHTTP, IdMultipartFormData, IdIOHandler, IdIOHandlerSocket, LibXmlParser, LibXmlComps, IdTCPClient, IdTCPConnection, IdSSLOpenSSL, StdCtrls, ExtCtrls, DBCtrls;
Ahora la definicion de los dos componentes (los creamos desde codigo, no los tenemos en la paleta y esas cosas visuales) que tenemos para hacer el trabajo interno:
delphi
TGoogleCalendar = class(TComponent) private cliente: TIdHTTP; IdSSLIOHandlerSocket: TIdSSLIOHandlerSocket; datosPost: TStringList; Frespuesta: TStringList; datosAutenticacion: TStringList; auth: string; Parser: TXmlParser; FAvisoEmail: boolean; FAvisoSMS: boolean; FTitulo: string; FTexto: string; //FDonde: string; FFechaEvento: TDateTime; FHoraEvento: TDateTime; FJustoAhora: boolean; //FHoraEvento: TTime; FCorreo: string; FClave: string; FActivo: boolean; function toGoogleDate(value: TDateTime): string; procedure SetCorreo(value: string); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function Conectar: boolean; function NuevaEntrada: string; //Devuelve el identificador de google para la nueva entrada o '' function ActualizaEntrada(idEntrada: string): string; //Devuelve el identificador de google para la nueva entrada o '' property Respuesta: TStringList read Frespuesta; property AvisoEmail: boolean read FAvisoEmail write FAvisoEmail; property AvisoSMS: boolean read FAvisoSMS write FAvisoSMS; property Titulo: string read FTitulo write FTitulo; property Texto: string read FTexto write FTexto; //property Donde: string read FDonde write FDonde; property FechaEvento: TDateTime read FFechaEvento write FFechaEvento; property HoraEvento: TDateTime read FHoraEvento write FHoraEvento; //property HoraEvento: TTime read FHoraEvento write FHoraEvento; property JustoAhora: boolean read FJustoAhora write FJustoAhora; property Correo:string read FCorreo write SetCorreo; property Clave:string read FClave write FClave; property Activo: boolean read FActivo; end; //Envío de SMS a través de google calendar TSMS = class(TComponent) private FUsuario: integer; FTexto: string; Mensajes: TStringList; FLog: TStringList; googleCalendar: TGoogleCalendar; procedure SetTexto(value: string); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Usuario: integer read FUsuario write FUsuario; property Texto: string read FTexto write SetTexto; property Log: TStringList read FLog; function enviar: boolean; end;
Ahora lo importante, el codigo de los dos componentes:
delphi
{ . TGoogleCalendar . } constructor TGoogleCalendar.Create(AOwner: TComponent); begin inherited; //Creo objetos cliente:= TIdHTTP.Create(self); IdSSLIOHandlerSocket:= TIdSSLIOHandlerSocket.Create(self); IdSSLIOHandlerSocket.SSLOptions.Method:= sslvTLSv1; Parser:= TXmlParser.Create; datosPost:= TStringList.Create; Frespuesta:= TStringList.Create; datosAutenticacion:= TStringList.Create; //Configuro objetos cliente.AllowCookies:= true; cliente.IOHandler:= IdSSLIOHandlerSocket; cliente.ProxyParams.BasicAuthentication:= false; FAvisoEmail:= false; FAvisoSMS:= false; //El evento no es inmediato por defecto FJustoAhora:= false; FActivo:= false; FHoraEvento:= Txt2Hora('11:30:00'); end; destructor TGoogleCalendar.destroy; begin FreeAndNil(cliente); FreeAndNil(IdSSLIOHandlerSocket); FreeAndNil(datosPost); FreeAndNil(Frespuesta); FreeAndNil(datosAutenticacion); FreeAndNil(Parser); inherited; end; function TGoogleCalendar.Conectar: boolean; begin //Creamos una instancia de la clase TIdMultiPartFormDataStream //que nos sirve para determinar luego los distintos pares //"claves=valor" de que se compone un supuesto "Post HTTP" Result:= true; try cliente.Request.ContentType := 'application/x-www-form-urlencoded'; cliente.Request.UserAgent := 'HCSoft'; //Como puede verse añadir pares "clave=valor" no resulta cliente.Request.Username:= correo; cliente.Request.Password:= clave; //nada complicado. Pueden añadirse tantas como sean precisas. datosPost.Clear; datosPost.Add('Email='+correo); datosPost.Add('Passwd='+clave); datosPost.Add('source=exampleCo-exampleApp-1'); datosPost.Add('service=cl'); datosPost.Add('GData-Version: 2'); //Y en la siguiente línea se lleva a cabo el "Post HTTP" //y además se obtiene su respuesta, que viene dada por el //propio método "Post" de la clase "TIdHttp". datosAutenticacion.Text := cliente.Post('[url=https://www.google.com/accounts/ClientLogin',]https://www.google.com/accounts/ClientLogin',[/url] datosPost); auth:= datosAutenticacion.Values['auth']; except Result:= false; end; end; function TGoogleCalendar.toGoogleDate(value: TDateTime): string; begin Result:= FormatDateTime('yyyy-mm-dd', value); end; procedure TGoogleCalendar.SetCorreo(value: string); begin FCorreo:= value; FActivo:= FCorreo<>''; end; function TGoogleCalendar.NuevaEntrada: string; begin Result:= ''; cliente.Request.ContentType:='application/atom+xml'; cliente.Request.CustomHeaders.Add('Authorization: GoogleLogin auth='+auth); cliente.HandleRedirects:= true; cliente.HTTPOptions:= []; datosPost.Clear; datosPost.Add('<entry xmlns=''[url=http://www.w3.org/2005/Atom'']http://www.w3.org/2005/Atom''[/url] '+ 'xmlns:gd=''[url=http://schemas.google.com/g/2005'']http://schemas.google.com/g/2005''[/url]>'+ '<category scheme=''[url=http://schemas.google.com/g/2005#kind'''+]http://schemas.google.com/g/2005#kind'''+[/url] ' term=''[url=http://schemas.google.com/g/2005#event'']http://schemas.google.com/g/2005#event''[/url]></category>'+ '<title type=''text''>'+Titulo+'</title>'+ '<content type=''text''>'+Texto+'</content>'+ '<gd:transparency'+ ' value=''[url=http://schemas.google.com/g/2005#event.opaque'']http://schemas.google.com/g/2005#event.opaque''[/url]>'+ '</gd:transparency>'+ '<gd:eventStatus'+ ' value=''[url=http://schemas.google.com/g/2005#event.confirmed'']http://schemas.google.com/g/2005#event.confirmed''[/url]>'+ '</gd:eventStatus>'+ //'<gd:where valueString='''+Donde+'''></gd:where>'+ iif(JustoAhora, '<gd:when startTime='''+toGoogleDate(date)+'T'+hora2txt(IncMinute(HoraGMT,2))+'.000Z''>', '<gd:when startTime='''+toGoogleDate(FechaEvento)+'T'+hora2txt(HoraGMT(HoraEvento))+'.000Z''>')+ iif(AvisoEmail,'<gd:reminder minutes=''1'' method=''email'' />','')+ iif(AvisoSMS, '<gd:reminder minutes=''1'' method=''sms'' />','')+ '</gd:when>'+ '</entry>'); try Respuesta.Text := cliente.Post('[url=http://www.google.com/calendar/feeds/default/private/full',]http://www.google.com/calendar/feeds/default/private/full',[/url] datosPost); except end; //Conseguir identificador de entrada Parser.LoadFromBuffer(PAnsiChar(Respuesta.text)); //Prepara el escaneo por el documento Parser.StartScan; // Escaneamos el texto xml while Parser.Scan do begin //Aquí el parser te dice lo que ha encontrado case Parser.CurPartType of ptContent, ptCData : begin if (Parser.CurName='id') then begin Result:= Parser.CurContent; Result:= copy(Result,pos('full/',Result)+5,length(Result)); end; end; end; end; end; function TGoogleCalendar.ActualizaEntrada(idEntrada: string): string; var txt: string; s: TMemoryStream; urlEdit: string; begin inherited; Result:= ''; cliente.Request.ContentType:=''; cliente.Request.CustomHeaders.Add('Authorization: GoogleLogin auth='+auth); cliente.HandleRedirects:= true; try //Primero obtengo el evento correspondiente Respuesta.Text:= cliente.Get('[url=http://www.google.com/calendar/feeds/default/private/full/'+idEntrada]http://www.google.com/calendar/feeds/default/private/full/'+idEntrada[/url]); except //Si no encuentro el evento, en lugar de actualizar simplemente creo un evento nuevo. Result:= NuevaEntrada; end; Parser.LoadFromBuffer(PAnsiChar(Respuesta.text)); //Prepara el escaneo por el documento Parser.StartScan; // Escaneamos el texto xml para buscar la url del documento en cuestión. // Al mismo tiempo, en txt voy guardando el contenido xml del evento a actualizar // y colocando los nuevos valores. while Parser.Scan do begin //Aquí el parser te dice lo que ha encontrado case Parser.CurPartType of ptStartTag, ptEmptyTag : begin if Parser.CurName='gd:when' then begin txt:= txt+iif(JustoAhora, '<gd:when startTime='''+toGoogleDate(date)+'T'+hora2txt(IncMinute(HoraGMT,2))+'.000Z''>', '<gd:when startTime='''+toGoogleDate(FechaEvento)+'T'+hora2txt(HoraGMT(HoraEvento))+'.000Z''>'); txt:= txt+iif(AvisoEmail,'<gd:reminder minutes=''1'' method=''email'' />',''); txt:= txt+iif(AvisoSMS, '<gd:reminder minutes=''1'' method=''sms'' />',''); end else if Parser.curName='gd:reminder' then else begin txt:= txt+copy(Parser.CurStart,1,Parser.CurFinal-Parser.curStart+1); if Parser.CurName='content' then txt:= txt+Texto; //Si es la etiqueta del documento a editar... if (Parser.CurName='link') then if Parser.CurAttr.Value('rel')='edit' then urlEdit:= Parser.CurAttr.Value('href'); //Guardo la url concreta end; end; ptContent, ptCData : begin if (Parser.CurName='title') then txt:= txt+Titulo else if (Parser.CurName='content') then // Evito añadir nada, ya lo he añadido antes (lo he puesto antes porque si la descripcion estaba //vacia, no pasa por este "case". else txt:= txt+copy(Parser.CurStart,1,Parser.CurFinal-Parser.curStart+1); end; else txt:= txt+copy(Parser.CurStart,1,Parser.CurFinal-Parser.curStart+1); end; end; //Ahora modifico la entrada cliente.Request.ContentType:='application/atom+xml'; cliente.Request.CustomHeaders.Add('Authorization: GoogleLogin auth='+auth); cliente.Request.CustomHeaders.Add('If-Match: *'); cliente.HandleRedirects:= true; cliente.HTTPOptions:= []; datosPost.Clear; datosPost.Text:= txt; s:= TMemoryStream.Create; datosPost.SaveToStream(s); try Respuesta.Text := cliente.put(urlEdit, s); except FreeAndNil(s); end; FreeAndNil(s); //Conseguir identificador de entrada Parser.LoadFromBuffer(PAnsiChar(Respuesta.text)); //Prepara el escaneo por el documento Parser.StartScan; //Escaneamos el texto xml para obtener el identificador del nuevo evento while Parser.Scan do begin //Aquí el parser te dice lo que ha encontrado case Parser.CurPartType of ptContent, ptCData : begin if (Parser.CurName='id') then begin Result:= Parser.CurContent; Result:= copy(Result,pos('full/',Result)+5,length(Result)); end; end; end; end; end; { . TSMS . } constructor TSMS.Create(AOwner: TComponent); begin inherited; googleCalendar:= TGoogleCalendar.Create(self); FLog:= TStringList.Create; Mensajes:= TStringList.Create; end; destructor TSMS.destroy; begin FreeAndNil(Mensajes); FreeAndNil(FLog); FreeAndNil(googleCalendar); inherited; end; //Cuando recibimos el texto a enviar, lo partimos en tantos trozos como sea necesario //para poder enviar todo el mensaje (de momento, 2/4/2009, 56 caracteres max) procedure TSMS.SetTexto(value: string); var i, len: integer; str: string; partido: boolean; const lenSMS=56; begin Mensajes.Clear; partido:= false; len:= Length(value); for i:=1 to len do begin if (i mod (lenSMS-6)) = 0 then begin //Podría tener que partir, acabo de llegar al límite if (len-i > 6) or partido then begin //Guardo un mensaje nuevo y comienzo el siguiente Mensajes.Add(str); str:= value[i]; partido:= true; end else //Me quedan menos de 5 caracteres, luego caben en el actual str:= str+ value[i]; end else //Caso normal, voy añadiendo al mensaje str:= str + value[i]; end; //Finalmente añado el último trozo que quede Mensajes.Add(str); if Mensajes.Count>1 then begin //Si hay varios mensajes debo numerarlos for i:= 0 to Mensajes.Count-1 do begin Mensajes[i]:= Mensajes[i]+'('+intToStr(i+1)+'/'+intToStr(Mensajes.Count)+')'; end; end; end; function TSMS.Enviar: boolean; var salida: string; i: integer; begin Result:= true; FLog.Clear; googleCalendar.Correo:= Base.CuentaGmail(FUsuario); googleCalendar.Clave:= Base.ClaveGmail(FUsuario); //Si el usuario tiene cuenta en su ficha --> Está activo if googleCalendar.Activo then begin googleCalendar.AvisoSMS:= true; googleCalendar.JustoAhora:= true; //Se genera al isntante googleCalendar.FechaEvento:= Today; //Nos autenticamos if googleCalendar.Conectar then begin for i:= 0 to Mensajes.Count-1 do begin //Vamos enviando cada uno de los mensajes googleCalendar.Titulo:= Mensajes[i]; //Intentamos crear la entrada salida:= googleCalendar.NuevaEntrada; if salida='' then FLog.Add(Base.Traduce('No se ha podido enviar el sms.')) else FLog.Add(Base.Traduce('El sms se ha enviado correctamente')); end; //for end else FLog.Add(Base.Traduce('No se ha podido enviar el sms. Error de autenticación.')); end else //No activo FLog.Add(Base.Traduce('No se ha podido enviar el sms. El destinatario no tiene '+ 'cuenta de gmail con calendario asociada en su ficha.')); end;
Y bueno, usarlo ya es sencillito:
delphi
sms.Usuario:= Str2Int(EdPara.Text); sms.Texto:= EdTexto.Text; if not sms.enviar then ShowMessage('Error envio SMS');
#5
Escrito 15 octubre 2012 - 12:29
Está excelente pero desafortunadamente en México no hay convenio entre las operadoras de móviles y gmail, no está México en la lista de operadores. Obviamente no les conviene ya que esto por parte de Gmail no tiene costo.
#6
Escrito 23 octubre 2012 - 11:53
te equivocas en mexico ya se puede, solo que no entiendo ccomo esta organizado alguien me podria explicar
#7
Escrito 23 octubre 2012 - 01:07
Así es uziel gracias por el dato, confirmado.., mande el sms de confirmación para la activación y ahora si me llegó el sms; al igual que los recordatorios de la agenda. 
Saludos

Saludos