私はIOSメールAPIなしでメールを送信するアプリを開発しています(メールは、ユーザーの操作やファイルの添付なしでSES amazonサービスを使用して送信されます...)。私の API では、エンコードされたメールをすべての MIME プロトコルで送信する必要があります (それは問題ではありません)。本文をcharset asciiでエンコードし、base64で添付したpdfをメールで送信します。
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
NSString *uuid = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
CFRelease(uuidRef);
//Encapsulation
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableString *rawMime = [[NSMutableString alloc] init];
[rawMime appendFormat:@"To: %@\n", _to];
[rawMime appendFormat:@"From: \"%@\" <boutique@tactill.com>\n", [defaults objectForKey:@"companyName"]];
[rawMime appendFormat:@"Reply-To: %@\n", [defaults objectForKey:@"toEmailForStats"]];
[rawMime appendFormat:@"BCC: %@\n", [defaults objectForKey:@"toEmailForStats"]];
[rawMime appendFormat:@"Subject: %@\n", _subject];
[rawMime appendString:@"Date: Thu, 05 Jan 95 10:53:24 -0500\n"];
[rawMime appendFormat:@"Message-ID: <%@@%@>\n", [(NSString *)uuid stringByReplacingOccurrencesOfString:@"-" withString:@""], @"IETF.CNR I.Reston.VA.US"];
[rawMime appendString:@"Mime-Version: 1.0\n"];
[rawMime appendString:@"Content-type: Multipart/Mixed; boundary=\"NextPart\"\n"];
[rawMime appendString:@"\n"];
[rawMime appendString:@"--NextPart\n"];
//Body
[rawMime appendString:@"Content-type: text/plain; charset=\"us-ascii\"\n"];
[rawMime appendString:@"\n"];
[rawMime appendString:_body];
[rawMime appendString:@"\n"];
[rawMime appendString:@"--NextPart\n"];
//Attach pdf
[rawMime appendString:@"Content-Type: application/pdf; "];
[rawMime appendFormat:@"name=\"%@.pdf\";\n", _pdfName];
[rawMime appendFormat:@"Content-Transfer-Encoding: base64\r\n\r\n"];
[rawMime appendFormat:@"%@\n",_pdfAttached];
[rawMime appendString:@"\n"];
//If necessary attach csv
if (_csvAttached!=nil) {
[rawMime appendString:@"--NextPart\n"];
[rawMime appendString:@"Content-Type: text/plain; "];
[rawMime appendFormat:@"name=\"%@.txt\";\n", _csvName];
[rawMime appendFormat:@"Content-Transfer-Encoding: base64\r\n\r\n"];
[rawMime appendFormat:@"%@\n",_csvAttached];
[rawMime appendString:@"\n"];
[rawMime appendString:@"--NextPart\n"];
}
NSData *rawMessageData = [rawMime dataUsingEncoding:NSUTF8StringEncoding];
gmailまたはメールアプリ(OSXまたはIOS)でメールを開くとすべて完璧ですが、Windowsメールで開くと特殊文字がジャンクに変更されます。私はそれについて読みましたが、Windows メールが iso-8859-1(NISOLatin1StringEncoding) を読み取ることがわかりました。だから私はその投稿の助けを借りて試しました: [http://stackoverflow.com/questions/4553388/how-to-convert-utf8-encoding-to-iso-8859-1-encoding][1] そのコードを実行:
//add body
char converted[([_body length] + 1)];
[_body getCString:converted maxLength:([_body length] + 1) encoding: NSISOLatin1StringEncoding];
[rawMime appendString:@"Content-type: text/plain; charset=iso-8859-1\n"];
[rawMime appendFormat:@"Content-Transfer-Encoding: quoted-printable\r\n\r\n"];
[rawMime appendFormat:@"%s", converted];
[rawMime appendString:@"\n"];
[rawMime appendString:@"--NextPart\n"];
現在、すべてのメール クライアントで次のように表示されます。Merci pour votre achat. ビエント!本文のみを印刷するときの NSLog と同様に、何が間違っていますか? メールの本文をうまくエンコードするにはどうすればよいですか?