2015-06-23 25 views
0

我正在写一个通过电子邮件发送PDF文件的函数。在iOS上,我遇到了一个问题,即生成PDF文件并将其附加到电子邮件并成功发送,但收到的电子邮件由于某种原因未包含原始的pdf文件。在iOS上发送电子邮件PDF文件

这是我使用MFMailComposeViewController的实现。

MFMailComposeViewController *mailer = [[[MFMailComposeViewController alloc] init] autorelease]; 
[mailer setMailComposeDelegate: id(m_delegate)]; 
[mailer setSubject:subject.toNSString()]; 
NSMutableArray *toRecipients = [[NSMutableArray alloc] init]; 
for(int i = 0; i < recipients.length(); i++) 
{ 
    [toRecipients addObject:recipients.at(i).toNSString()]; 
} 
[mailer setToRecipients:toRecipients]; 
NSString *emailBody = body.toNSString(); 
[mailer setMessageBody:emailBody isHTML:NO]; 


// Determine the file name and extension 
attachedFile = "/var/mobile/Containers/Data/Application/1DFBF012-4838-4350-B465-ECF247831EB3/Library/Application Support/test.pdf"; 
NSArray *filepart = [attachedFile.toNSString() componentsSeparatedByString:@"."]; 
NSString *filename = [filepart objectAtIndex:0]; 
NSString *extension = [filepart objectAtIndex:1]; 

// Get the resource path and read the file using NSData 
NSString *filePath = [[NSBundle mainBundle] pathForResource:filename ofType:extension]; 
NSData *fileData = [NSData dataWithContentsOfFile:filePath]; 

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

// Add attachment 
[mailer addAttachmentData:fileData mimeType:mimeType fileName:filename]; 


[qtController presentViewController:mailer animated:YES completion:nil]; 

我能够看到文件附加到电子邮件并发送它。我能够收到发送的电子邮件。但是,当我打开电子邮件时,它并未包含附加的文件。

任何建议如何解决这个问题?

这里是我保存PDF文件的实现,该文件遵循用于保存应用程序数据的标准文件系统路径。

/* Generate PDF file for sharing */ 
CGRect pageRect = CGRectMake(0, 0, 640, 480); 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentPath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
NSString * newFilePath = [documentPath stringByAppendingPathComponent:@"test.pdf"]; 
NSString *strFilename = newFilePath; 
MyCreatePDFFile(pageRect, [strFilename UTF8String]); 

我一直在寻找是否有办法让PDF文件生成故障排除。它位于应用程序支持目录中,由于沙箱策略,其他应用程序无法访问该目录。最快的方法是为我的应用程序启用文件共享。这里有一个有用的链接教你如何为我的应用程序启用文件共享。

How to enable file sharing for my app?

所以我通过iTune的分享从应用程序到我的MAC拉从iPad上的PDF文件。我能够附加相同的文件,并通过电子邮件发送到我的MAC完美。

MFMailComposeViewController似乎并没有抱怨文件,而是默默地拒绝它。这被认为是一个错误?

+0

您确定附件没有被客户端剥离吗?有些电子邮件主机出于安全原因删除某种类型的附件。 – Putz1103

+0

好问题。如果这是邮件主机删除我的文件,我该如何解决问题?推荐的Xcode在用附件发送电子邮件之前/之后检查和处理这类问题? –

+0

没有办法解决这个问题,也没有办法在xcode中进行测试。唯一的选择是尝试一个不同的电子邮件提供商或尝试从您自己的电子邮件系统发送完全相同的附件到同一地址,并查看附件是否被剥离。 – Putz1103

回答

0

该错误是由于附件文件路径没有指向想要附加的pdf文件。这里是它的修复:

// Get the resource path and read the file using NSData 
NSString *filePath = newFilePath; // corrected the attachment file path 
NSData *fileData = [NSData dataWithContentsOfFile:filePath]; 

下面的实施应该运行。

/* Generate PDF file for sharing */ 
CGRect pageRect = CGRectMake(0, 0, 640, 480); 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentPath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
NSString * newFilePath = [documentPath stringByAppendingPathComponent:@"test.pdf"]; 
NSString *strFilename = newFilePath; 
MyCreatePDFFile(pageRect, [strFilename UTF8String]); 

/* Attach PDF file generated */ 
NSString *emailTitle = @"Email PDF as attachment"; 
NSString *messageBody = @"Hey, check this out!"; 
NSArray *toRecipents = [NSArray arrayWithObject:@"[email protected]"]; 

//Implementation using MFMailComposeViewController 
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init]; 
mc.mailComposeDelegate = self; 
[mc setSubject:emailTitle]; 
[mc setMessageBody:messageBody isHTML:NO]; 
[mc setToRecipients:toRecipents]; 

// Determine the file name and extension 
NSArray *filepart = [strFilename componentsSeparatedByString:@"."]; 
NSString *filename = [filepart objectAtIndex:0]; 
NSString *extension = [filepart objectAtIndex:1]; 

// Get the resource path and read the file using NSData 
NSString *filePath = newFilePath; 
NSData *fileData = [NSData dataWithContentsOfFile:filePath]; 

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

// Add attachment 
[mc addAttachmentData:fileData mimeType:mimeType fileName:filename]; 

// Present mail view controller on screen 
[self presentViewController:mc animated:YES completion:NULL];