Senden Sie eine iphone-Anhang per E-Mail programmgesteuert
Schreibe ich eine iPhone-app, die erfordert, dass ich senden Sie eine e-mail-Anlage, die programmgesteuert. Die Anlage ist eine csv-Datei, die ich erstellen durch den code. Ich fügen Sie dann die Datei an die E-Mail und der Anhang zeigt auf das Telefon. Wenn ich senden Sie die E-Mail an mich, aber, die Anlage erscheint nicht in der e-mail. Hier ist der code, den ich verwende.
[self exportData];
if ([MFMailComposeViewController canSendMail])
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"expenses" ofType:@"csv"];
NSData *myData = [NSData dataWithContentsOfFile:filePath];
MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
mailer.mailComposeDelegate = self;
[mailer setSubject:@"Vehicle Expenses from myConsultant"];
NSString *emailBody = @"";
[mailer setMessageBody:emailBody isHTML:NO];
[mailer addAttachmentData:myData mimeType:@"text/plain" fileName:@"expenses"];
[self presentModalViewController:mailer animated:YES];
[mailer 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];
}
}
- (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.");
break;
case MFMailComposeResultFailed:
NSLog(@"Mail failed: the email message was not saved or queued, possibly due to an error.");
break;
default:
NSLog(@"Mail not sent.");
break;
}
//Remove the mail view
[self dismissModalViewControllerAnimated:YES];
Das wird erfolgreich erstellt - ich überprüfte in der simulator-Dateien.
- (void) exportData
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *root = [documentsDir stringByAppendingPathComponent:@"expenses.csv"];
NSString *temp=@"Date,Purpose,Start Odometer,End Odometer, Total Driven, Fees, ";
for(int i = 0; i < expenses.count; i++){
VehicleExpense *tempExpense = [expenses objectAtIndex:i];
temp = [temp stringByAppendingString:tempExpense.date];
temp = [temp stringByAppendingString:@", "];
temp = [temp stringByAppendingString:tempExpense.purpose];
temp = [temp stringByAppendingString:@", "];
temp = [temp stringByAppendingString:[NSString stringWithFormat: @"%.02f",tempExpense.start_mile]];
temp = [temp stringByAppendingString:@", "];
temp = [temp stringByAppendingString:[NSString stringWithFormat: @"%.02f",tempExpense.end_mile]];
temp = [temp stringByAppendingString:@", "];
temp = [temp stringByAppendingString:[NSString stringWithFormat: @"%.02f",tempExpense.distance]];
temp = [temp stringByAppendingString:@", "];
temp = [temp stringByAppendingString:[NSString stringWithFormat: @"%.02f",tempExpense.fees]];
temp = [temp stringByAppendingString:@", "];
}
[temp writeToFile:root atomically:YES encoding:NSUTF8StringEncoding error:NULL];
NSLog(@"got here in export data--- %@", documentsDir);
}
Versuchen Sie, sich anzumelden myData, um zu sehen, wenn es nicht die Rückgabe nil.
Es ist null...wie bekomme ich die Datei? Bin ich der Bearbeitung meiner ursprünglichen post zeigen, wo ich die Datei erstellen.
Es scheint, wie
Dass es gelöst. Danke!
Es ist null...wie bekomme ich die Datei? Bin ich der Bearbeitung meiner ursprünglichen post zeigen, wo ich die Datei erstellen.
Es scheint, wie
filePath = [[NSBundle mainBundle] pathForResource:@"expenses" ofType:@"csv"];
nicht den Pfad der Datei, die Sie suchen. Wenn ich richtig bin, diese Methode wird nur Ressourcen in Ihre .app-Ordner. Ich empfehle Ihnen, sich den Pfad auf die gleiche Weise tun, in Ihren exportData-Methode.Dass es gelöst. Danke!
InformationsquelleAutor coder | 2011-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
versuchen
[mailer addAttachmentData:myData mimeType:@"text/csv" fileName:@"expenses.csv"];
Edit:
Dies ist der code, den ich verwende in meiner app:
InformationsquelleAutor Danut Pralea
Danut Pralea's Antwort ist toll, aber der code scheint zu lang für jemanden der Suche nach einem einfache Weise zu senden von Anlagen per E-Mail programmgesteuert.
Das Wesentliche
Ich gestutzt, seine Antwort zu nehmen, nur die wichtigen bits, sowie umgestalteten es so:
Das ist im Grunde der Kern ist, es ist genug, wie es ist. Wenn, zum Beispiel, setzen Sie diesen code auf einen button die Aktion, es wird eine E-Mail verfassen Bildschirm mit dem jeweiligen Felder vorab gefüllt, sowie dass die Datei, die Sie möchten, an die email angehängt.
Weiter Lesen
Rahmen
Den
MFMailComposeViewController
ist unter derMessageUI
Rahmen, so zu verwenden, importieren (wenn noch nicht geschehen) den Rahmen, etwa so:E-Mail-Fähigkeit Prüfen
Nun beim ausführen der source-code, und Sie haben noch nicht die Einrichtung eines Email-Kontos auf dem Gerät (nicht sicher was das Verhalten auf simulator), dieser code wird den Absturz Ihrer app. Es scheint, dass, wenn die E-mail-Konto noch nicht einrichten, tun
[[MFMailComposeViewController alloc] init]
immer noch zu denmailComposer
wird null, den Absturz verursacht. Als die Antwort in der verlinkten Frage-Staaten:Können Sie dies mit Hilfe der canSendMail Methode etwa so:
Können Sie dieses Recht, bevor Sie
[[MFMailComposeViewController alloc] init]
so dass Sie benachrichtigt den Nutzer sofort.Umgang cannotSendMail
Wenn
canSendMail
gibt false zurück, laut Apple Dev Docs, das bedeutet, dass das Gerät nicht konfiguriert ist zum senden von Nachrichten. Diese bedeuten könnte vielleicht, dass der Benutzer noch nicht die setup Ihre E-Mail-Konto. Zu helfen, die Benutzer, die Sie anbieten können, um öffnen Sie die Mail-app und setup Ihr Konto. Sie können dies tun, etwa so:Können Sie dann umzusetzen
openCannotSendMailDialog
etwa so:Mime-Typen
Wenn Sie wie ich, Sie vergessen/nicht sicher sind, welche
mimeType
zu verwenden, hier ist eine Ressource, die Sie verwenden können. Wahrscheinlichtext/plain
ist genug, wenn die Datei, die Sie anfügen ist einfach nur eine text -, oderimage/jpeg
/image/png
für Bilder.Delegieren
Als Sie wahrscheinlich bemerkt, Xcode wirft uns eine Warnung auf die folgende Zeile:
Dies ist, weil wir noch nicht festgelegt, uns selbst zu entsprechen, das entsprechende Protokoll und die Umsetzung Ihrer delegate-Methode. Wenn Sie möchten, um Ereignisse empfangen, ob der E-mail abgebrochen wurde, gespeichert, weitergeleitet oder sogar fehlgeschlagen senden, die Sie benötigen, um Ihre Klasse zu entsprechen, das Protokoll
MFMailComposeViewControllerDelegate
, und Griff die folgende Veranstaltungen:Laut Apple Dev Docs (Hervorhebung von mir):
Mit diesem im Verstand, können wir die Implementierung der delegate-Methode etwa so:
Abschluss
Den letzten code könnte ungefähr so Aussehen:
Mit der Schaltfläche die Aktion suchen, wie:
Ließ mich gehen hier, aber man kann, mit einem Körnchen Salz, nehmen Sie und verwenden Sie den code, den ich hier gepostet. Natürlich ist es erforderlich, an Ihre Anforderungen anpassen, aber das ist bis zu Ihnen. (Ich habe auch geändert, dass diese Antwort von meinem Arbeits-source-code, so könnte es sein Fehler irgendwo, bitte Kommentar, wenn Sie eine finden,:))
[controller dismissView...
statt[self dismissView...
?ja, und ich bin mit
controller
, aber apple offiziellen docs verwendenself
... developer.apple.com/documentation/messageui/... Listing 3Gut, das ist seltsam. Ich habe den link geöffnet, und ich sah sicher den Beispielcode mit
[self dismiss...
. Swift version nutztcontroller.dismiss...
obwohl.Lol, als dies geschrieben wurde, das ObjC der link kann nicht geöffnet werden. Es ist wahrscheinlich, Durchlaufen korrigieren? Ich check den link weiter unten um zu sehen, ob es hat in der Tat geändert. BTW, haben Sie auch versucht, mit Hilfe
[self dismiss..
? Ich bin in einem anderen Projekt gerade jetzt, so bin ich nicht in der Lage, um es zu bestätigen.Ich aktualisierte die Antwort hinzufügen, um weitere details zu delegieren, Umsetzung, und ich
[controller dismiss...
. Danke 🙂 Gut, Diese Frage ist wirklich alt, so ist die Frage Fragesteller wird sich wohl nie akzeptieren meine Antwort, aber das ist in Ordnung. Ich stellte diese Antwort zu wissen, dass es nicht angenommen. Ich wollte nur prune die Antwort akzeptiert, weil, wie Sie sehen können, ist es vielleicht ein bisschen zu lang für etwas so einfaches wie sende eine E-Mail mit Anhang programmgesteuert. Aber dann bekam ich übernommen und geschrieben, einer mehr detaillierten. 😛InformationsquelleAutor Keale
Das Problem war, dass ich war nicht auf der Suche an der richtigen Stelle für die Datei. Danke @EmilioPalesz .
Hier der code, den ich brauchte:
InformationsquelleAutor coder