Getting error with MFMailComposeViewControllerDelegate EXE_BAD_ACCESS (code=1, address=0x8) - ios

I am trying to make mail composer as a helper class. It shows window when called from viewcontroller class viewDidLoad method. But when I press cancel and then Delete Draft. The app is crashing. After crashing its going to main file and showing following error message.
EXE_BAD_ACCESS (code=1, address=0x8).
I have tried all the possible things, but still didn't get any solution.
Any advice will be greatly appreciated! Thank you in advance.
Below are the code.
ViewController.m :-
- (void)viewDidLoad {
[super viewDidLoad];
//Allocating mailing object.
EmailManagerDelegate *MailOperation=[[EmailManagerDelegate alloc] init];
//Email Subject
MailOperation.emailTitle=#"just trying mail composer";
//Email content.
MailOperation.messageBody=#"hallo world";
//To address
MailOperation.toRecipent=[NSArray arrayWithObject:#"abc#gmail.com"];
//Setting the name of the File with Format in nstring.
MailOperation.FileNameWithFormat=#"Demo.txt";
//Passing the UIViewCOntroller for opeing the mailclient and closing it.
MailOperation.ViewVontroller=self;
[MailOperation emailMultiAttachAndSendLog:nil fileName: nil];
}
EmailManagerDelegate.h :-
#import <Foundation/Foundation.h>
#import <MessageUI/MessageUI.h>
#interface OSMEmailManagerDelegate : NSObject <MFMailComposeViewControllerDelegate>
#property (readwrite) NSString* FileNameWithFormat;
#property (nonatomic, strong) UIViewController* ViewVontroller;
//#property (nonatomic) UIViewController* ViewVontroller;
#property (nonatomic,strong) MFMailComposeViewController *mc;
#property (readwrite)NSString* emailTitle;
#property (readwrite)NSString* messageBody;
#property (readwrite)NSArray* toRecipent;
-(void)emailMultiAttachAndSendLog:(NSString*)documentsDirectory fileName:(NSString*)fileWithFormat;
EmailManagerDelegate.m :-
#import "OSMEmailManagerDelegate.h"
#implementation OSMEmailManagerDelegate
#synthesize mc,ViewVontroller;
-(void)emailMultiAttachAndSendLog:(NSString*)documentsDirectory fileName:(NSString*)fileWithFormat{
if ([MFMailComposeViewController canSendMail])
// The device can send email.
{
//Creating a mail composer
mc=[[MFMailComposeViewController alloc] init];
[mc setMailComposeDelegate:self];
[mc setSubject:_emailTitle];
[mc setMessageBody:_messageBody isHTML:NO];
[mc setToRecipients:_toRecipent];
[mc setModalPresentationStyle: UIModalPresentationFormSheet];
NSData *fileData;
NSString *mimeType;
NSString *filesName;
if (documentsDirectory && fileWithFormat) {
//Files section
NSArray *filePart=[fileWithFormat componentsSeparatedByString:#"."];
filesName=[filePart objectAtIndex:0];
NSString *fileExtention=[filePart objectAtIndex:1];
//Getting and creating path of the zip file.
NSString *fileArchivePath = [NSString stringWithFormat:#"%#/%#", documentsDirectory, fileWithFormat];
//Geting the resource file and path
fileData=[NSData dataWithContentsOfFile:fileArchivePath];
//Determining the MIME type.
mimeType=[self getMIMEType:fileExtention];
//Add attachment
[mc addAttachmentData:fileData mimeType:mimeType fileName:filesName];
}
//Present mail view controller on screen.
[ViewVontroller presentViewController:mc animated:YES completion:nil];
}
else
// The device can not send email.
{
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:nil message:#"Device not configured to send mail." delegate:nil cancelButtonTitle:#"Ok" otherButtonTitles:nil, nil];
[alert show];
}
}
//Get the type of MIME with file extention.
-(NSString *)getMIMEType:fileExtention{
NSString *mimeType=#"";
if ([fileExtention isEqualToString:#"csv"]) {
mimeType=#"text/csv";
}
else if ([fileExtention isEqualToString:#"jpg"]) {
mimeType = #"image/jpeg";
} else if ([fileExtention isEqualToString:#"png"]) {
mimeType = #"image/png";
} else if ([fileExtention isEqualToString:#"doc"]) {
mimeType = #"application/msword";
} else if ([fileExtention isEqualToString:#"ppt"]) {
mimeType = #"application/vnd.ms-powerpoint";
} else if ([fileExtention isEqualToString:#"html"]) {
mimeType = #"text/html";
} else if ([fileExtention isEqualToString:#"pdf"]) {
mimeType = #"application/pdf";
} else if ([fileExtention isEqualToString:#"json"]) {
mimeType = #"text/json";
} else if ([fileExtention isEqualToString:#"zip"]) {
mimeType = #"application/zip";
}
return mimeType;
}
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{
NSString *status;
switch(result){
case MFMailComposeResultCancelled:
status=#"Mail cancelled";
break;
case MFMailComposeResultSaved:
status=#"Mail saved";
break;
case MFMailComposeResultSent:
status=#"Mail sent";
break;
case MFMailComposeResultFailed:
status=#"Mail sent failure : %#",[error localizedDescription];
break;
default:
break;
}
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:nil message:status delegate:nil cancelButtonTitle:#"Ok" otherButtonTitles:nil, nil];
[alert show];
//Close mail interface.
[ViewVontroller dismissViewControllerAnimated:YES completion:NULL];
}

You can't have the mailComposeController dismiss itself. You have to have the UIViewController that presents it to dismiss it.
You need to move the delegation method to your UIViewController...
Here's my summerised answer to a re-write of your code:
#interface UIViewController : UIViewController <MFMailComposeViewControllerDelegate>
- (void)viewDidLoad {
[super viewDidLoad];
//Allocating mailing object.
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
if ([MFMailComposeViewController canSendMail])
// The device can send email.
mc=[[MFMailComposeViewController alloc] init];
[mc setMailComposeDelegate:self];
[mc setSubject:#"hello world"];
[mc setMessageBody:#"hello world" isHTML:NO];
[mc setToRecipients:[NSArray arrayWithObject:#"abc#gmail.com"]];
[mc setModalPresentationStyle: UIModalPresentationFormSheet];
// This is the data you could handle in your custom class... I am leaving this code as is, fix it in the way your logic works.
[MailOperation emailMultiAttachAndSendLog:nil fileName: nil];
//Present mail view controller on screen.
[self presentViewController:mc animated:YES completion:nil];
} else {
// The device can not send email.
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:nil message:#"Device not configured to send mail." delegate:nil cancelButtonTitle:#"Ok" otherButtonTitles:nil, nil];
[alert show];
}
}
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{
NSString *status;
switch(result){
case MFMailComposeResultCancelled:
status=#"Mail cancelled";
break;
case MFMailComposeResultSaved:
status=#"Mail saved";
break;
case MFMailComposeResultSent:
status=#"Mail sent";
break;
case MFMailComposeResultFailed:
status=#"Mail sent failure : %#",[error localizedDescription];
break;
default:
break;
}
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:nil message:status delegate:nil cancelButtonTitle:#"Ok" otherButtonTitles:nil, nil];
[alert show];
//Close mail interface.
[self dismissViewControllerAnimated:YES completion:NULL];
}
EmailManagerDelegate.h :- (Don't call it Delegate... it's not what a delegate it... refactor it and remove the word delegate)
#import <Foundation/Foundation.h>
#import <MessageUI/MessageUI.h>
#interface OSMEmailManagerDelegate : NSObject
#property (readwrite) NSString* FileNameWithFormat;
// #property (nonatomic, strong) UIViewController* ViewVontroller;
//#property (nonatomic) UIViewController* ViewVontroller;
//#property (nonatomic,strong) MFMailComposeViewController *mc;
//#property (readwrite)NSString* emailTitle;
//#property (readwrite)NSString* messageBody;
//#property (readwrite)NSArray* toRecipent;
//-(void)emailMultiAttachAndSendLog:(NSString*)documentsDirectory fileName:(NSString*)fileWithFormat;
EmailManagerDelegate.m :- (Again, highly suggested to remove the 'delegate' part)
#import "OSMEmailManagerDelegate.h"
#implementation OSMEmailManagerDelegate
//Get the type of MIME with file extention.
-(NSString *)getMIMEType:fileExtention{
NSString *mimeType=#"";
if ([fileExtention isEqualToString:#"csv"]) {
mimeType=#"text/csv";
}
else if ([fileExtention isEqualToString:#"jpg"]) {
mimeType = #"image/jpeg";
} else if ([fileExtention isEqualToString:#"png"]) {
mimeType = #"image/png";
} else if ([fileExtention isEqualToString:#"doc"]) {
mimeType = #"application/msword";
} else if ([fileExtention isEqualToString:#"ppt"]) {
mimeType = #"application/vnd.ms-powerpoint";
} else if ([fileExtention isEqualToString:#"html"]) {
mimeType = #"text/html";
} else if ([fileExtention isEqualToString:#"pdf"]) {
mimeType = #"application/pdf";
} else if ([fileExtention isEqualToString:#"json"]) {
mimeType = #"text/json";
} else if ([fileExtention isEqualToString:#"zip"]) {
mimeType = #"application/zip";
}
return mimeType;
}

The following line causes the exception.
EmailManagerDelegate *MailOperation=[[EmailManagerDelegate alloc] init];
Notice that MailOperation is a local variable, which only lives in viewDidLoad, so when you click the send button, it no longer exists.
Changing it to a global variable inside ViewController should work.

Related

How to send email in Xcode with Version 6.2?

I have looked at various tutorials for sending email in an app using Xcode, but most of the tutorials I have tried will not work for the current version of Xcode 6.2. When I run the IOS simulator, the email view will either instantly disappear or I can't type anything in any of the fields. I made sure to update the framework to use the MessageUI.framework. I will also post the current code I am using for the app. I want to use objective C as the language, as the app I am creating is using Objective C. Does anyone know how I can implement email in the current version(6.2)?
.h file
#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#interface IntakeViewController : UIViewController <MFMailComposeViewControllerDelegate>{
}
- (IBAction)emailClicked:(id)sender;
#end
.m file
#import "IntakeViewController.h"
#interface IntakeViewController ()
#end
#implementation IntakeViewController
- (IBAction)emailClicked:(id)sender {
if ([MFMailComposeViewController canSendMail]) {
MFMailComposeViewController *mail = [[MFMailComposeViewController alloc]init];
mail.mailComposeDelegate = self;
[mail setSubject:#"Review"];
NSArray *toRecipients = [NSArray arrayWithObjects:#"cbailey92#gmail.com", nil];
[mail setToRecipients:toRecipients];
NSString *body = #"You need more passion";
[mail setMessageBody:body isHTML:NO];
mail.modalPresentationStyle = UIModalPresentationPageSheet;
[self presentViewController:mail animated:YES completion:nil];
} else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Run Away!" message:#"You need more passion" delegate:nil cancelButtonTitle:#"Cancel" otherButtonTitles:nil];
[alert show];
}
}
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
switch (result) {
case MFMailComposeResultCancelled:
NSLog(#"Cancelled");
break;
case MFMailComposeResultSaved:
NSLog(#"Saved");
break;
case MFMailComposeResultFailed:
NSLog(#"Failed");
break;
case MFMailComposeResultSent:
NSLog(#"Sent");
break;
default:
NSLog(#"Default");
break;
}
[self dismissViewControllerAnimated:YES completion:nil];
}

how to compose mail when button at index clicked in UIActionSheet?

I am a bit confused on how to display mail composer when I click the email option in UIActionSheet.
Here's my sample code:
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if(buttonIndex == 0)
{
NSString *emailTitle = #"Test Email";
NSString *messageBody = #"iOS programming is so fun!";
NSArray *toRecipents = [NSArray arrayWithObject:#"support#email.com"];
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
mc.mailComposeDelegate = self;
[mc setSubject:emailTitle];
[mc setMessageBody:messageBody isHTML:NO];
[mc setToRecipients:toRecipents];
[self presentViewController:mc animated:YES completion:NULL];
}
}
Make sure you add to your .h file and import the MessageUI.framework
Here is exactly what your looking for. I use this often. By the way UIActionSheets are deprecated in iOS 8. Here you go though:
.h
ViewController : UIViewController <MFMailComposeViewControllerDelegate>
.m
- (IBAction)showActionSheet:(id)sender {
UIActionSheet *moreActions = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:#"Cancel" destructiveButtonTitle:nil otherButtonTitles:#"Add To Favorites", #"Search",#"Email", nil];
[moreActions showInView:self.view];
}
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
switch (buttonIndex) {
case 0: [self addToFav:self];
break;
case 1: ; [self popSearchBar:self];
break;
case 2: { [self sendEmail];
break;
}
break;
}
}
- (void)sendEmail {
NSString *emailTitle = #"This is email title";
// Email Content as for HTML
NSString *messageBody = [NSString stringWithFormat:#"I may have found a missing document in your catalog. I tried opening :<p><strong><font color=\"red\"> %# </font><br>'%#'</strong></p> with no results. Can I have a dollar for reporting this?", self.title, self.titleString];
// To address
NSArray *toRecipents = [NSArray arrayWithObject:#"youremail#google.com"];
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
mc.mailComposeDelegate = self;
[mc setSubject:emailTitle];
[mc setMessageBody:messageBody isHTML:YES];
[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");
[self dismissViewControllerAnimated:YES completion:NULL];
break;
case MFMailComposeResultSaved:
NSLog(#"Mail saved");
[self dismissViewControllerAnimated:YES completion:NULL];
break;
case MFMailComposeResultSent:
NSLog(#"Mail sent");
[self dismissViewControllerAnimated:YES completion:NULL];
break;
case MFMailComposeResultFailed:
NSLog(#"Mail sent failure: %#", [error localizedDescription]);
break;
default:
break;
}
// Close the Mail Interface
[self dismissViewControllerAnimated:YES completion:NULL];
}
Also note that some people are having issues with simulator emails. try it on a device before you give up.
Here's the code:
First add and import the message framework:
#import <MessageUI/MessageUI.h>
then mark your self as a delegate like this
#interface MYViewController () <MFMailComposeViewControllerDelegate>
then to pull up the composer:
- (IBAction)emailButtonPressed:(id)sender
{
if ([MFMailComposeViewController canSendMail]) {
MFMailComposeViewController *composeViewController = [[MFMailComposeViewController alloc] initWithNibName:nil bundle:nil];
[composeViewController setMailComposeDelegate:self];
[composeViewController setToRecipients:#[#"example#email.com"]];
[composeViewController setSubject:#"example subject"];
[self presentViewController:composeViewController animated:YES completion:nil];
}
}
Then to handle the delegate callback and dismiss the composer:
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
//Add an alert in case of failure
[self dismissViewControllerAnimated:YES completion:nil];
}
in actionsheet using actionSheet: clickedButtonAtIndex:
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
//Get the name of the current pressed button
NSString *buttonTitle = [actionSheet buttonTitleAtIndex:buttonIndex];
if ([buttonTitle isEqualToString:#"Your button title"]) {
[self btnContact];
}
}
call this method
- (void)btnContact{
// Email Subject
NSString *emailTitle = #"";
// Email Content
NSString *messageBody = #"";
// To address
NSString *toRecp = #"";
NSArray *toRecipents = [NSArray arrayWithObject:toRecp];
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];
}
This is appcoda's code . Instead of index use the button's name to fire your mail option .

MFMailComposeViewController black screen on iPad

I'm using cocos2d-x framework and I need to popup the mail when clicking button.
The code works fine on iphone5 (6.0), ipod touch 5(6.0):
MailSender.h
#interface MailSender : UIViewController <MFMailComposeViewControllerDelegate>
{
UIViewController *currentModalViewController;
}
-(void)sendMail:(const char *)subject receiver:(const char *)receiver;
#end
MailSender.mm
#import "MailSender.h"
#import "../cocos2dx/platform/ios/EAGLView.h"
#implementation MailSender
- (void)sendMail:(const char *)subject receiver:(const char *)receiver
{
if ([MFMailComposeViewController canSendMail])
{
MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
mailer.mailComposeDelegate = self;
[mailer setSubject:[NSString stringWithUTF8String:subject]];
NSArray *toRecipients = [NSArray arrayWithObject:[NSString stringWithFormat:#"%s", receiver]];
[mailer setToRecipients: toRecipients];
//NSString *emailBody = [NSString stringWithFormat:#"<p>This is a sample posting in iOS. My Score is %s!</p>",score];
NSString *emailBody = #"";
[mailer setMessageBody:emailBody isHTML:YES];
// only for iPad
// mailer.modalPresentationStyle = UIModalPresentationFormSheet;
UIViewController* rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
currentModalViewController = [UIViewController alloc];
[rootViewController.view addSubview:currentModalViewController.view];
[currentModalViewController presentViewController:mailer animated:true completion:nil];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Failure"
message:#"Your device doesn't support the composer sheet"
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles: nil];
[alert show];
[alert release];
}
}
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
const char *message;
switch (result)
{
case MFMailComposeResultCancelled:
message = "Mail cancelled";
break;
case MFMailComposeResultSaved:
message = "Mail saved";
break;
case MFMailComposeResultSent:
message = "Mail send";
break;
case MFMailComposeResultFailed:
message = "Mail failed";
break;
default:
message = "Mail cancelled";
break;
}
NSLog(#"%s",message);
[currentModalViewController dismissViewControllerAnimated:true completion:nil];
[currentModalViewController.view.superview removeFromSuperview];
[currentModalViewController release];
}
#end
But on my ipad mini (6.0) the mail popped up correctly but when clicked the "send mail" or "cancel" the view was removed and leaving a black screen (everything on the screen is gone)
Any advice will be appreciated, thanks :)
try this code
if ([MFMailComposeViewController canSendMail]) {
mailComposer = [[MFMailComposeViewController alloc]init];
mailComposer.mailComposeDelegate = self;
[mailComposer setToRecipients:#[#"yourmail#com"]];
[mailComposer setSubject:#"Subject"];
[mailComposer setMessageBody:#"hello \n" isHTML:NO];
[self presentViewController:mailComposer animated:YES completion:nil];
}
else{
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:#"Error"
message:#"can not send mail with this device"
delegate:nil
cancelButtonTitle:#"Ok"
otherButtonTitles:nil, nil];
[alert show];
}
pragma mark MFMailComposeViewControllerDelegate
-(void)mailComposeController:(MFMailComposeViewController *)controller
didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{
if (result) {
NSLog(#"Result : %d",result);
}
if (error) {
NSLog(#"Error : %#",error);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
I'm using this code for feedback via email in my cocos2d-x game.
Application::getInstance()->openURL("mailto:" + SUPPORT_EMAIL);
You can add subject:
Application::getInstance()->openURL("mailto:" + SUPPORT_EMAIL + "?subject=Hello from NX");
This solution tested on iOS and Android.

how send email by iPad - NSobject class

I have project very simply as Unity projects, and I want add a new function - sending for email application screenshot,
I try many ways to do that, but I am neebie in IOS and need your help :(
This version is working without errors, but after click button I didnt see email form
code is very short and simple - I hope someone has help me :(((
SampleViewsAppDelegate.h
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import <MapKit/MKMapView.h>
#import <MessageUI/MessageUI.h>
#import "tiDFusionMobile.h"
#interface SampleViewsAppDelegate : NSObject <UIApplicationDelegate,MFMailComposeViewControllerDelegate> {
///Application Window
UIWindow *mWindow;
UIViewController *rootViewController;
///Application views
UIView *mRender;
tiComponent* mPlayer;
}
///IBOutlet properties
#property (nonatomic, retain) IBOutlet UIWindow *mWindow;
#property (nonatomic, retain) IBOutlet UIViewController *rootViewController;
#property (nonatomic, retain) IBOutlet UIView *mRender;
- (IBAction)openMailBtn:(id)sender;
- (void)start;
- (void)stop;
#end
file mm
#import "SampleViewsAppDelegate.h"
#implementation SampleViewsAppDelegate
#synthesize mWindow;
#synthesize mRender;
#synthesize rootViewController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
{
// allocate the Component
mPlayer = [tiComponent alloc];
// set correct renderer
[mPlayer setRendererType:[tiComponent TI_RENDERER_GLES2]];
// initialze
[mPlayer initialize:mRender];
// start scenario
[self start];
return YES;
}
- (void)dealloc
{
[self stop];
//If the player is still instanciated, it is terminated and released
if (mPlayer)
{
[mPlayer terminate];
[mPlayer release];
mPlayer = nil;
}
[mRender release];
[mWindow release];
[super dealloc];
}
- (IBAction)openMailBtn:(id)sender {
rootViewController = (UIViewController*)
[(SampleViewsAppDelegate*)[[UIApplication sharedApplication] delegate] rootViewController];
if ([MFMailComposeViewController canSendMail]) {
// compose
MFMailComposeViewController* mail = [[MFMailComposeViewController alloc] init];
mail.mailComposeDelegate = self;
//format message
NSArray *recipientsArray = [[NSArray alloc] initWithObjects:#"test#aaaa.com", nil];
[mail setToRecipients:recipientsArray];
NSString *emailBody = #"DSDSDSDS";
[mail setSubject:[NSString stringWithFormat:#"AAAAAA"]];
//UIImage *myImage = [UIImage imageNamed:#"mobiletuts-logo.png"];
//NSData *imageData = UIImagePNGRepresentation(myImage);
//[mail addAttachmentData:imageData mimeType:#"image/png" fileName:#"mobiletutsImage"];
[mail setMessageBody:emailBody isHTML:YES];
//send
//if (controller)
[rootViewController presentModalViewController:mail animated:YES];
[mail release];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Failure"
message:#"Your device doesn't support the composer sheet"
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles: nil];
[alert show];
[alert release];
}
}
#pragma mark - MFMailComposeController delegate
- (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 the next time the user connects to email");
break;
case MFMailComposeResultFailed:
NSLog(#"Mail failed: the email message was nog saved or queued, possibly due to an error");
break;
default:
NSLog(#"Mail not sent");
break;
}
[self dismissViewControllerAnimated:YES complete:nil];
}
- (void)start
{
if (mPlayer != nil) {
BOOL isLoaded = [mPlayer loadScenario:#"Scenario/SampleViews_GLES1/project.dpd"];
if (isLoaded) {
[mPlayer playScenario];
}
}
}
- (void)stop
{
if (mPlayer && ![mPlayer isScenarioPaused]) {
[mPlayer pauseScenario];
}
}
#end
I GUESS YOU ARE NOT IMPORTING FRAMEWORK
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
#interface MailClassViewController : UIViewController<MFMailComposeViewControllerDelegate>
And then the code to present the email screen:
- (IBAction)openMailBtn:(id)sender {
if([MFMailComposeViewController canSendMail]) {
MFMailComposeViewController *mailCont = [[MFMailComposeViewController alloc] init];
mailCont.mailComposeDelegate = self;
[mailCont setSubject:#"Your email"];
[mailCont setMessageBody:[#"Your body for this message is " stringByAppendingString:#" this is awesome"] isHTML:NO];
NSString *file = [documentsDirectory stringByAppendingPathComponent:#"MaintenanceRequest.pdf"];
//IF YOU DONT WANT TO ATTACH FILE THEN COMMENT IT
NSData *data=[NSData dataWithContentsOfFile:file];
[mailViewController addAttachmentData:data mimeType:#"application/pdf" fileName:#"MaintenanceRequest.pdf"];
[self presentViewController:mailCont animated:YES completion:nil];
}
}
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
//handle any error
[controller dismissViewControllerAnimated:YES completion:nil];
}

How to send an E-Mail inside of an app in Xcode?

I am new to xcode, and am wondering how to send email in an app! My code is below, but I keep getting the error "No visible #interface for 'jakem' declares the selector 'presentViewControllerAnimated:'". Is my code completely wrong? Or did I just forget to declare the selector, and how do I declare the selector? I have researched all over the internet for at least an hour, and nothing is working. Someone please help me!
-(IBAction)sendEmail{
MFMailComposeViewController *composer = [[MFMailComposeViewController alloc] init];
[composer setMailComposeDelegate:self];
if ([MFMailComposeViewController canSendMail]) {
[composer setToRecipients:[NSArray arrayWithObjects:#"FrankMurphy.CEO#RomansXIII.com", nil]];
[composer setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[self presentViewController:composer animated:YES];
}
}
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
if(error) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"error" message:[NSString stringWithFormat:#"error %#", [error description]] delegate:nil cancelButtonTitle:#"dismiss" otherButtonTitles:nil, nil];
[alert show];
[self dismissViewControllerAnimated:YES];
}
else {
[self dismissViewControllerAnimated:YES];
}
}
in .h header file....
#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#interface SimpleEmailViewController : UIViewController <MFMailComposeViewControllerDelegate> // Add the delegate
- (IBAction)showEmail:(id)sender;
#end
in .m implementation file.....
- (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:#"info#finetechnosoft.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;
}
// Close the Mail Interface
[self dismissViewControllerAnimated:YES completion:NULL];
}
Check if you are MFMailComposeViewControllerDelegate.
You do this like
#interface YouClassName : UIViewController <MFMailComposeViewControllerDelegate>
#end
I think you're using the wrong method. Try
[self presentViewController:(UIViewController *) animated:(BOOL) completion:(void)completion];
instead of:
[self presentViewController:composer animated:YES];
I work for Sendgrid. We have an Objective-c library that lets you quickly send email from inside your app, https://github.com/sendgrid/sendgrid-objc. You can use cocoapods to quickly install the library in your project.
Then sending the email from your (IBAction) would look like this:
-(IBAction)sendEmail{
sendgrid *msg = [sendgrid user:#"username" andPass:#"password"];
msg.to = #"FrankMurphy.CEO#RomansXIII.com";
msg.from = #"me#bar.com";
msg.text = #"hello world";
msg.html = #"<h1>hello world!</h1>";
[msg sendWithWeb];
}

Resources