iOS 9.3 带附件的邮件从不发送

iOS 9.3 Email with attachments never sends

使用带附件的 MFMailComposeViewController 会导致电子邮件留在发件箱中,永远不会从我的 Air 2 发送。我的 Pro 上的相同应用程序与 9.2 发送正常。

//.h

   @interface embEmailData : NSObject
{
    NSArray     *to;
    NSArray     *cc;
    NSArray     *bcc;
    NSString    *subject;
    NSString    *body;
    NSArray     *attachment;
}

@property (nonatomic, assign) BOOL optionsAlert;

-(void)setTo:(NSArray*)to;
-(NSArray*)to;

-(void)setCc:(NSArray*)cc;
-(NSArray*)cc;

-(void)setBcc:(NSArray*)bcc;
-(NSArray*)bcc;

-(void)setSubject:(NSString*)subject;
-(NSString*)subject;

-(void)setBody:(NSString*)body;
-(NSString*)body;

-(void)setAttachment:(NSArray*)attachment;
-(NSArray*)attachment;

-(void)setOptionsAlert:(BOOL)options;

//.m

#import "embEmailData.h"
#import <MessageUI/MFMailComposeViewController.h>
#import "UIImage+Utilities.h"
@import MessageUI;

#define kemailShowNSLogBOOL NO

@interface embEmailData () <MFMessageComposeViewControllerDelegate, MFMailComposeViewControllerDelegate>
@property (nonatomic, strong) embEmailData      *receivedData;
@property (nonatomic, strong) UIViewController  *topVC;
@end

@implementation embEmailData

- (id)init {
    self = [super init];
    if (self) {
        // Delay execution of my block for 0.1 seconds.
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
            [self postEmail];
        });

        _topVC = [UIApplication sharedApplication].keyWindow.rootViewController;

    }
    return self;
}

-(void)setTo:(NSArray*)_to
{
    to = _to;
    if (kemailShowNSLogBOOL) NSLog(@"%@",to);
}

-(NSArray*)to {
    return to;
}

-(void)setCc:(NSArray*)_cc
{
    cc = _cc;
    if (kemailShowNSLogBOOL) NSLog(@"%@",cc);
}

-(NSArray*)cc {
    return cc;
}

-(void)setBcc:(NSArray*)_bcc
{
    bcc = _bcc;
    if (kemailShowNSLogBOOL) NSLog(@"%@",bcc);
}

-(NSArray*)bcc {
    return bcc;
}

-(void)setSubject:(NSString*)_subject
{
    subject = _subject;
    if (kemailShowNSLogBOOL) NSLog(@"%@",subject);
}

-(NSString*)subject {
    return subject;
}

-(void)setBody:(NSString*)_body
{
    body = _body;
    if (kemailShowNSLogBOOL) NSLog(@"%@",body);
}

-(NSString*)body {
    return body;
}

-(void)setAttachment:(NSArray*)_attachment
{
    attachment = _attachment;
    if (kemailShowNSLogBOOL) NSLog(@"%@",attachment);
}

-(NSArray*)attachment {
    return attachment;
}

-(void)setOptionsAlert:(BOOL)options
{
    if (options)
    {
        if (kemailShowNSLogBOOL) NSLog(@"options");
    }
    else
    {
        if (kemailShowNSLogBOOL) NSLog(@"no options");
    }

    _optionsAlert = options;
}

-(void)postEmail
{
    _receivedData = self;
    [self emailData];
}

#pragma mark - Email Delegates
-(void)emailData
{
    if ([MFMailComposeViewController canSendMail] == YES) {

        MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
        picker.mailComposeDelegate = self; // &lt;- very important step if you want feedbacks on what the user did with your email sheet

        if(_receivedData.to)
            [picker setToRecipients:_receivedData.to];

        if(_receivedData.cc)
            for (NSString *email in _receivedData.cc) {
                NSLog(@"cc email: %@",email);
            }
            [picker setCcRecipients:_receivedData.cc];

        if(_receivedData.bcc)
            [picker setBccRecipients:_receivedData.bcc];

        if(_receivedData.subject)
            [picker setSubject:_receivedData.subject];

        if(_receivedData.body)
            [picker setMessageBody:_receivedData.body isHTML:NO]; // depends. Mostly YES, unless you want to send it as plain text (boring)

        // attachment code
        if(_receivedData.attachment) {

            NSString    *filePath;
            NSString    *justFileName;
            NSData      *myData;
            UIImage     *pngImage;
            NSString    *newname;

            for (id file in _receivedData.attachment)
            {
                // check if it is a uiimage and handle
                if ([file isKindOfClass:[UIImage class]]) {
                    NSLog(@"UIImage");

                    myData = UIImagePNGRepresentation(file);
                    [picker addAttachmentData:myData mimeType:@"image/png" fileName:@"image.png"];

                    // might be nsdata for pdf
                } else if ([file isKindOfClass:[NSData class]]) {
                    NSLog(@"pdf");
                    myData = [NSData dataWithData:file];
                    NSString *mimeType;
                    mimeType = @"application/pdf";
                    newname = @"Westbrook Brochure.pdf";
                    [picker addAttachmentData:myData mimeType:mimeType fileName:newname];

                    // it must be another file type?
                } else {

                    justFileName = [[file lastPathComponent] stringByDeletingPathExtension];

                    NSString *mimeType;
                    // Determine the MIME type
                    if ([[file pathExtension] isEqualToString:@"jpg"]) {
                        mimeType = @"image/jpeg";
                    } else if ([[file pathExtension] isEqualToString:@"png"]) {
                        mimeType = @"image/png";
                        pngImage = [UIImage imageNamed:file];
                    } else if ([[file pathExtension] isEqualToString:@"doc"]) {
                        mimeType = @"application/msword";
                    } else if ([[file pathExtension] isEqualToString:@"ppt"]) {
                        mimeType = @"application/vnd.ms-powerpoint";
                    } else if ([[file pathExtension] isEqualToString:@"html"]) {
                        mimeType = @"text/html";
                    } else if ([[file pathExtension] isEqualToString:@"pdf"]) {
                        mimeType = @"application/pdf";
                    } else if ([[file pathExtension] isEqualToString:@"com"]) {
                        mimeType = @"text/plain";
                    }

                    filePath= [[NSBundle mainBundle] pathForResource:justFileName ofType:[file pathExtension]];
                    NSLog(@"filePath %@ ",filePath);

                    UIImage * thumb = [UIImage imageNamed:filePath];
                    UIImage * resizeThumb = [UIImage resizeImage:thumb withMaxDimension:999];

                    if ([[file pathExtension] isEqualToString:@"pdf"]) {

                        //myData = [NSData dataWithData:file];
                        myData = [[NSFileManager defaultManager] contentsAtPath:filePath];
                        NSLog(@"ITS A PDF");
                    } else // if it is anything but a png file

                        if (![[file pathExtension] isEqualToString:@"png"]) {
                            //myData = [NSData dataWithContentsOfFile:filePath];
                            myData = UIImageJPEGRepresentation(resizeThumb, 1.0);

                        } else {
                            myData = UIImagePNGRepresentation(resizeThumb);
                        }

                    newname = file;
                    [picker addAttachmentData:myData mimeType:mimeType fileName:newname];

                }
            }
        }

        picker.navigationBar.barStyle = UIBarStyleBlack; // choose your style, unfortunately, Translucent colors behave quirky.
        [_topVC presentViewController:picker animated:YES completion:nil];

    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Status" message:[NSString stringWithFormat:@"Email needs to be configured before this device can send email. \n\n Use support@neoscape.com on a device capable of sending email."]
                                                       delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];
    }
}

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
    // Notifies users about errors associated with the interface
    switch (result)
    {
        case MFMailComposeResultCancelled:
            break;
        case MFMailComposeResultSaved:
            break;
        case MFMailComposeResultSent:
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Thank you!" message:@"Email Sent Successfully"
                                                           delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
            [alert show];
        }
            break;
        case MFMailComposeResultFailed:
            break;

        default:
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Status" message:@"Sending Failed - Unknown Error"
                                                           delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
            [alert show];
        }
            break;
    }
    [_topVC dismissViewControllerAnimated:YES completion:nil];
}

-(void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
    NSLog(@"FINISHED");
}

编辑:它有时仍然随机地为我做这件事。他们坐在发件箱中,直到我删除它们。我更新到 9.3.5 并发送了电子邮件。不确定发生了什么。

我从我的设备上删除了我的电子邮件帐户(这是一个公司 Gmail 帐户)。我注意到 Mail、Calendar、Contacts 和 Notes 都打开了。

删除并再次添加后,Notes 默认为关闭,我的电子邮件现在可以再次从我的应用程序发送。 YMMV.