web-dev-qa-db-ja.com

MFMailComposeViewControllerのMailComposerシートにUIImageを追加する方法

UIImageの作成シート内にMFMailComposerViewControllersを挿入したい。

それらを添付したくないが、メール本文の一部となるHTMLコードを使用してテーブルに配置したいことに注意してください。

53
rkb

新しい答えで再び戻ってください。ただし、以前のコードはそのままにしておきます。それを利用する方法がないことにまだ確信が持てないためです。私はそれを自分で守ります。次のコードは機能します。 Mustafaは画像をbase64エンコードすることを提案し、画像に対してのみ機能することを示していますApple Appleに対しては実際には当てはまりません。Base64エンコードは現在ほとんどのメールクライアントで機能します(以前はIEでサポートされていませんでした。しかし、現在は特定のサイズまでの画像でサポートされていますが、正確なサイズはわかりません。問題は、Gmailなどのメールクライアントが画像データを削除することですが、簡単な回避策があります。 。<b> and </b>あなたの周りのタグ<img ...>タグが取り除かれないようにするために必要なことはすべてです。画像をメールに取り込むには、base64エンコーダーをプロジェクトに取り込む必要があります。いくつかありますが(大部分はCですが)、私が見つけた最も単純なObjCはNSData + Base64 by Matt Gallagherと呼ばれていました。問題が発生しました)。 .hファイルと.mファイルをプロジェクトにコピーし、使用する予定の場所に.hファイルを#importしてください。次に、このようなコードはメール本文に画像を取り込みます...

- (void)createEmail {
//Create a string with HTML formatting for the email body
    NSMutableString *emailBody = [[[NSMutableString alloc] initWithString:@"<html><body>"] retain];
 //Add some text to it however you want
    [emailBody appendString:@"<p>Some email body text can go here</p>"];
 //Pick an image to insert
 //This example would come from the main bundle, but your source can be elsewhere
    UIImage *emailImage = [UIImage imageNamed:@"myImageName.png"];
 //Convert the image into data
    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(emailImage)];
 //Create a base64 string representation of the data using NSData+Base64
    NSString *base64String = [imageData base64EncodedString];
 //Add the encoded string to the emailBody string
 //Don't forget the "<b>" tags are required, the "<p>" tags are optional
    [emailBody appendString:[NSString stringWithFormat:@"<p><b><img src='data:image/png;base64,%@'></b></p>",base64String]];
 //You could repeat here with more text or images, otherwise
 //close the HTML formatting
    [emailBody appendString:@"</body></html>"];
    NSLog(@"%@",emailBody);

 //Create the mail composer window
    MFMailComposeViewController *emailDialog = [[MFMailComposeViewController alloc] init];
    emailDialog.mailComposeDelegate = self;
    [emailDialog setSubject:@"My Inline Image Document"];
    [emailDialog setMessageBody:emailBody isHTML:YES];

    [self presentModalViewController:emailDialog animated:YES];
    [emailDialog release];
    [emailBody release];
}

私はこれをiPhoneでテストし、素敵な画像埋め込みメールをYahoo、私の個人Webサイト、およびMobileMeで自分に送信しました。私はGmailアカウントを持っていませんが、Yahooは完全に機能しました。私が見つけたすべてのソースは、太字タグがそれを機能させるために必要なすべてであると述べています。これがすべてに役立つことを願っています!

64
Mike

画像の保存場所に応じて、これを行うには2つの方法があります。

画像がサーバーにある場合は、HTML <img>タグを含め、ソースURLをリモート画像に設定します。メールメッセージをプレビューしているユーザーには、作成中に画像が表示され、受信者がメッセージを開くとそれが表示されます(デフォルトの画像の読み込みを無効にしていない場合)。

画像が電話にある場合は、「インライン」画像として含めることができます。これには2つのステップがあります。最初に、マルチパートMIME添付ファイルとして使用するすべての画像を添付する必要があり、それらには「コンテンツID」(別名cid)、ファイル名、およびContent-Dispositionセットを割り当てる必要がありますinlineに。 HTMLメッセージ本文内では、次のようにそれらを参照できます。

<img src="cid:{messageid}/image.png" alt="My image" />

悪い知らせは、標準のiPhoneメールcomposerメカニズムでは、この追加データを添付ファイルに追加できないことです。2番目のことは、メールに「代替」MIMEコンテンツタイプがあることを示すことです。繰り返しますが、メールcomposerでは、それを行うことはできません。

これを回避する方法は、自分でメッセージを作成してからSMTP経由で直接メールサーバーに送信するか、SMTPリレー経由でサーバープロキシに代行させることです。この方法を選択する場合は、Googleコードまたは AuthSMTP のようなサービスで skpsmtpmessage を確認してください。

ただし、ユーザーがこのメッセージを受信すると、すべてのインライン画像が含まれた自己完結型のHTMLメッセージが表示されます。しかし、設定は非常に面倒です。最初の方法(サーバーに画像を置く)の方がはるかに簡単です。

11
Ramin

IOS 3.0以降の場合、これを参照してください: 画像をメールに添付しますか?

例:

UIImage * image = [UIImage imageWithContentsOfFile:imagePath];
[composer addAttachmentData:UIImageJPEGRepresentation(itemImage, 1) mimeType:@"image/jpeg" fileName:@"MyFile.jpeg"];
4
Arie Litovsky

(残念ながら、次の方法は機能しませんが、画像のURLパス変換文字列の例は、コードにHTMLファイルパスが必要な他の場合に非常に役立つため、この投稿は残します。ください。機能する方法については、Base64Encodingに関する私の投稿を参照してください。)

私は自分でこの問題に遭遇し、うまくいく方法を見つけました。画像への完全なファイルパスを使用して、画像をインラインで表示できます。

少し変換が必要ですが、アプリのディレクトリ(NSString *path = [[NSBundle mainBundle] resourcePath], etc...)を取得する通常の方法を使用して、文字列をリテラルURLに変換します。たとえば、上記で返された「パス」文字列には"/ Users/Me/Library/Application Support/iPhone Simulator/3.2/Applications/25ADA98D-8DF4-4344-8B78-C18BC757EBDC/MyEmailingApplication.app"のようなものが含まれます。

この文字列を次のようにする必要があります

"file:/// Users // Me // Library // Application%20Support // iPhone%20 Simulator // 3.2 // Applications // 25ADA98D-8DF4-4344-8B78-C18BC757EBDC // MyEmailingApplication.app // "

最後に画像のファイル名を追加できます。 (この例ではアプリのリソースをポイントしていますが、tmpおよびドキュメントディレクトリにも同じことが当てはまります)。

この文字列変換は、[NSString stringWithFormat:@"file:///%@//%@",path,myImageName]の組み合わせで実行できます

[path stringByReplacingOccurencesOfString:@"/" withString:@"//"]を使用した後

「パス」のスラッシュを修正する

[path stringByReplacingOccurencesOfString:@" " withString:@"%20"]

スペースをHTMLフレンドリーにするため。これで、img src =\""、pathToMyImage、 "\"のように、このリテラルURLをHTMLエンコードされたメール本文で使用できます。

例は多くの作業のように見えますが、実際に設定を取得すると、それはまったく難しくなく、魅力的に機能します:-)頑張ってください!

1
Mike

多分これはあなたのために働くでしょう:

IImageをメールに埋め込む方法Composerメッセージ本文

これが言うことです:

基本的に、画像をbase64に変換します(以下に添付されているbase64は、メッセージの長さ制限の原因を短くする必要があるため、有効な画像ではありません)文字列に変換し、画像タグに埋め込みます。埋め込み画像はiPhoneから別のiPhoneでしか表示できないため、これで作業を停止したことを覚えています。Gmailでテストしたことを覚えています。ある。だから私はそれほどスパムフィルターの問題ではないと思いますが、電子メールクライアントはただもっと賢いです。私がこれを調査していたときに、実際にこれがスパムフィルターを通過する画像のみの情報を含む電子メールを爆発させるスパマーの数であることがわかりました。いまいましいスパマー、私はそれを正当な理由で使用するつもりでしたが、ほとんどのメールクライアントが画像を表示しないことがわかったときはほとんど役に立たなかったので。それが価値があるもののために、ここにコードがあります。

NSString *eMailBody = @"<html>Just convert your image file to base64 to embed into the email<img src="data:image/gif;base64,R0lGODlhFAFuAPcAAPf39//7/+fn59bT1u/r787Lzq0UAN7b3hhFrRhJtRA0hBA8lMYYALWytffz94wQAMa+vb26vRhNxufj5+/v78bDxvfz772+vcbHxghRCM7PzggkYyFZ1tYkCNbX1hhRzpyenO+6AN7f3gBlANauAGOW7zFl1kp95wg8pbW2tZyanHOi797f5zlx3msMAAB9CP/PAL22va2mraWipedJMSlRtf91Y72WAFqK76WmpRBFta2qrcaeAK2urfdpUuc8If39/e9ZQmPTY94wGFrLWrUkEISq9/n5+ZR5ABCWGLWOAIRpAGNRAClJlK2GAL0sGGssITG2OaWCAK3H9848KaW+762qpcbX/73jvWN5pGvTc/eGc//vCFppfIwgEJRBMYSGlPeWhJSSjHN5jMaSjKWmrb3P787V1ilBa4R9c9nXy+rq6ntNQu/y95Su3svO1kphlISa1t7b1vf7/3uGraWGexdAmoySlDm6QrWyraWqrRiiIWtpa0LDStrl/1JtrcbHzpxlWntlUklVcztZk3vbhISStfffWufr786upVmB1ta2taW21tLS0ve6rd7j5zlhtfemnJSetefn78LCw7W2vdnZ2bVFMf/3//f3/8Z1a9bb59bb3eHh4a2WjM7HxoR1OSGqKbW6xvT09JyGQrXD3v/r5+fk3s7rzufb3q2ytffXKbWiY6inp1p1WrWmjP/LxnOOzsC/v+/n56qSMffXzr2eEP/3hPHx8f//987T57m4ubVZShk5f97LjO/HKQ03ks7DpdZlWv/vMd7LxqWuvefr/86uKd66QgwyhcnJyf/ztbKxsrWqpe/37//z7///75zTpf/397Szsvfn1ozLjO/jlN7v3qWko62OEO/r5//73tbX3vf37wotd1qqYxlNvYyujN7X1qKgoHuWe5KUmkKOQhZKvildMRh5IZqZmcXEwZ2amaajoNfU0QMaTAsiV5STlSo+bZibpSti2puZl5u28pGs5pqbn9Hd8/fr94WFi7i1sBguYfP09v///ywAAAAAFAFuAAAI/wD/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iDYinEtJAWLUSIfJv6DVFShnOMXTEzpYrXKlPMXDGW6apZhli0CHmqtk+oJC9ejDDH6azBTGaMKDLBQUKCvzoC/5XAwcSJElV0UbB71lk0PFH6CGmqxS3cuZgyAwhw1tiUEiY+CEZBunTpwR9SfyisiNGmzYyNYqlWLZrtak6JRLmcoQKBCQQswEZ6ZcUJDn0RoFiwoAkhOH/+wCHURDkKHRIII0e+uoWbSbGRYv/SFy0qnj1yM6ArUEDDAQEOOBu9UqIF3xrMCWWRBGiAnP8eqKEBBpVIkgUhyg22nWocxKJLeEMBYIEAqVSD"></html>";

NSString *encodedBody = [eMailBody stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *urlString = [NSString stringWithFormat:@"mailto:[email protected]?subject=ImageTest&body=%@", encodedBody];
NSURL *url = [[NSURL alloc] initWithString:urlString];
[[UIApplication sharedApplication] openURL:url];
1
Mustafa

私は Mike's answer を試してみましたが、MFMailComposerViewController内では完全に機能しますが、残念ながらほとんどのメールクライアントでは機能しません。私は本当にメールコンテンツをUIImage埋め込みで送信する必要があるので、これが私がやったことです:

  1. UIImageでHTMLページを生成するために Mike's answer コードを保持しました
  2. このページを表示するUIWebView[yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]で作成しました
  3. 重要:これをUIViewControllerにユーザーのプレビューページとして表示します
  4. 次に、PDFこのUIWebViewから AnderCoverのメソッド)のおかげで を生成します
  5. 最後に、作成したPDFを[mailComposerController addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]

わかりました、私を責めないでください。これは、いくつかの画像を追加するための多くの変換とアクションであることを知っていますが、HTMLメール構造は、画像が埋め込まれているままです。最終ユーザーは見栄えの良いアタッチメントを1つだけ受け取ります。
「汚い」部分は、PDFコンテンツは実際にはWebビューのスクリーンショットです...再利用はできません。

0
Tib