UIImage
の構成シート内に sを挿入したいMFMailComposerViewController
。
添付したくないことに注意してください。ただし、メール本文の一部となる HTML コードを使用して表に配置したいと考えています。
UIImage
の構成シート内に sを挿入したいMFMailComposerViewController
。
添付したくないことに注意してください。ただし、メール本文の一部となる HTML コードを使用して表に配置したいと考えています。
新しい答えでもう一度戻ってください。ただし、それを利用する方法がないとまだ確信していないため、以前のコードはそのままにしておきます。私はそれを自分で続けます。次のコードは機能します。Mustafa は base64 で画像をエンコードすることを提案しており、それらは Apple 間でのみ機能すると述べていますが、実際にはそうではありません。現在、Base64 エンコーディングはほとんどのメール クライアントで機能します (IE は以前はサポートしていませんでしたが、現在は特定のサイズまでの画像でサポートされていますが、正確なサイズはわかりません)。問題は、Gmail のようなメール クライアントが画像データを取り除いてしまうことですが、それには簡単な回避策があります<b> and </b>
...<img ...>
タグが取り除かれないようにするために必要なのは、タグだけです。メールに画像を送信するには、base64 エンコーダーをプロジェクトに追加する必要があります。そこにはいくつかあります (ほとんどが C ですが)、私が見つけた最も単純な ObjC は、Matt Gallagher によって NSData+Base64と呼ばれていました (問題が発生したため、コピーした後に名前から「+」を削除しました)。.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 は完璧に機能しました。私が見つけたすべてのソースは、太字のタグだけで機能させることができると言っています。これがすべてに役立つことを願っています!
画像が保存されている場所に応じて、これを行うには 2 つの方法があります。
<img>
画像がサーバー上にある場合は、ソース URL がリモート画像に設定されたHTML タグを含めるだけです。メール メッセージをプレビューしているユーザーには、作成中に画像が表示され、受信者がメッセージを開いたときにそれが表示されます (既定の画像の読み込みを無効にしていない場合)。
画像が電話にある場合は、「インライン」画像として含めることができます。これには 2 つの手順があります。最初に、マルチパート MIME 添付ファイルとして使用するすべての画像を添付する必要があります。これらの画像には、「コンテンツ ID」(別名cid
)、ファイル名、および をContent-Disposition
割り当てる必要がありますinline
。HTML メッセージ本文内では、次のように参照できます。
<img src="cid:{messageid}/image.png" alt="My image" />
残念なことに、iPhone の標準のメール作成メカニズムでは、この追加データを添付ファイルに追加することはできません。2 つ目は、電子メールが「代替」MIME コンテンツ タイプであるとマークすることです。繰り返しますが、メール コンポーザではそれができません。
これを回避するには、自分でメッセージを作成してから SMTP 経由で直接メール サーバーに送信するか、SMTP リレー経由でサーバー プロキシに送信してもらいます。この方法で行くことにした場合は、Google コードの skpsmtpmessage や AuthSMTP のようなサービスをチェックしてみてください。
ただし、ユーザーがこのメッセージを受信すると、すべてのインライン画像を含む自己完結型の HTML メッセージが表示されます。しかし、設定するのはとても面倒です。最初の方法 (画像をサーバーに置く) は、はるかに簡単な方法です。
iOS 3.0 以降については、こちらを参照してください:電子メールに画像を添付しますか?
例:
UIImage * image = [UIImage imageWithContentsOfFile:imagePath];
[composer addAttachmentData:UIImageJPEGRepresentation(itemImage, 1) mimeType:@"image/jpeg" fileName:@"MyFile.jpeg"];
多分これはあなたのために働くでしょう:
UIImageをMailComposerメッセージ本文に埋め込む方法
これがそれが言うことです:
基本的に、画像をbase64(以下に添付されているbase64はメッセージの長さ制限のために短くする必要があるため、有効な画像ではありません)文字列に変換し、画像タグに埋め込みます。埋め込まれた画像はiPhoneから別のiPhoneにしか表示できないため、作業を中止したことを覚えています。データを表示するときに、運が悪かった仕事用のOutlookクライアントである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:someone@someplace.com?subject=ImageTest&body=%@", encodedBody];
NSURL *url = [[NSURL alloc] initWithString:urlString];
[[UIApplication sharedApplication] openURL:url];
私はマイクの答えが内で完璧に機能することを試しましたMFMailComposerViewController
が、残念ながらほとんどの電子メールクライアントではそうではありませんでした。UIImage が埋め込まれた電子メール コンテンツを送信する必要があるため、次のようにしました。
UIImage
UIWebView
このページを提示するために作成しました。[yourwebview loadHTMLString:@"yourHTMLString" baseURL:nil]
UIViewController
として表示します。UIWebView
おかげで、これから PDF を生成します[mailComposerController addAttachmentData:yourPDFFileAsNSData mimeType:@"application/pdf" fileName:@"yourFileName.pdf"]
わかりました、私を責めないでください、これがいくつかの画像を追加するための多くの変換とアクションであることは知っていますが、HTML メール構造は画像が埋め込まれても同じままであり、最終的なユーザーは見栄えの良い添付ファイルを 1 つだけ受け取ります。
「汚い」部分は、PDF コンテンツが実際には webview のスクリーンショットであるということです...実際には再利用できません。
編集: これから読む内容は (まだ) 機能しません! Base64 Encoding your image に関する私の他の投稿を確認してください。
これは、電子メール作成ウィンドウでは問題ないように見えますが、実際に送信される電子メールには写真が含まれていません (電話でテストしたところです)。メールアプリが画像自体をbase64でエンコードすると誤解しました(添付画像についてはそうです)。また、面倒ではありますが、画像フォルダに移動し、画像をクリップボードにコピーし、電子メールに移動して、必要な場所に貼り付けることで、複数の「フロー」インライン画像を挿入するように iPhone で電子メールを受け取ることができます。さらにテキストを書き、電子メールを下書きとして保存し、同じ電子メールにさらに多くの画像を貼り付けてプロセスを繰り返すことができます。メールを自分宛てに送信し、コンピューターでテキスト編集を使用して開きます。電子メールの形式 (base64 でエンコードされた画像を含む) を正確に確認できます。
以下の私のコードで奇妙なことに起こるのは、テキストはメールに含まれますが、画像は完全に消えてしまいます (それらへのぶら下がっている「壊れた」参照でさえありません:-/ )。これは、外部サーバー上の画像へのリンクが機能するかどうか疑問に思います. 私はこれに取り組み続けるつもりです... プログラム外のメールアプリで電子メールを起動すると、動作が異なるかどうか疑問に思っています。詳細が判明したら、これを更新するために戻ってきます...これはAppleが作るよりも簡単なはずです:-/
このコードは、「Documents」ディレクトリに保存する画像ファイル用に記述されています (そのため、アプリはそこに保存される画像と、それらの画像を参照する HTML コードを作成する必要があります。アプリに保存した画像の場合イメージへの初期パスに [[NSBundle mainBundle] resourcePath] を使用します)。
- (void)createEmailWithInlineImages {
//get app Documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
//make spaces HTML friendly
documentsPath = [documentsPath stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
//make forward-slash into double-forward-slash for HTML file-URL comapatibility
documentsPath = [documentsPath stringByReplacingOccurrencesOfString:@"/" withString:@"//"];
//get the name for your image into the string however your app works
//create a string formatted like a literal HTML URL to the image, e.g.
//file:///myiPhoneFileSystemPath//MyApplication//MyApplicationDirectories//Documents//imageName.jpg
NSString *myHTMLImageName = @"myHTMLImage.jpg";
NSString *imagePath = [NSString stringWithFormat:@"file:///%@//%@",documentsPath,myHTMLImageName];
//this string is an example of your email body text with HTML formatting
NSString *emailText = [NSString stringWithFormat:@"%@%@%@",@"<html><head><title>My Inline Image Example Email</title></head><body><p>Here's some text before the inline image</p><p><img src = \"",imagePath,@"\"></p><p>Here's some text for after the inline image. You could add more inline images and text after this with the same kind of formatting.</p></body></html>"];
//create email
MFMailComposeViewController *emailDialog = [[MFMailComposeViewController alloc] init];
emailDialog.mailComposeDelegate = self;
[emailDialog setSubject:@"My Inline Image Email Document"];
[emailDialog setMessageBody:emailText isHTML:YES];
[self presentModalViewController:emailDialog animated:YES];
[emailDialog release];
}
上記の例を試しましたが、うまくいきません。以下に、100% 動作するサンプル コードを示します。ただし、画像タグの URL を確認する必要があります。
//remove the img tag
NSScanner *theScanner;
NSString *gt =nil;
theScanner = [NSScanner scannerWithString:emailBody];
while ([theScanner isAtEnd] == NO) {
// find start of tag
[theScanner scanUpToString:@"<img" intoString:NULL] ;
// find end of tag
[theScanner scanUpToString:@">" intoString:>] ;
emailBody = [emailBody stringByReplacingOccurrencesOfString:[ NSString stringWithFormat:@"%@>", gt] withString:@""];
NSString *tt=[ NSString stringWithFormat:@"%@>", gt];
NSLog(@"*********************%@",tt);
st=tt;
NSLog(@"*********************%@",st);
}
st =[st stringByReplacingOccurrencesOfString:@"<img src=\"" withString:@""];
st =[st stringByReplacingOccurrencesOfString:@"\"/>" withString:@""];
st =[st stringByReplacingOccurrencesOfString:@".png" withString:@""];
st =[st stringByReplacingOccurrencesOfString:@"\"align=\"left" withString:@""];
//"align="left
NSLog(@"*********************%@",st);
NSString *path1 = [[NSBundle mainBundle] pathForResource:[ NSString stringWithFormat:@"%@", st] ofType:@"png"];
NSData *myData1 = [NSData dataWithContentsOfFile:path1];
[picker addAttachmentData:myData1 mimeType:@"image/png" fileName:[ NSString stringWithFormat:@"%@", st]];