IPhoneアプリケーションからメールを送信したい。 iOS SDKにはメールAPIがないと聞きました。次のコードはアプリケーションを終了するため、使用したくありません。
NSString *url = [NSString stringWithString: @"mailto:[email protected][email protected]&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!"];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
アプリからメールを送信するにはどうすればよいですか?
IOS 3.0以降では、MFMailComposeViewController
クラスと、MFMailComposeViewControllerDelegate
プロトコルを使用する必要があります。これは、MessageUIフレームワークに組み込まれています。
最初に framework を追加してインポートします:
#import <MessageUI/MFMailComposeViewController.h>
次に、メッセージを送信するには:
MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"My Subject"];
[controller setMessageBody:@"Hello there." isHTML:NO];
if (controller) [self presentModalViewController:controller animated:YES];
[controller release];
次に、ユーザーが作業を行い、時間内にデリゲートコールバックを取得します。
- (void)mailComposeController:(MFMailComposeViewController*)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError*)error;
{
if (result == MFMailComposeResultSent) {
NSLog(@"It's away!");
}
[self dismissModalViewControllerAnimated:YES];
}
デバイスが電子メールを送信するように構成されているかどうかを忘れずに確認してください。
if ([MFMailComposeViewController canSendMail]) {
// Show the composer
} else {
// Handle the error
}
MFMailComposeViewController は、iPhone OS 3.0ソフトウェアのリリース後に移行する方法です。 サンプルコード または 私が書いたチュートリアル を見ることができます。
ここに追加したいことがいくつかあります。
Mail.appがシミュレーターにインストールされていないため、シミュレーターでmailto URLを使用しても機能しません。ただし、デバイス上では動作します。
Mailto URLの長さに制限があります。 URLが4096文字を超える場合、mail.appは起動しません。
OS 3.0には、アプリを終了せずに電子メールを送信できる新しいクラスがあります。クラスMFMailComposeViewControllerを参照してください。
アプリケーションからメールを送信する場合、アプリ内で独自のメールクライアント(SMTP)をコーディングするか、サーバーからメールを送信しない限り、上記のコードが唯一の方法です。
たとえば、メールを送信するサーバー上のURLを呼び出すようにアプリをコーディングできます。次に、コードからURLを呼び出すだけです。
上記のコードでは、メールに何も添付できないことに注意してください。SMTPクライアントメソッドでは、サーバー側のメソッドと同様にこれを行うことができます。
以下のコードは、アプリケーションで添付ファイル付きのメールを送信するためにアプリケーションで使用されています。添付ファイルは画像です。任意のタイプのファイルのみを送信できますが、正しい'mimeType'
これを.hファイルに追加します
#import <MessageUI/MFMailComposeViewController.h>
MessageUI.frameworkをプロジェクトファイルに追加します
NSArray *paths = SSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *getImagePath = [documentsDirectory stringByAppendingPathComponent:@"myGreenCard.png"];
MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"Green card application"];
[controller setMessageBody:@"Hi , <br/> This is my new latest designed green card." isHTML:YES];
[controller addAttachmentData:[NSData dataWithContentsOfFile:getImagePath] mimeType:@"png" fileName:@"My Green Card"];
if (controller)
[self presentModalViewController:controller animated:YES];
[controller release];
デリゲート方法は以下のとおりです
-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error;
{
if (result == MFMailComposeResultSent) {
NSLog(@"It's away!");
}
[self dismissModalViewControllerAnimated:YES];
}
これはuを助けることができるコードですが、メッセージui framewarkを含め、デリゲートメソッドMFMailComposeViewControllerDelegateを含めることを忘れないでください
-(void)EmailButtonACtion{
if ([MFMailComposeViewController canSendMail])
{
MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigation_bg_iPhone.png"] forBarMetrics:UIBarMetricsDefault];
controller.navigationBar.tintColor = [UIColor colorWithRed:51.0/255.0 green:51.0/255.0 blue:51.0/255.0 alpha:1.0];
[controller setSubject:@""];
[controller setMessageBody:@" " isHTML:YES];
[controller setToRecipients:[NSArray arrayWithObjects:@"",nil]];
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
UIImage *ui = resultimg.image;
pasteboard.image = ui;
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(ui)];
[controller addAttachmentData:imageData mimeType:@"image/png" fileName:@" "];
[self presentViewController:controller animated:YES completion:NULL];
}
else{
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"alrt" message:nil delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil] ;
[alert show];
}
}
-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
[MailAlert show];
switch (result)
{
case MFMailComposeResultCancelled:
MailAlert.message = @"Email Cancelled";
break;
case MFMailComposeResultSaved:
MailAlert.message = @"Email Saved";
break;
case MFMailComposeResultSent:
MailAlert.message = @"Email Sent";
break;
case MFMailComposeResultFailed:
MailAlert.message = @"Email Failed";
break;
default:
MailAlert.message = @"Email Not Sent";
break;
}
[self dismissViewControllerAnimated:YES completion:NULL];
[MailAlert show];
}
IPhoneアプリケーションから電子メールを送信するには、タスクのリストの下で行う必要があります。
ステップ1:Import #import <MessageUI/MessageUI.h>
電子メールを送信するコントローラークラス。
ステップ2:次のように、デリゲートをコントローラーに追加します
@interface <yourControllerName> : UIViewController <MFMessageComposeViewControllerDelegate, MFMailComposeViewControllerDelegate>
ステップ3:メールを送信するための以下のメソッドを追加します。
- (void) sendEmail {
// Check if your app support the email.
if ([MFMailComposeViewController canSendMail]) {
// Create an object of mail composer.
MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
// Add delegate to your self.
mailComposer.mailComposeDelegate = self;
// Add recipients to mail if you do not want to add default recipient then remove below line.
[mailComposer setToRecipients:@[<add here your recipient objects>]];
// Write email subject.
[mailComposer setSubject:@“<Your Subject Here>”];
// Set your email body and if body contains HTML then Pass “YES” in isHTML.
[mailComposer setMessageBody:@“<Your Message Body>” isHTML:NO];
// Show your mail composer.
[self presentViewController:mailComposer animated:YES completion:NULL];
}
else {
// Here you can show toast to user about not support to sending email.
}
}
手順4:MFMailComposeViewControllerデリゲートを実装する
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(nullable NSError *)error {
[controller dismissViewControllerAnimated:TRUE completion:nil];
switch (result) {
case MFMailComposeResultSaved: {
// Add code on save mail to draft.
break;
}
case MFMailComposeResultSent: {
// Add code on sent a mail.
break;
}
case MFMailComposeResultCancelled: {
// Add code on cancel a mail.
break;
}
case MFMailComposeResultFailed: {
// Add code on failed to send a mail.
break;
}
default:
break;
}
}
スイフト2.2。 Esq's answer から適応
import Foundation
import MessageUI
class MailSender: NSObject, MFMailComposeViewControllerDelegate {
let parentVC: UIViewController
init(parentVC: UIViewController) {
self.parentVC = parentVC
super.init()
}
func send(title: String, messageBody: String, toRecipients: [String]) {
if MFMailComposeViewController.canSendMail() {
let mc: MFMailComposeViewController = MFMailComposeViewController()
mc.mailComposeDelegate = self
mc.setSubject(title)
mc.setMessageBody(messageBody, isHTML: false)
mc.setToRecipients(toRecipients)
parentVC.presentViewController(mc, animated: true, completion: nil)
} else {
print("No email account found.")
}
}
func mailComposeController(controller: MFMailComposeViewController,
didFinishWithResult result: MFMailComposeResult, error: NSError?) {
switch result.rawValue {
case MFMailComposeResultCancelled.rawValue: print("Mail Cancelled")
case MFMailComposeResultSaved.rawValue: print("Mail Saved")
case MFMailComposeResultSent.rawValue: print("Mail Sent")
case MFMailComposeResultFailed.rawValue: print("Mail Failed")
default: break
}
parentVC.dismissViewControllerAnimated(false, completion: nil)
}
}
クライアントコード:
var ms: MailSender?
@IBAction func onSendPressed(sender: AnyObject) {
ms = MailSender(parentVC: self)
let title = "Title"
let messageBody = "https://stackoverflow.com/questions/310946/how-can-i-send-mail-from-an-iphone-application this question."
let toRecipents = ["[email protected]"]
ms?.send(title, messageBody: messageBody, toRecipents: toRecipents)
}
Swift 2.0
func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?){
if let error = error{
print("Error: \(error)")
}else{
//NO Error
//------------------------------------------------
var feedbackMsg = ""
switch result.rawValue {
case MFMailComposeResultCancelled.rawValue:
feedbackMsg = "Mail Cancelled"
case MFMailComposeResultSaved.rawValue:
feedbackMsg = "Mail Saved"
case MFMailComposeResultSent.rawValue:
feedbackMsg = "Mail Sent"
case MFMailComposeResultFailed.rawValue:
feedbackMsg = "Mail Failed"
default:
feedbackMsg = ""
}
print("Mail: \(feedbackMsg)")
//------------------------------------------------
}
}
Swiftバージョンは次のとおりです。
import MessageUI
class YourVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if MFMailComposeViewController.canSendMail() {
var emailTitle = "Vea Software Feedback"
var messageBody = "Vea Software! :) "
var toRecipents = ["[email protected]"]
var mc:MFMailComposeViewController = MFMailComposeViewController()
mc.mailComposeDelegate = self
mc.setSubject(emailTitle)
mc.setMessageBody(messageBody, isHTML: false)
mc.setToRecipients(toRecipents)
self.presentViewController(mc, animated: true, completion: nil)
} else {
println("No email account found")
}
}
}
extension YourVC: MFMailComposeViewControllerDelegate {
func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) {
switch result.value {
case MFMailComposeResultCancelled.value:
println("Mail Cancelled")
case MFMailComposeResultSaved.value:
println("Mail Saved")
case MFMailComposeResultSent.value:
println("Mail Sent")
case MFMailComposeResultFailed.value:
println("Mail Failed")
default:
break
}
self.dismissViewControllerAnimated(false, completion: nil)
}
}
1つのメソッド呼び出しへのメール送信を簡素化するKRNSendEmailという簡単なラッパーを作成しました。
KRNSendEmailは十分に文書化されており、CocoaPodsに追加されています。
https://github.com/ulian-onua/KRNSendEmail