0

私は単純なSMTPクライアントコードを使用しています。最初にGoogleコードに投稿されました:

http://code.google.com/p/skpsmtpmessage/

プロジェクトの所有者は現在Appleに雇用されており、おそらくもっと良いことがあるので、そのリポジトリは維持されていないようです。コードのフォークがあります。これは最近githubで管理されており、次の場所にあります。

http://github.com/kailoa/iphone-smtp/tree/master

アタッチメントをiPhoneデバイスで動作させるのに問題がありますが、奇妙なことに、それらはシミュレータで動作すると思いました。私のgithubコメントはここにあります:

http://github.com/kailoa/iphone-smtp/commit/50cbd49f351c2f0bb3a5ad6aea7736ac82d40af2#comment_27560

それをすべてコンテキストとして...私の質問は、iPhoneのSMTPクライアントで送信された電子メールにファイル(できればオーディオファイルですが、今のところどのファイルでもかまいません)を正常に添付できましたか?直接SMTPクライアントで送信する電子メールにファイルを添付できるようにしたいのですが、これまでのところ、正しく機能して機能するコードを見つけることができず、自分のコードを正常に記述して達成することができませんでした。偉業を言った。

iPhoneとシミュレータでファイルのエンコードが異なる理由はありますか?両方のコンテキストで作成された生のbase64文字列を見ると、それらは異なっているためです。なぜそうなるのか、私は迷っています。

私のコードの関連部分はこれです:

NSString* emailBody = @"This is a test email body";

NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain",kSKPSMTPPartContentTypeKey, emailBody,kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];

NSString *imgPath = [[NSBundle mainBundle] pathForResource:@"screenshot" ofType:@"png"];

NSData *imgData = [NSData dataWithContentsOfFile:imgPath];

NSDictionary *imgPart = [NSDictionary dictionaryWithObjectsAndKeys:@"image/png;\r\n\tx-unix-mode=0644;\r\n\tname=\"screenshot.png\"", kSKPSMTPPartContentTypeKey, @"attachment;\r\n\tfilename=\"screenshot.png\"", kSKPSMTPPartContentDispositionKey, [imgData encodeBase64ForData],kSKPSMTPPartMessageKey, @"base64",kSKPSMTPPartContentTransferEncodingKey,nil];

testMsg.parts = [NSArray arrayWithObjects:plainPart,imgPart,nil];

これを理解するためにさらにコードや参照が必要な場合は、追加を続けて喜んでいます。ただし、すべてのコードはgithubですぐに利用できるため、これに関心のある人は誰でも簡単にすべてを見ることができます。

ありがとうライアン

4

2 に答える 2

0

[imgDataencodeBase64ForData]の代わりに[imgDataencodeWrappedBase64ForData]を使用する必要があるかもしれません。これは、ここでの問題です。

于 2009-08-17T01:28:39.313 に答える
0

エンディアンを確認しましたか?

コードは2つの異なるアーキテクチャで実行されています。一般に、マシンを切り替えると、いくつかのことが変わる可能性があります。

  • CGFloatsやポインタなどの特定のタイプのサイズ
  • 単語内のデフォルトのエンコーディングバイト順序(エンディアン)
  • ロケールに依存するデータ
  • 保存された選好データ
  • コード内の他の定義された定数。

そしておそらくもう少し。

これをより詳細にデバッグする方法は?2つのアイデア:

  1. 本当にバグですか?意図したとおりにデバイスで動作する場合は、シミュレーターで「修正」する価値がありますか?
  2. はいの場合、異なる方法でエンコードされている最初のバイトを見つけて(diff役立つ)、バイトを設定するためにアクセスできる最下位レベルのコードにブレークポイントを設定できます。SDKでこの機能に気付いていないので、この機能にある程度アクセスできると思います。両方のマシンでそのスタックトレースを取得したら、逆方向に作業して、重要なフレームの主要な変数値を確認し、違いがどこから発生したかを把握できます。
于 2009-08-17T01:31:34.433 に答える