むらかみの雑記帳

Android とか iOS とかソフトウェア開発に関するネタ帳

iPhone ネイティブアプリからメールを送信する方法

結構苦労したので、備忘録代わりにメモ。

基本的には、mailto: の URI を作って、UIApplication の openURI: を使ってメーラを起動すればよい。

URI は "mailto:メールアドレス?Subject=題名&body=メッセージ本文" のような感じに作ってやればいい。気をつけなければならないのは以下の2点。

  • 1. URL エンコードを行うこと
  • 2. 本文は HTML で記述すること

1. のほうはあたりまえなのだが、2. のほうを見落としがちなので注意。順序としては、2. をやって、それから 1. をやる必要がある。なお、URL エンコードは NSString のstringByAddingPercentEscapesUsingEncoding: でできる。

例えば、本文中で改行したいなら、本文中に <br> と書く。さらに URL エンコードをして、%3Cbr%3E となる。

本文中に という文字列を書きたいなら、HTML にするために &lt;xml&gt; となり、URL エンコードによりさらに %26lt;xml%26gt; とする。

私が作ったエンコード用のメソッドはこんな感じ。

- (void)EncodeMailBody:(NSMutableString*)str
{
#define REPLACE(from, to) \
  [str replaceOccurrencesOfString: from withString: to \
  options:NSLiteralSearch range:NSMakeRange(0, [str length])]
	
	// convert to HTML
	REPLACE(@"&", @"&amp;");
	REPLACE(@"<", @"&lt;");
	REPLACE(@">", @"&gt;");
	REPLACE(@"\"", @"&quot;");
	REPLACE(@" ", @"&nbsp;");
	REPLACE(@"\n", @"<br>");
	REPLACE(@"\n", @"<br>");

	// URL encoding
	NSString *tmp = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
	[str setString:tmp];
	
	// encode for mail body
	REPLACE(@"&", @"%26");
}

なお、stringByAddingPercentEscapesUsingEncoding: は、& をエンコードしてくれないので、これをさらに %26 に置換する必要がある。