MFMailComposeViewController CSV-вложение не присоединяется, а вместо этого показывает встроенное
У меня проблема с отправкой CSV-вложений через MFMailComposeViewController. Иногда они проходят просто замечательно, но для других пользователей они отображаются не как вложения, а как текст, встроенный в электронное письмо (с
вместо возврата строки). Это очень странно. Кто-нибудь знает, что я делаю не так? Вот фрагмент моего кода:
MFMailComposeViewController *mailComposeViewController = [[MFMailComposeViewController alloc] init];
mailComposeViewController.mailComposeDelegate = self;
NSString *csv = @"foo,bar,blah,hello";
NSData *csvData = [csv dataUsingEncoding:NSUTF8StringEncoding];
[mailComposeViewController addAttachmentData:csvData mimeType:@"text/csv" fileName:@"testing.csv"];
[mailComposeViewController setSubject:@"testing sending csv attachment"];
[mailComposeViewController setMessageBody:@"csv file should be attached" isHTML:NO];
[self presentModalViewController:mailComposeViewController animated:YES];
6 ответов
-(IBAction)btnPressed:(id)sender {
NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *docDir = [arrayPaths objectAtIndex:0];
NSString *Path = [docDir stringByAppendingString:@"/CSVFile.csv"];
NSData *csvData = [NSData dataWithContentsOfFile:Path];
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"For csv file..."];
[controller setMessageBody:@"...csv file is hear.." isHTML:NO];
[controller addAttachmentData:csvData mimeType:@"text/csv" fileName:@"CSVFile.csv"];
[self presentModalViewController:controller animated:YES];
[controller release];
}
Привет я положил пример кода для создания файла CSV и прикрепить его с почтой, но убедитесь, что вы должны добавить MessageUI.Framework и импортировать связанный с ним заголовок "MessageUI/MessageUI.h" "MessageUI/MFMailComposeViewController.h" и разделить "MFMailComposeViewControllerDelegate".. Я надеюсь, что это будет полезно для других
- (void)viewDidLoad {
arrCsv=[[NSArray alloc]initWithObjects:@"Hello",@"Hi",@"traun",@"fine",nil];
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName = [NSString stringWithFormat:@"%@/try.csv", documentsDirectory];
[[arrCsv componentsJoinedByString:@","] writeToFile:fileName atomically:YES encoding:NSUTF8StringEncoding error:NULL];
}
-(ibAction)btnMail {
NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *docDir = [arrayPaths objectAtIndex:0];
NSString *Path = [docDir stringByAppendingString:@"/CSVFile.csv"];
NSData *csvData = [NSData dataWithContentsOfFile:Path];
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"For csv file..."];
[controller setMessageBody:@"...csv file is hear.." isHTML:NO];
[controller addAttachmentData:csvData mimeType:@"text/csv" fileName:@"CSVFile.csv"];
[self presentModalViewController:controller animated:YES];
[controller release];
}
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{ message.hidden = NO;
switch (result)
{
case MFMailComposeResultCancelled:
message.text = @"Result: canceled";
break;
case MFMailComposeResultSaved:
message.text = @"Result: saved";
break;
case MFMailComposeResultSent:
message.text = @"Result: sent";
break;
case MFMailComposeResultFailed:
message.text = @"Result: failed";
break;
default:
message.text = @"Result: not sent";
break;
}
[self dismissModalViewControllerAnimated:YES];
}
Установите тип mime как "application/octet-stream", и это должно помочь избавиться от вложенных вложений (я все еще назвал расширение моего файла, т.е. pdf)
Это может быть не так, но одна вещь, на которую следует обратить внимание:
[NSString dataUsingEncoding:]
возвращает действительный, но пустой объект NSData, если преобразование в указанную кодировку невозможно. Лучше использовать полную версию:
[NSString dataUsingEncoding: s allowLossyConversion: YES]
Или проверьте длину возвращаемых данных. Похоже, что вложения данных нулевой длины обрезаются где-то в процессе обработки почты.
Даже если вы установите для параметра isHTML значение YES, ваше тело сообщения может быть отправлено в виде обычного текста, если тело сообщения может быть представлено как таковое. А вложения в текстовых / текстовых сообщениях не всегда корректно распознаются некоторыми почтовыми клиентами (Outlook).
В моем случае добавление ссылки в теле сообщения помогло. Форматирование текста как полужирный с HTML-тегами тоже работает. Tricky!
Протестировано на iPod 1G 3.1.3.
Я считаю, что второй параметр setMessageBody:isHTML:
должно быть YES
чтобы вложения не отображались в строке.