Trouble sending email in iOS 7 using MFMailComposeViewController - ios7

I have a very simple app to test sending email, but the email never arrives. I have included the MessageUI framework in the app, and implemented the MFMailComposeViewControllerDelegate as well. The two methods in the app are as follows:
- (IBAction)showEmail:(id)sender
{
// Email Subject
NSString *emailTitle = #"Test Email";
// Email Content
NSString *messageBody = #"iOS programming is so fun!";
// To address
NSArray *toRecipents = [NSArray arrayWithObject:#"email#address.com"];
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
mc.mailComposeDelegate = self;
[mc setSubject:emailTitle];
[mc setMessageBody:messageBody isHTML:NO];
[mc setToRecipients:toRecipents];
// Present mail view controller on screen
[self presentViewController:mc animated:YES completion:NULL];
}
and the delegate method:
- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
switch (result)
{
case MFMailComposeResultCancelled:
NSLog(#"Mail cancelled");
break;
case MFMailComposeResultSaved:
NSLog(#"Mail saved");
break;
case MFMailComposeResultSent:
NSLog(#"Mail sent");
break;
case MFMailComposeResultFailed:
NSLog(#"Mail sent failure: %#", [error localizedDescription]);
break;
default:
break;
}
// Close the Mail Interface
[self dismissViewControllerAnimated:YES completion:NULL];
}
When I press the email button in my app the first method works perfectly and when I click the send button that is presented, the "Mail Sent" message appears in the log. The email simply never arrives.
Everything seems to work as advertised, with the exception of the email never arriving at its destination.
I am running this on the iPad not in the simulator, and I have a good network connection.
What am I missing?

Well apparently this was an email configuration problem with the iPad itself. After a reboot of the device the above code works perfectly. I absolutely hate this kind of problem.

Use the canSendMail method.
Use the following code to check if a device mail configuration is setup or not. Otherwise your app will crash.
if ([MFMailComposeViewController canSendMail])
{
// Create and show the MailComposeViewController
}
else
{
// Show No mail account set up on device.
}

Related

unable to send the mail using objective c?

i am very new to objective c.i am trying to send the email whenever the user clicks the send button.whenever i clicks the button the if condition is not satisfied and coming out of the loop also the email is not send.
This is my .h file
#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#interface complaintsviewcontroller : UITableViewController<MFMailComposeViewControllerDelegate>
This is my .m file
- (IBAction)sendbutton:(id)sender {
if ([MFMailComposeViewController canSendMail])
{
NSString *emailTitle = #"Test Email";
// Email Content
NSString *messageBody = #"testing ";
// To address
NSArray *toRecipents = [NSArray arrayWithObject:#"noreply#etowns.in"];
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
mc.mailComposeDelegate = self;
[mc setSubject:emailTitle];
[mc setMessageBody:messageBody isHTML:NO];
[mc setToRecipients:toRecipents];
// Present mail view controller on screen
[self presentViewController:mc animated:YES completion:NULL];
}
}
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
switch (result)
{
case MFMailComposeResultCancelled:
NSLog(#"Mail cancelled");
break;
case MFMailComposeResultSaved:
NSLog(#"Mail saved");
break;
case MFMailComposeResultSent:
NSLog(#"Mail sent");
break;
case MFMailComposeResultFailed:
NSLog(#"Mail sent failure: %#", [error localizedDescription]);
break;
default:
break;
}
[self dismissViewControllerAnimated:YES completion:NULL];
}
can anyone suggest me what is the mistake i done in the above coding ?
As per the standards you need to check MFMailComposeViewController is able to send your mail just before sending using below condition.
if ([MFMailComposeViewController canSendMail]){
// configure your email part here
// if not checking, this misleads the standards or leads uncertainty further
}
After that if you have not configured mail Mail Accounts under the settings -> mail, an alert appears like below.
Final Solution: If you got something like above popup just configure the mail account with gmail, yahoo or anyone, so the mailcomposer will be able to send email on behalf.

ObjectiveC MessageComposerViewController on iPhone device. All is ok with iPad

I've got a problem with my universal app. In particular my problem is about using MessageComposerViewController (MCVC). I want to send email with a pdf attached and all works done. My problem occurs when I dismiss the MessageComposerViewController. Indeed when I remove MCVC from main view I'd like that subviews in mainView continue to has exclusiveTouch tag flagged to true.
This behavior occurs when I run my app on iPad but it doesn't happen when I use iPhone. When I use iPhone device, after I've sent an e-mail (or after I've aborted it) the touch signal is captured by mainview and I don't know the reason.
My hierarchy is:
mainView (GameView) within some subviews that I use to manage file actions: (open file, send file, remove file). To apply the right actions I've linked a UITapGestureRecognizer to the 3 buttons. After MCVC is dismissed, I'd like to continue using the three buttons but I can't.
I post some code:
MCMessageComposerViewController.h:
#interface MessageComposerViewController : UIViewController{
MFMailComposeViewController *mc;}
MCMessageViewController.m:
- (void)mailComposeController:(MFMailComposeViewController*)controller
didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error{
self.feedbackMsg.hidden = NO;
// Notifies users about errors associated with the interface
switch (result)
{
case MFMailComposeResultCancelled:
self.feedbackMsg.text = #"Result: Mail sending canceled";
break;
case MFMailComposeResultSaved:
self.feedbackMsg.text = #"Result: Mail saved";
break;
case MFMailComposeResultSent:
self.feedbackMsg.text = #"Result: Mail sent";
break;
case MFMailComposeResultFailed:
self.feedbackMsg.text = #"Result: Mail sending failed";
break;
default:
self.feedbackMsg.text = #"Result: Mail not sent";
break;
}
[mc.navigationController popViewControllerAnimated:YES];
[mc dismissViewControllerAnimated:YES completion:nil];
[self.view removeFromSuperview];
}
- (void)displayMailComposerSheet:(NSString *)_fileName{
NSString *pathFile = #"blablablaPath";
NSString *emailTitle = "blablablaTitle";
mc = [[MFMailComposeViewController alloc] init];
mc.mailComposeDelegate = self;
[mc setSubject:emailTitle];
// Get the resource path and read the file using NSData
NSData *fileData;
while(!fileData){
fileData = [NSData dataWithContentsOfFile:pathFile];
if(fileData) break;
[f_t createPdfWithName:_fileName];}//create pdf file if it isn't exist
[mc addAttachmentData:fileData mimeType:#"application/pdf" fileName:_fileName];
[self presentViewController:mc animated:YES completion:NULL];}
GameView.m:
- (void)sendFile:(UITapGestureRecognizer *)recognizer{
mail = [[MessageComposerViewController alloc] init];
[self addSubview:mail.view];
[mail displayMailComposerSheet: fileName];
}
I'd like to post an image but I've not enough reputation to do this...
Please help me!!! :-)

Send mail to an array list recipients from a database in ObjectiveC

I am using ObjectiveC and I want to send an email to a list of email addresses that I have in a sqlite database. The email array hold the addresses that I want to send the mail to.
I show you my code
- (void)sendEmailButtonClicked: (id)sender {
// Email Subject
NSString *emailTitle = #"Test Email";
// Email Content
NSString *messageBody = #"iOS programming is so fun!";
// To address
NSArray *toRecipents = [NSArray arrayWithObject:emailArray];
NSLog(#"What are the emais %#",toRecipents);
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
mc.mailComposeDelegate = self;
[mc setSubject:emailTitle];
[mc setToRecipients:toRecipents];
[mc setMessageBody:messageBody isHTML:NO];
// Present mail view controller on screen
[self presentViewController:mc animated:YES completion:NULL];
}
- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
switch (result)
{
case MFMailComposeResultCancelled:
NSLog(#"Mail cancelled");
break;
case MFMailComposeResultSaved:
NSLog(#"Mail saved");
break;
case MFMailComposeResultSent:
NSLog(#"Mail sent");
break;
case MFMailComposeResultFailed:
NSLog(#"Mail sent failure: %#", [error localizedDescription]);
break;
default:
break;
}
// Close the Mail Interface
[self dismissViewControllerAnimated:YES completion:NULL];
}
I obtain this error: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM mf_isLegalCommentedEmailAddress]: unrecognized selector sent to instance 0x78e5e180'
Anyone can help me please? Thank you so much!
First of all it should be:
NSArray *toRecipents = [NSArray arrayWithArray:emailArray];
But why not just do:
[mc setToRecipients:emailArray];
Assuming email array is a valid array object as we can't see from your code where/how you create it.
EDIT
You likely can't send an email from the simulator if there isn't an email account setup. Check for this with the following:
if ([MFMailComposeViewController canSendMail]) {
//Do your email stuff
}
else {
//Present an error etc ...
}
There's an issue with your array. This code works fine when sending to multiple recipients:
//Email
-(void)mailButton {
NSArray *emailArray = #[#"me#gmail.com", #"you#gmail.com", #"him#gmail.com", #"her#gmail.com", #"everyone#gmail.com"];
if ([MFMailComposeViewController canSendMail]) {
NSString *subject = #"Subject";
NSString *messageBody = [NSString stringWithFormat:#"Message Body"];
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
mc.mailComposeDelegate = self;
[mc setSubject:subject];
[mc setMessageBody:messageBody isHTML:NO];
[mc setToRecipients:emailArray];
[self presentViewController:mc animated:YES completion:NULL];
}
else {
UIAlertView *emailError = [[UIAlertView alloc] initWithTitle:#"Email Unavailable"
message:#"Sorry, were unable to find an email account on your device.\nPlease setup an account in your devices settings and try again."
delegate:self
cancelButtonTitle:#"Close"
otherButtonTitles:nil];
[emailError show];
}
}
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
switch (result) {
case MFMailComposeResultCancelled:
break;
case MFMailComposeResultSaved:
break;
case MFMailComposeResultSent:
break;
case MFMailComposeResultFailed:
break;
default:
break;
}
[self dismissViewControllerAnimated:YES completion:NULL];
}
toRecipents should be an array, which contains only one email address.
As below,
toRecipents = #[#"foo#example.com"];
If, you want to send email some people, you should use setCcRecipients method.

How to setToRecipients MFMailComposerViewController in Xcode6

I am Using Xcode 6.
I am using MFMailComposerViewController to send emails within the app.
I am able to call MFMailComposerViewController,which provides the standard Interface to send emails.
I am able to set the subject as well.
But I am not able to set the Recipients.
Here is my code.
if ([MFMailComposeViewController canSendMail]) {
mailComposer = [[MFMailComposeViewController alloc]init];
[mailComposer setSubject:#"PSA Mobile CRM"];
NSArray *toRecipients = [NSArray arrayWithObject:#"abc#mass.uk.net"];
[mailComposer setToRecipients:toRecipients];
mailComposer.mailComposeDelegate = self;
[self presentViewController:mailComposer animated:YES completion:nil];
}
else {
NSLog(#"This device cannot send email");
}
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult (MFMailComposeResult)result error:(NSError *)error {
switch (result) {
case MFMailComposeResultSent:
NSLog(#"You sent the email.");
break;
case MFMailComposeResultSaved:
NSLog(#"You saved a draft of this email");
break;
case MFMailComposeResultCancelled:
NSLog(#"You cancelled sending this email.");
break;
case MFMailComposeResultFailed:
NSLog(#"Mail failed: An error occurred when trying to compose this email");
break;
default:
NSLog(#"An error occurred when trying to compose this email");
break;
}
[self dismissViewControllerAnimated:YES completion:NULL]; }
I am able to send the email.
But I am not able to set the setToRecipients method.
Can anyone please help me out with this?

In iOS 5.1 after dismissing MFMailComposeViewController my UIWebView page java script not working and not loading data from disc cache

I am opening web url in UIWebView which contains some buttons with java script actions. There is a button in this page email after hitting this button I get email address and email body in
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{if( [requestString rangeOfString:#"email.com"].location!=NSNotFound){if ([MFMailComposeViewController canSendMail]){if (!mailer)
mailer = [[MFMailComposeViewController alloc] init];
mailer.mailComposeDelegate = self;
NSString *subject = [dataManager.dictTransalations objectForKey:#"71"];
[mailer setSubject:subject];
NSArray *toRecipients = [NSArray arrayWithObjects:distributorEmailAddress.length > 0 ? distributorEmailAddress:#"", nil];
[mailer setToRecipients:toRecipients];
[mailer setMessageBody:#"" isHTML:NO];
isFromMailVC=YES;
//[self presentViewController:mailer animated:YES completion:NULL];
[self presentModalViewController:mailer animated:YES];
}}return NO;}
- (void)mailComposeController(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error{
switch (result)
{
case MFMailComposeResultCancelled:
NSLog(#"Mail cancelled: you cancelled the operation and no email message was queued.");
break;
case MFMailComposeResultSaved:
NSLog(#"Mail saved: you saved the email message in the drafts folder.");
break;
case MFMailComposeResultSent:
NSLog(#"Mail send: the email message is queued in the outbox. It is ready to send.");
break;
case MFMailComposeResultFailed:
NSLog(#"Mail failed: the email message was not saved or queued, possibly due to an error.");
break;
default:
NSLog(#"Mail not sent.");
break;
}
[controller dismissModalViewControllerAnimated:YES];
NSLog(#" Mail Composer Error = %#",error);
}
After dismissing mailComposeController UIWebView java script does not work on other buttons and also in another tab hit another web url that contains some product list also shows blank with head image.
When I see the data in cache in documents directory its there in 100000.db for List table.
I don't why it does not load after opening and dismissing mailcompose. after quitting app from background it works.
Is there any way to debug UIWebView page in iOS 5.1 ?
I came across the same thing in iOS7 yesterday and found a solution a few minutes ago. Maybe it will help you.
Check your viewWillDisappear method. Mine looked like this:
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
self.webView.delegate = nil;
self.webView = nil;
// whatever else you do
}
The error was in the assignments: when MFMailComposeViewController appeared and viewDidDisappear was called, webView lost its delegate and because of that clicks weren't captured.
If you're programming for iOS6 or newer, you should just leave it like that:
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
// whatever else you do
}
But if you're programming for iOS5 or older and have to assign nil for some reason, then add this:
- (void)viewDidUnload
{
[super viewDidUnload];
self.webView.delegate = nil;
self.webView = nil;
// whatever else you do
}
Note: this method is deprecated for iOS6 and newer, as it is never called since iOS6.