Ir para conteúdo
  • Cadastre-se

Formulario "indique" para enviar email a um amigo IOS


Posts Recomendados

Boa tarde, estou fazendo um formulario para enviar link do app para um amigo(a) do usuario.

salvei nomeDoUsuario, nomeDoAmigo e emailDoAmigo em strings separadas.

Agora quero enviar para emailDoAmigo o link do meu app, ficaria +- assim:

Olá "nomeDoAmigo",

"nomeDoUsuario" enviou está indicaçao para voce:

"link do app".

// o email seria enviado com meu dominio no caso!

voce tem alguma dica de como posso fazer isso ?

Obrigado!

Link para o comentário
Compartilhar em outros sites

  • Respostas 14
  • Criado
  • Última resposta

Top Postadores Neste Tópico

Primeiro de tudo, adicione o framework necessário:

Vai nas configurações do projeto (logo no topo da,lista de classes no XCode). Clique no ícone do seu app, em "Targets" > Build Phases > expanda "Link binary with libraries" > pesquise por "MessageUI" (sem aspas) > selecione o framework e clique em "Add".

Agora informe ao viewController.h onde o form de email será mostrado que ele é delegate de <MFMailCompose e adicione as bibliotecas necessárias.


#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
@interface viewController : UIViewController <MFMailComposeViewControllerDelegate>
@end
[/CODE]

Adicione os seguintes métodos no seu viewController.m:

[CODE]
// Launches the Mail application on the device.
-(void)launchMailAppOnDevice
{
NSString *recipients = @"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!";
NSString *body = @"&body=It is raining in sunny California!";

NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body];
email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];
}
#pragma mark -
#pragma mark Compose Mail
// Displays an email composition interface inside the application. Populates all the Mail fields.
-(void)displayComposerSheet
{
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;

// Set up recipients
NSArray *toRecipients = [NSArray arrayWithObject:@"emailDoAmigo@exemplo.com.br"];

[picker setToRecipients:toRecipients];
[color=#8d5f25]
[color=#ffffff][p[/color][color=#1e9dcc]setSubject[/color][color=#ffffff]:[/color]@"Seu amigo te indicou um app!"[color=#ffffff]];[/color][/color][color=#8d5f25]
[color=#ffffff][p[/color][color=#1e9dcc]setMessageBody[/color][color=#ffffff]:[/color]@"Olá, amigo do Fulano! Ele te indicou este app aqui: http://linkDOSeuApp.com.br"[color=#ffffff] [/color][color=#1e9dcc]isHTML[/color][color=#ffffff]:[/color][color=#c04f53]YES[/color][color=#ffffff]];[/color][/color]

[self presentModalViewController:picker animated:YES];
}

// Dismisses the email composition interface when users tap Cancel or Send. Proceeds to update the message field with the result of the operation.
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
[self dismissModalViewControllerAnimated:YES];
}
-(IBAction)showPicker:(id)sender
{
// This sample can run on devices running iPhone OS 2.0 or later
// The MFMailComposeViewController class is only available in iPhone OS 3.0 or later.
// So, we must verify the existence of the above class and provide a workaround for devices running
// earlier versions of the iPhone OS.
// We display an email composition interface if MFMailComposeViewController exists and the device can send emails.
// We launch the Mail application on the device, otherwise.

Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
if (mailClass != nil)
{
// We must always check whether the current device is configured for sending emails
if ([mailClass canSendMail])
{
[self displayComposerSheet];
}
else
{
[self launchMailAppOnDevice];
}
}
else
{
[self launchMailAppOnDevice];
}
}
[/CODE]

Vamos focar na parte que é importante pra você:

[CODE]
-(void)displayComposerSheet
{
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;

// Set up recipients
NSArray *toRecipients = [NSArray arrayWithObject:@"iluno@deaaz.com.br"];

[picker setToRecipients:toRecipients];
[picker setSubject:@"Seu amigo te indicou um app!"];
[picker setMessageBody:@"Olá, amigo do Fulano! Ele te indicou este app aqui: http://linkDOSeuApp.com.br" isHTML:NO];

[self presentModalViewController:picker animated:YES];
}
[/CODE]

É aqui onde você seta o destinatário do email, o assunto do email a ser enviado e o corpo da mensagem. As strings você trabalha da forma que achar melhor. Ali em [font=courier new,courier,monospace][picker setMessageBody:@"Olá, amigo do Fulano! Ele te indicou este app aqui: http://linkDOSeuApp.com.br" isHTML:NO]; [font=arial,helvetica,sans-serif][size=3][size=4]você pode escolher entre enviar um email HTML ou não. Mas lembrando que se você enviar um email HTML, a string com o corpo da mensagem deve ser um código HTML.[/size][/size][/font][/font]

[font=courier new,courier,monospace][font=arial,helvetica,sans-serif][size=3][size=4]Não é necessário definir o email do remetente porque o app vai enviar o email através da conta padrão do usuário, definida nas configurações (a mesma conta que ele usa no Mail App).[/size][/size][/font][/font]

Editado por Gabriel Vincent
Link para o comentário
Compartilhar em outros sites

Esqueci de dizer:

em viewController.h, crie o método para linkar com um botão no interface builder:


- (IBAction)showPicker:(id)sender;
[/CODE]

A não ser que você queira que o método seja chamado de outra forma que não permita a interação com o interface builder. Aí você cria o método em viewController.m como void e não precisa criá-lo em viewController.h:

[CODE]
- (void) showPicker {
//Aqui o código é igual a se fosse uma IBAction
}
[/CODE]

Link para o comentário
Compartilhar em outros sites

Opa, primeiramente obrigado pela dica,

implementei o codigo tudo certinho, no remetente e menssagem coloquei minhas strings, que serao o que o usuario digitar nos TextField, porem nao recebo o email quando faço o teste, estou usando o simulador pois estou ainda aguardando minha conta developer que comprei a uma semana,

No simulador habilitei a opçao de enviar emails, tem mais alguma coisa que tenho que fazer ? Ou o problema seria no código mesmo, lembrando que está tudo certo, nenhum issue , verifiquei varias vezes o codigo para me certificar!

Link para o comentário
Compartilhar em outros sites

o que eu fiz foi o seguinte, criei uma nova classe no meu progeto, MailComposer.h e MailComposer.m

em MailComposer.h


#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
@interface MailComposer : UIViewController <MFMailComposeViewControllerDelegate>{

IBOutlet UITextField *seuNome;
IBOutlet UITextField *seuEmail;
IBOutlet UITextField *amigoNome;
IBOutlet UITextField *amigoEmail;
IBOutlet UILabel *message;
}
@property (nonatomic, retain) IBOutlet UILabel *message;
- (void) showPicker ;
- (IBAction)chamada:(id)sender;
-(void)displayComposerSheet;
-(void)launchMailAppOnDevice;
@end
[/CODE]

em MailComposer.m

[CODE]
#import "MailComposer.h"
@implementation MailComposer
@synthesize message;

-(IBAction)chamada:(id)sender{

[self showPicker];

}
- (void) showPicker
{
// This sample can run on devices running iPhone OS 2.0 or later
// The MFMailComposeViewController class is only available in iPhone OS 3.0 or later.
// So, we must verify the existence of the above class and provide a workaround for devices running
// earlier versions of the iPhone OS.
// We display an email composition interface if MFMailComposeViewController exists and the device can send emails.
// We launch the Mail application on the device, otherwise.

Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
if (mailClass != nil)
{
// We must always check whether the current device is configured for sending emails
if ([mailClass canSendMail])
{
[self displayComposerSheet];
}
else
{
[self launchMailAppOnDevice];
}
}
else
{
[self launchMailAppOnDevice];
}
}

#pragma mark -
#pragma mark Compose Mail
// Displays an email composition interface inside the application. Populates all the Mail fields.
-(void)displayComposerSheet
{
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;

// Set up recipients
NSArray *toRecipients = [NSArray arrayWithObject:@"joao.sanches@gruporscom.com.br"];

[picker setToRecipients:toRecipients];
[picker setSubject:@"Seu amigo te indicou um app!"];
[picker setMessageBody:@"Olá, amigo do Fulano! Ele te indicou este app aqui: http://linkDOSeuApp.com.br" isHTML:NO];

[self presentModalViewController:picker animated:YES];
}

// Dismisses the email composition interface when users tap Cancel or Send. Proceeds to update the message field with the result of the operation.
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
message.hidden = NO;
// Notifies users about errors associated with the interface
switch (result)
{
case MFMailComposeResultCancelled:
message.text = @"Result: canceled";
break;
case MFMailComposeResultSaved:
message.text = @"Result: saved";
break;
case MFMailComposeResultSent:
message.text = @"Result: sent";
break;
case MFMailComposeResultFailed:
message.text = @"Result: failed";
break;
default:
message.text = @"Result: not sent";
break;
}
[self dismissModalViewControllerAnimated:YES];
}

#pragma mark -
#pragma mark Workaround
// Launches the Mail application on the device.
-(void)launchMailAppOnDevice
{
NSString *recipients = @"mailto:jucajl@hotmail.com&subject=Hello from California!";
NSString *body = @"&body=It is raining in sunny California!";

NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body];
email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];
}

#pragma mark -
#pragma mark Unload views
- (void)viewDidUnload
{
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.message = nil;
}

@end
[/CODE]

e fiz as devidas ligaçoes na minha XIB, maas, quando clico no botão que faz a chama nada acontece, sendo que deveria chamar [self showPicker];

o problema principal é que nao chama os campos de email,

segunda coisa, meu objetivo é que nao chame os campos do email, é que simplesmente pegue o texto e dados do email de destinatario que tenho nas minhas strings e envie diretamente,

terceira coisa, caso o usuario nao tenha uma conta de email cadastrada no iPhone, o email nao será enviado, certo ?

Link para o comentário
Compartilhar em outros sites

o que eu fiz foi o seguinte, criei uma nova classe no meu progeto, MailComposer.h e MailComposer.m

em MailComposer.h


#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
@interface MailComposer : UIViewController <MFMailComposeViewControllerDelegate>{

IBOutlet UITextField *seuNome;
IBOutlet UITextField *seuEmail;
IBOutlet UITextField *amigoNome;
IBOutlet UITextField *amigoEmail;
IBOutlet UILabel *message;
}
@property (nonatomic, retain) IBOutlet UILabel *message;
- (void) showPicker ;
- (IBAction)chamada:(id)sender;
-(void)displayComposerSheet;
-(void)launchMailAppOnDevice;
@end
[/CODE]

em MailComposer.m

[CODE]
#import "MailComposer.h"
@implementation MailComposer
@synthesize message;

-(IBAction)chamada:(id)sender{

[self showPicker];

}
- (void) showPicker
{
// This sample can run on devices running iPhone OS 2.0 or later
// The MFMailComposeViewController class is only available in iPhone OS 3.0 or later.
// So, we must verify the existence of the above class and provide a workaround for devices running
// earlier versions of the iPhone OS.
// We display an email composition interface if MFMailComposeViewController exists and the device can send emails.
// We launch the Mail application on the device, otherwise.

Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
if (mailClass != nil)
{
// We must always check whether the current device is configured for sending emails
if ([mailClass canSendMail])
{
[self displayComposerSheet];
}
else
{
[self launchMailAppOnDevice];
}
}
else
{
[self launchMailAppOnDevice];
}
}

#pragma mark -
#pragma mark Compose Mail
// Displays an email composition interface inside the application. Populates all the Mail fields.
-(void)displayComposerSheet
{
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;

// Set up recipients
NSArray *toRecipients = [NSArray arrayWithObject:@"joao.sanches@gruporscom.com.br"];

[picker setToRecipients:toRecipients];
[picker setSubject:@"Seu amigo te indicou um app!"];
[picker setMessageBody:@"Olá, amigo do Fulano! Ele te indicou este app aqui: http://linkDOSeuApp.com.br" isHTML:NO];

[self presentModalViewController:picker animated:YES];
}

// Dismisses the email composition interface when users tap Cancel or Send. Proceeds to update the message field with the result of the operation.
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
message.hidden = NO;
// Notifies users about errors associated with the interface
switch (result)
{
case MFMailComposeResultCancelled:
message.text = @"Result: canceled";
break;
case MFMailComposeResultSaved:
message.text = @"Result: saved";
break;
case MFMailComposeResultSent:
message.text = @"Result: sent";
break;
case MFMailComposeResultFailed:
message.text = @"Result: failed";
break;
default:
message.text = @"Result: not sent";
break;
}
[self dismissModalViewControllerAnimated:YES];
}

#pragma mark -
#pragma mark Workaround
// Launches the Mail application on the device.
-(void)launchMailAppOnDevice
{
NSString *recipients = @"mailto:jucajl@hotmail.com&subject=Hello from California!";
NSString *body = @"&body=It is raining in sunny California!";

NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body];
email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];
}

#pragma mark -
#pragma mark Unload views
- (void)viewDidUnload
{
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.message = nil;
}

@end
[/CODE]

e fiz as devidas ligaçoes na minha XIB, maas, quando clico no botão que faz a chama nada acontece, sendo que deveria chamar [self showPicker];

o problema principal é que nao chama os campos de email,

segunda coisa, meu objetivo é que nao chame os campos do email, é que simplesmente pegue o texto e dados do email de destinatario que tenho nas minhas strings e envie diretamente,

terceira coisa, caso o usuario nao tenha uma conta de email cadastrada no iPhone, o email nao será enviado, certo ?

Primeira coisa: Você adicionou o framework?

Segunda coisa: Então você vai precisar usar requisições HTTP, pra enviar as informações para um servidor que vai rodar um código PHP que vai enviar esse email.

Terceira coisa: certo.

Você sabe alguma linguagem web e tem pelo menos um servidor virtual instalado no seu computador, para poder testar a linguagem?

Link para o comentário
Compartilhar em outros sites

sim, adcionei o framework. tenho um servidor para testar, e tenho um programador PHP que trabalha juntamente comigo. Agora preciso de mais informaçoes de como proceder, quero que o usuario nao precise de uma conta cadastrada no celular para enviar o email , semelhante aos apps da MOBRADIO.

Em objective-C, faça assim no método que enviará o email:


NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:[NSString stringWithFormat:@"http://seudominio.com.br/enviaremail.php?nomeDoAmigo=%@&nomeDoUsuario=%@&emailDoAmigo=%@&linkDoApp=%@&emailDoUsuario=%@", nomeDoAmigo, nomeDoUsuario, emailDoAmigo, linkDoApp, emailDoUsuario]]];
[request setHTTPMethod: @"GET"];
NSData *response = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];
NSString *stringResponse = [[NSString alloc] initWithData: response encoding: NSUTF8StringEncoding];

NSLog(@"Response: %@", stringResponse);
[/CODE]

Aí você pede pro seu programador PHP criar um script PHP no seudominio.com.br/enviaremail.php

Diz pra ele pra, caso o email seja enviado com sucesso, que ele dê um [font=arial,helvetica,sans-serif][size=4][font=courier new,courier,monospace]echo "enviado"; [font=arial,helvetica,sans-serif]para que você receba no iOS a confirmação de que o email foi enviado.[/font][/font][/size][/font]

Link para o comentário
Compartilhar em outros sites

a funçao PHP ficou assim:


<?php
#ENVIAR E-MAIL.
function enviaremail($para,$de,$assunto,$mensagem)
{
$headers = 'Content-Type: text/html; charset=iso-8859-1\n';
$headers .= 'From: '.$de.'\n';
@mail($para, $assunto, $mensagem, $headers);
return true;
}
print enviar_email($_REQUEST[destinatario],$_REQUEST[nomeRemetente],$_REQUEST[assunto],$_REQUEST[mensagem],$_REQUEST[emailRemetente]);
?>
[/CODE]

e a funçao no xcode assim:

[CODE]
-(IBAction)enviar{

NSString *remetente = [NSString stringWithFormat:@"%@", [seuEmail text]];
NSString *nomeRemetente = [NSString stringWithFormat:@"%@", [seuNome text]];
NSString *destinatario = [NSString stringWithFormat:@"joao.sanches@gruporscom.com.br"];
NSString *menssagem = [NSString stringWithFormat:@"%@", [message text]];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:[NSString stringWithFormat:@"http://www.gruporscom.com.br/enviaremail.php?destinatario=%@&nomeRemetente=%@&menssagem=%@&emailRemetente=%@", destinatario, nomeRemetente, menssagem,remetente]]];

[request setHTTPMethod: @"GET"];
NSData *response = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];
NSString *stringResponse = [[NSString alloc] initWithData: response encoding: NSUTF8StringEncoding];

NSLog(@"Response: %@", stringResponse);

[seuNome setText:@""];
[seuEmail setText:@""];
[message setText:@""];

}
[/CODE]

Nao funcionou, nao recebo nenhum email, e observo que nos logs do app quando está em execução fica: [771:207] Response: 1

no caso a string response com valor 1

o que está errrado ?

Editado por sanchessd
Link para o comentário
Compartilhar em outros sites

eu supeito de que as minhas variaveis não estejam chegando na função PHP, não tem um meio que eu possa me certificar ?

Sim, através de:


NSData *response = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];
NSString *stringResponse = [[NSString alloc] initWithData: response encoding: NSUTF8StringEncoding];

NSLog(@"Response: %@", stringResponse);
[/CODE]

Isso vai receber o output do script PHP

Link para o comentário
Compartilhar em outros sites

sim me retorna 1 'True', mas o email nao chega, enviei para voce uma MP, a minha supeita de nao estar enviando minhas strings é que caso voce abrir direto no navegador www.gruporscom.com.br/enviaremail.php ele vai te retornar 1 TRUE

sendo que nao está recebendo nada como parametro quando voce acessa pelo navegador!

Link para o comentário
Compartilhar em outros sites

Descobri qual era meu problema, era o servidor da LocaWeb que estava bloqueando, hospedei em outro servidor e funcionou tranquilo, porem mais um detalhe,

ficou case sensitive, sendo que se eu colocar uma letra maiuscula ou caracteres especiais ele nao envia, pela lógica o PHP identifica as variaveis independente do tipo.

Mas mesmo assim exige um tratamento especial nas strings que recebo como parametro ?

Link para o comentário
Compartilhar em outros sites

Descobri qual era meu problema, era o servidor da LocaWeb que estava bloqueando, hospedei em outro servidor e funcionou tranquilo, porem mais um detalhe,

ficou case sensitive, sendo que se eu colocar uma letra maiuscula ou caracteres especiais ele nao envia, pela lógica o PHP identifica as variaveis independente do tipo.

Mas mesmo assim exige um tratamento especial nas strings que recebo como parametro ?

Não tenho certeza, mas vê se no programa PHP, se vc fizer isso:


$new = htmlspecialchars($stringComCharsEspeciais, ENT_DISALLOWED);
[/CODE]

Quanto a ser case sensitive, antes de passar pro PHP, faça assim:

[CODE]
string = [string lowercaseString];
[/CODE]

Editado por Gabriel Vincent
Link para o comentário
Compartilhar em outros sites

OK resolvi o problema, na verdade salvei todas minhas strings que ia enviar por parametro e uma unica, depois usei o NSUTF8StringEncoding nessa string


// Enviando parametros para funcao PHP
NSString *urlEnvio = [[NSString alloc] initWithFormat:@"http://www.bgclassificados.com.br/envia_email.php?destinatario=%@&remetente=%@&mensagem=%@&assunto=%@&nome=%@", destinatario, remetente, mensagem,assunto,nomeRemetente];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:[urlEnvio stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
[/CODE]

e no PHP usei para mostrar os acentos,

[CODE]
utf8_decode($stringComMensagem);
[/CODE]

e para que os enters dados pelo usuario no form fossem reconhecidos, se nao ficava tudo na mesma linha usei o,

[CODE]
nl2br($stringComMensage);
[/CODE]

Editado por sanchessd
Link para o comentário
Compartilhar em outros sites

Participe do debate

Você pode postar agora e se registrar depois. Se você tem uma conta, entre agora para postar com ela.

Visitante
Responder este tópico…

×   Você colou conteúdo com formatação.   Remover formatação

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Limpar editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.



  • Estatísticas do Fórum

    • Total de Tópicos
      56.8k
    • Total de Posts
      465.7k
×
×
  • Criar Novo...