1

在我的 iPhone 应用程序中,我使用 SMTP 发送电子邮件。发送邮件时一切正常。但有时在发送邮件后,应用程序突然崩溃并显示以下错误消息

 <Warning>: Application 'UIKitApplication:com.myid.smtpsample[0x2630]' exited abnormally with signal 11: Segmentation fault: 11
��May  6 17:07:21 Device-3 ReportCrash[13041] <Error>: libMobileGestalt copySystemVersionDictionaryValue: Could not lookup ReleaseType from system version dictionary

这是我的代码:

-(void) sendEmail
{
    NSData *imagedata=UIImageJPEGRepresentation(image, 0.2f);

    SKPSMTPMessage *Message = [[SKPSMTPMessage alloc] init];
    Message.fromEmail = @"my email";
    Message.toEmail = receiverEmailString;
    Message.relayHost = @"smtp.gmail.com";
    Message.requiresAuth = YES;
    Message.login = @"my email";
    Message.pass = @"my password";
    Message.subject = @"Details";
    Message.wantsSecure = YES; 
    Message.delegate = self;

    NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain",kSKPSMTPPartContentTypeKey,@"Message Body",kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];

    NSDictionary *vcfPart= [NSDictionary dictionaryWithObjectsAndKeys:@"image/jpeg;\r\n\tx-unix-mode=0644;\r\n\tname=\"MyPhoto.jpg\"",kSKPSMTPPartContentTypeKey,
                             @"attachment;\r\n\tfilename=\"MyPhoto.jpg\"",kSKPSMTPPartContentDispositionKey,[imagedata encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];

    Message.parts = [NSArray arrayWithObjects:plainPart,vcfPart,nil];
    [Message send];

}


- (void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error{

    NSLog(@"delegate - error(%d): %@", [error code], [error localizedDescription]);
}

- (void)messageSent:(SKPSMTPMessage *)message{

    NSLog(@"delegate - message sent");


}

请告诉我哪里做错了

4

2 回答 2

4

我知道我回答这个问题有点晚了。但可能会帮助别人。所以这里。

我有同样的问题,这就是我解决它的方法。我唯一要做的就是添加对 SKPSMTPMessage 对象的强引用,并在发送电子邮件时引用它。奇迹般有效。(哦,我也很message = nil;机智地离开了,这对我没有任何问题。)

     @interface MyViewController ()    
     @property (nonatomic, strong) SKPSMTPMessage *Message;
     @end

    -(void) sendEmail
    {
        _Message = [[SKPSMTPMessage alloc] init];
        _Message.fromEmail = @"my email";
        _Message.toEmail = receiverEmailString;
        ...
        [_Message send];

    }


    - (void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error{
        message = nil;
        NSLog(@"delegate - error(%d): %@", [error code], [error localizedDescription]);
    }

    - (void)messageSent:(SKPSMTPMessage *)message{    
        message = nil;
        NSLog(@"delegate - message sent"); 
    }

希望这可以帮助。

于 2013-11-29T15:42:12.340 回答
0

您在一个方法中创建 Message ,将它自己作为委托(意味着它会在它完成后向您发送消息),但是在发送消息之后,当您离开该方法时,ARC 会释放 Message 。因此,创建一个 Message ivar,并且只有在它告诉您它成功或失败之后才将其 nil(并在分派到主线程的块中执行此操作,直接在委托回调中 nil 或释放对象是有风险的)。

PS:另外,请对类实例使用小写字母,对类对象使用大写首字母。

于 2013-05-06T12:43:53.377 回答