0

我正在使用简单的 SMTP 客户端代码,首先发布在谷歌代码上:

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

那个 repo 似乎没有维护,因为项目所有者现在在苹果公司工作,也许还有更好的事情要做。有一个代码的分支,最近在 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

可能是您需要使用 [imgData encodeWrappedBase64ForData] 而不是 [imgData encodeBase64ForData],这就是这里的人遇到的问题。

于 2009-08-17T01:28:39.313 回答
0

你检查过字节顺序吗?

代码在两种不同的架构上运行;一般来说,当您切换机器时,一些事情可能会发生变化:

  • 某些类型的大小,例如CGFloats 或指针
  • 单词中的默认编码字节顺序(字节序)
  • 区域敏感数据
  • 存储偏好数据
  • 代码中定义的其他常量。

可能还有更多。

如何更详细地调试它?两个想法:

  1. 它真的是一个错误吗?如果它按预期在设备上运行,是否值得您花时间在模拟器上“修复”?
  2. 如果是,那么您可以找到以不同方式编码的第一个字节(diff可以提供帮助),并在您有权访问的最低级别代码处设置断点以设置字节。我假设您可以访问此功能,因为我在 SDK 中不知道它。一旦在两台机器上都有堆栈跟踪,您就可以向后工作,检查重要帧中的关键变量值,并找出差异的来源。
于 2009-08-17T01:31:34.433 回答