5

Tôi muốn gửi thư từ ứng dụng iPhone tùy chỉnh của mình. Tôi đã sử dụng MFMailComposeViewController để gửi thư từ iphone của tôi trong ứng dụng trước đó của tôi. Bây giờ, tôi không muốn hiển thị MFMailComposeViewController cho người dùng, nếu họ nhấp vào Send Mail button thư tự động gửi đến recipient mail address. Tôi có thể làm cái này như thế nào? Bạn có thể giúp tôi về điều này không? Cảm ơn trước.Cách gửi thư từ ứng dụng iPhone mà không hiển thị MFMailComposeViewController?

Tôi đã sử dụng mã dưới đây để hiển thị các MFMailComposeViewController,

MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init]; 
controller.mailComposeDelegate = self; 
[controller setSubject:@"Details"]; 
[controller setMessageBody:@"Hi" isHTML:NO]; 
[controller setToRecipients:[NSArray arrayWithObjects:@"[email protected]", nil]]; 
[self presentModalViewController:controller animated:YES]; 
[controller release]; 

Trả lời

13

Gửi email theo chương trình, mà không cần người dùng can thiệp, từ một ứng dụng iphone, không thể được thực hiện sử dụng bất kỳ khuôn khổ của Apple. Nó có thể là có thể trong một chiếc điện thoại jailbroken nhưng sau đó nó sẽ không bao giờ nhìn thấy bên trong của App Store.

Nếu bạn muốn kiểm soát gửi email, thì cách tốt hơn là thiết lập dịch vụ web (ở cuối máy chủ), bạn có thể đăng bài bằng cách sử dụng yêu cầu HTTP. Nếu bạn chỉ đăng một địa chỉ thì điều này có thể hoạt động rất tốt, mặc dù bạn có thể muốn người dùng nhập địa chỉ thư trả lại của họ.

Nếu không, chỉ hộp thoại chuẩn có sẵn (tùy thuộc vào việc sử dụng bất kỳ tài khoản nào mà chúng đã thiết lập trên thiết bị).

+0

Bạn có thể vui lòng cung cấp thêm chi tiết về câu trả lời của bạn không? Có bất kỳ mẫu có sẵn về điều này? Tôi cũng đang đấu tranh trong việc gửi thư. Cảm ơn. – Gopinath

+0

như tôi đã nói, không có sự đồng ý của người dùng, không có cách nào bạn có thể gửi email từ thiết bị iOS. bạn muốn gì khác –

+0

Có, tôi đã hiểu. Cảm ơn. – Gopinath

3

SDK iOS đã thực sự dễ dàng gửi email bằng API tích hợp. Với một vài dòng mã, bạn có thể khởi chạy giao diện email giống như ứng dụng Thư cổ phiếu cho phép bạn soạn email. Bạn có thể bật lên biểu mẫu soạn thư, viết thư và có thể gửi thư thường hoặc tệp đính kèm thư bằng cách sử dụng lớp MFMailComposeViewController. Để biết thêm thông tin: Gửi e-mail từ Ứng dụng iOS của bạn

Nhưng, trong phần này, những gì tôi định giải thích là gửi email mà không hiển thị bảng soạn thư. gửi email trong nền. Đối với tính năng này, chúng tôi không thể sử dụng lớp MFMailComposer gốc của iOS vì nó không cho phép chúng tôi gửi email ở chế độ nền thay vì bật cửa sổ soạn thư từ nơi người dùng phải nhấn vào nút "gửi", vì vậy phần này tôi sẽ sử dụng Thư viện SKPSMTPMessage để gửi email ở chế độ nền, tuy nhiên tài khoản email phải được mã hóa cứng theo phương pháp này.

Hạn chế:

người gửi/nhận địa chỉ email đã được hardcoded hoặc bạn phải lấy nó sử dụng một số bật lên hình thức trong ứng dụng của bạn, nơi địa chỉ email người dùng đầu vào người gửi/nhận. Ngoài ra, thông tin đăng nhập tài khoản người gửi cũng phải được mã hóa cứng vì không có cách nào chúng tôi có thể lấy thông tin từ cài đặt thiết bị.

Phương pháp:

  1. nhập CFNetwork.framework để dự án của bạn.
  2. Bao gồm #import "SKPSMTPMessage.h" #import "NSData + Base64Additions.h" // để mã hóa Base64
  3. Bao gồm để ViewController bạn
  4. Tải SKPSMTPMessage thư viện từ
    https://github.com/jetseven/skpsmtpmessage
  5. Kéo và thả Thư mục "SMTPLibrary" bạn đã tải xuống dự án của mình.

    Trước khi tiếp tục, hãy cho bạn biết rằng tôi đang sử dụng địa chỉ email người gửi/người nhận và mật khẩu người gửi được mã hóa cứng trong mã cho ví dụ này.Tuy nhiên, bạn có thể lấy thông tin đăng nhập này từ người dùng, cho phép họ nhập vào một số loại biểu mẫu (sử dụng UIViews).

    -(void) sendEmailInBackground { 
        NSLog(@"Start Sending"); 
        SKPSMTPMessage *emailMessage = [[SKPSMTPMessage alloc] init]; 
        emailMessage.fromEmail = @"[email protected]"; //sender email address 
        emailMessage.toEmail = @"[email protected]"; //receiver email address 
        emailMessage.relayHost = @"smtp.gmail.com"; 
        //emailMessage.ccEmail [email protected]"your cc address"; 
        //emailMessage.bccEmail [email protected]"your bcc address"; 
        emailMessage.requiresAuth = YES; 
        emailMessage.login = @"[email protected]"; //sender email address 
        emailMessage.pass = @"Passwxxxx"; //sender email password 
        emailMessage.subject [email protected]"@"email subject header message"; 
        emailMessage.wantsSecure = YES; 
        emailMessage.delegate = self; // you must include <SKPSMTPMessageDelegate> to your class 
        NSString *messageBody = @"your email body message"; 
        //for example : NSString *messageBody = [NSString stringWithFormat:@"Tour Name: %@\nName: %@\nEmail: %@\nContact No: %@\nAddress: %@\nNote: %@",selectedTour,nameField.text,emailField.text,foneField.text,addField.text,txtView.text]; 
        // Now creating plain text email message 
        NSDictionary *plainMsg = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain",kSKPSMTPPartContentTypeKey, messageBody,kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil]; 
        emailMessage.parts = [NSArray arrayWithObjects:plainMsg,nil]; 
        //in addition : Logic for attaching file with email message. 
        /* 
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"JPG"]; 
        NSData *fileData = [NSData dataWithContentsOfFile:filePath]; 
        NSDictionary *fileMsg = [NSDictionary dictionaryWithObjectsAndKeys:@"text/directory;\r\n\tx- unix-mode=0644;\r\n\tname=\"filename.JPG\"",kSKPSMTPPartContentTypeKey,@"attachment;\r\n\tfilename=\"filename.JPG\"",kSKPSMTPPartContentDispositionKey,[fileData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil]; 
        emailMessage.parts = [NSArray arrayWithObjects:plainMsg,fileMsg,nil]; //including plain msg and attached file msg 
        */ 
        [emailMessage send]; 
        // sending email- will take little time to send so its better to use indicator with message showing sending... 
    } 
    

Bây giờ, xử lý các phương pháp đại biểu:

// Mở thành công

-(void)messageSent:(SKPSMTPMessage *)message{ 
    NSLog(@"delegate - message sent"); 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message sent." message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
    [alert show]; 
} 

// On Failure

-(void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error{ 
// open an alert with just an OK button 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error!" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
    [alert show]; 
    NSLog(@"delegate - error(%d): %@", [error code], [error localizedDescription]); 
} 

Ok, đó là tất cả từ phía mã hóa . hy vọng hướng dẫn này có thể hữu ích cho bạn guyz

+1

Hoạt động tốt. Tôi vừa thay đổi một số mã không phải ARC. Ngoài ra tôi đã thay đổi cài đặt của tài khoản người gửi google mail thành "Cho phép truy cập vào các ứng dụng kém an toàn hơn". – Panayot

Các vấn đề liên quan