How to send email from my iPhone app?

มีนาคม 23, 2010 at 3:26 pm 2 ของความคิดเห็น

ในการพัฒนา iPhone app ถ้าเราต้องการจะส่ง email ด้วย Application ของเรา เราจะสามารถทำได้อย่างไร?

หลายๆคน (เช่นผม) คงคิดว่า “เรียก protocol mail:// เพื่อเปิดโปรแกรม mail.app  ของ iPhone ขึ้นมา” หรือไม่ก็ “generate html ที่เป็น tag mailto ขึ้นมา แล้วใช้่ openUrl ของ appDelegate เรียกเอา” ซึ่งผมเองก็ไม่เคยทดสอบวิธีพวกนี้(แต่คิดว่าน่าจะทำได้) แต่ถึงอย่างนั้นก็มีข้อเสียอย่างรุนแรงทั้งสองวิธี

วิธีเรียก protocol mail:// แอพเราจะถูกปิดตัวลง ส่วนวิธี mailto: ก็ยุ่งยากในการ attach ไฟล์ เช่นการแนบรูปภาพ ต้องแปลง UIImage เป็น NSData ที่ Encode ด้วย Base64 เพื่อที่จะได้ URI Scheme มา attach เป็น body (และผมก็ลองแล้วด้วย springboard crash ไปเลยละครับ)

อันที่จริง มันไม่ได้ยุ่งยากอะไรเลย เพราะ framework มันมีมาให้แล้วหล่ะครับ ชื่อว่า MessageUI.framework ครับ วิธีการ Add ก็ double click ที่ Project Target ของเรา ใน Tab general กด + ข้างล่างใน general link library เลือก MessageUI.framework กด Add แค่นี้ก็เสร็จแล้ว ง่ายซะไม่มี

ลองกดดูที่ Framework จะพบว่า “มี Class ให้ใช้แค่คลาสเดียวเอง คือ MFMailComposeViewController แค่ชื่อคลาสก็บอกแล้วว่าไม่ต้องการอะไรไปมากกว่านี้แล้ว

การใช้งาน ขั้นแรก ให้ import framework ลงไปในคลาสที่เราต้องการใช้งาน framework นี้ แนะนำให้ import ลงในไฟล์ header เลย (.h) เพราะเราจะต้องใช้ protocol ของ framework นี้ด้วย

// myVC.h

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>

@interface myVC : UIViewController <MFMailComposeViewControllerDelegate> {}

– (IBAction)sendMail:(id)sender;

ในตัวอย่าง Class myVC ของผม ให้มี Action ไว้ปุ่มนึงเพื่อรับ action touch เพื่อส่งเมล์ สังเกตว่าผม Import protocol MFMailComposeViewControllerDelegate ไว้ด้วยนะครับ เอาไว้ทำอะไร เดี๋ยวมาดูกัน ต่อไปเราจะมา Implement method sendMail: กัน

// myVC.m


– (IBAction)sendMail:(id)sender {
MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init];
mail.mailComposeDelegate = self;

[mail setSubject:@”Hello, Developer”];
[self presentModalViewController:mail animated:YES];
}
การ Implement ก็เท่าที่เห็นครับ เนื่องจาก MFMailComposeViewController Subclass มาจาก UIViewController เพราะฉะนั้น เราจึงสามารถใช้คำสั่งแสดงผลแยกออกมาจาก NavigationController อย่างคำสั่ง presentModalViewController:animated: ก็ได้ หรือจะ push ลงใน Navigation Controller ก็ได้อีกเช่นกัน ในส่วนของค่าเริ่มต้น จะใส่หรือไม่ใส่อะไรก็ได้ อย่างในตัวอย่าง ทำการตั้ง Subject เอาไว้ว่า Hello, Developer ซึ่งส่วนอื่นๆก็เพิ่มได้หมด ตั้งแต่ ผู้ส่ง, ผู้รับ , CC, BCC หรือแม้แต่แนบไฟล์ก็ยังทำได้ จะซึ่งการแนบไฟล์ทำได้ดังนี้


[mail setSubject:@”Hello, Developer”];
[mail addAttachmentData:imageData mimeType:@”image/png” fileName:imagePath];
[self presentModalViewController:mail animated:YES];

นี่ครับ เพิ่มบรรทัดต่อบรรทัด imageData นี่เป็นไฟล์ NSData นะครับ ไม่ใช่ UIImage ถ้าไม่รู้ว่าแปลงยังไงก็ใช้คำสั่ง UIImagePNGRepresentation(<#your uiimage#>) หรือ UIImageJPGRepresentation(<#your uiimage#>) ก็ได้ครับ ขึ้นกับว่าต้นฉบับเป็นนามสกุลอะไร แต่ถ้าเป็นไฟล์อื่นก็หาวิธีแปลงเอาเองนะครับ บอกหมดคงไม่ไหว (ฮา) ส่วน mimeType ถ้าไม่รู้ Type ไหนต้องตั้งเป็นอะไร ลองดูที่นี่ครับ http://www.sfsu.edu/training/mimetype.htm มีบอกให้น่าจะเพียงพอ

ต่อไปก็เรื่องที่ค้างกันไว้ Protocol ที่ import ไว้ตั้งแต่ Header จะเห็นตอนเรา allocate ด้วยว่าเรามีการ set delegate มาที่ตัวเอง ซึ่ง method ที่เราใช้เรียกผ่าน delegate ก็คือ mailComposeController:didFinishWithResult:error: แปลง่ายๆก็คือ “ส่งเสร็จแล้วทำอะไร” จาก Parameter จะเห็นว่าจะ return ผลการส่งมาให้ทั้งหมด ส่งเสร็จหรือเปล่า ถ้าไม่เสร็จแล้ว Error ยังไง หน้าที่ของเราก็คือ “กำหนดว่า หลังจากส่งแล้วจะทำอะไรต่อ” ซึ่งผมจะไม่ทำอะไร นอกจาก “ส่งเสร็จแล้วก็ปิดหน้าส่ง email ไปซะ ทำได้ดังนี้

– (void)mailComposeController:(MFMailComposeViewController*)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError*)error
{
[controller dismissModalViewControllerAnimated:YES];
}

…เท่านี้ละครับ เสร็จแล้ว ง่ายอย่างไม่น่าเชื่อ สำหรับ Entry นี้ก็จบแค่นี้ละครับ มีอะไรเจ๋งๆง่ายๆ จะมาเขียนแนะนำกันอีก

Happy Coding ครับ

Entry filed under: Computer, iPhone Programming. Tags: , , , , , .

แดงแท้ – แดงเทียม iPhone’s project multi-target programming

2 ความเห็น Add your own

  • 1. biggoogle  |  มีนาคม 26, 2010 ที่ 1:30 pm

    มีประโยชน์จริงๆครับ

    ขอบคุณครับ

    (ตอบกระทู้ข้างล่างไม่ทัน โดนปิดก่อน)

    ตอบกลับ
  • 2. fad  |  สิงหาคม 15, 2011 ที่ 11:08 am

    ของโค้ดที่สมบูรณ์แล้วได้ไหมครับ พอดีเพิ่งเริ่มศึกษาการเขียนแอฟในไอโฟน

    ตอบกลับ

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out /  เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out /  เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out /  เปลี่ยนแปลง )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed


del.icio.us For iPhone dev

Post Calendar

มีนาคม 2010
พฤ อา
« ก.พ.   เม.ย. »
1234567
891011121314
15161718192021
22232425262728
293031  

%d bloggers like this: