1

我在 iPhone 应用程序中创建并发送了一封带有 .txt 附件的简短电子邮件。

  1. 如果附件大约有 10 行长,GMail 可以很好地打开它。

  2. 如果超过 20 行左右,GMail 就会阻塞——它不会打开附件、下载附件,甚至不会转发电子邮件。

  3. 此外,如果我向我的同事发送相同的电子邮件并且他使用他的 Mac OS Mail 客户端打开它,那么一切正常。

例如下面是文本文件的内容(这个长度在GMail中打开就好了):

ACCELEROMETER READINGS
-0.0724487,-0.941833,-0.235458,2009-07-11 15:18:46 -0700
-0.0724487,-0.941833,-0.271683,2009-07-11 15:18:47 -0700
-0.0724487,-0.923721,-0.253571,2009-07-11 15:18:48 -0700
-0.0543365,-0.923721,-0.326019,2009-07-11 15:18:49 -0700
-0.0724487,-0.959946,-0.181122,2009-07-11 15:18:50 -0700
-0.0543365,-0.923721,-0.253571,2009-07-11 15:18:51 -0700
-0.108673,-0.923721,-0.380356,2009-07-11 15:18:52 -0700
-0.0724487,-0.923721,-0.271683,2009-07-11 15:18:53 -0700

GPS READINGS

HEADING READINGS
211.421,2009-07-11 15:18:46 -0700
206.421,2009-07-11 15:18:49 -0700
184.421,2009-07-11 15:18:50 -0700
195.421,2009-07-11 15:18:51 -0700
198.421,2009-07-11 15:18:53 -0700

如果文件是这个大小的两倍,GMail 无法处理它,但 Mail 再次可以。那么,可能是什么问题?我创建的电子邮件如下:

SKPSMTPMessage *testMsg = [[SKPSMTPMessage alloc] init];
testMsg.fromEmail = @"founders@gmail.com";
testMsg.toEmail = @"andrewljohnson@trailbehind.com";
testMsg.relayHost = @"smtp3.webfaction.com";
testMsg.requiresAuth = YES;
testMsg.login = @"andrewljohnson";
testMsg.pass = @"********";
testMsg.subject = @"iPhone Instrument Readings";
testMsg.wantsSecure = YES; // smtp.gmail.com doesn't work without TLS!
testMsg.delegate = self;

NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain",kSKPSMTPPartContentTypeKey, @"Hey Kevin,\nHere are some GPS readings for you to filter.\n\nLove, \nTrailBehind",kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];
NSData *fileData = [NSData dataWithContentsOfFile:fileName];    
NSDictionary *attached = [NSDictionary dictionaryWithObjectsAndKeys:@"text/directory;\r\n\tx-unix-mode=0644;\r\n\tname=\"readings.txt\"",kSKPSMTPPartContentTypeKey, @"attachment;\r\n\tfilename=\"readings.txt\"",kSKPSMTPPartContentDispositionKey,[fileData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];

testMsg.parts = [NSArray arrayWithObjects:plainPart,attached,nil];
[testMsg send];
4

6 回答 6

1

我建议您使用WireShark在发送消息时准确查看发送的内容。然后使用普通的邮件客户端发送相同的邮件(再次发送到 GMail),看看有什么区别 - 以及附件是否可以下载。

我的猜测是,您发送消息的方式有些不合规,GMail 对此有所抱怨,但您朋友的 SMTP 服务器却没有。与接收客户端 IMO 相比,它可能更多地与服务器有关。

另一件要尝试的事情是将 IMAP 客户端连接到您的 GMail 帐户 - 那么您可以获取附件吗?

于 2009-07-11T22:34:35.353 回答
1

我是朋友 - 我使用 pop.gmail.com 获取传入邮件,使用 smtp.gmail.com 获取通过 Mac OS X 的 Mail 传出的邮件。

于 2009-07-11T22:50:51.450 回答
1

您正在使用[fileData encodeBase64ForData],但我看到还有一个称为encodeBase64ForDataWrapped添加换行符的函数。也许您应该改为调用它,如果您的附件足够长,那么长的 base64 行会使某人感到困惑。

于 2009-07-21T03:44:12.463 回答
0

您是否考虑过将数据上传到服务器,然后在电子邮件中向用户提供指向该文件的链接?我知道这与您当前的方法相比将是一个相当大的转变,并且它需要一台服务器 - 但我想 GPS 和加速度计历史文件可能会变得非常大,作为用户,我不希望它们堵塞我的收件箱!

这也可能是解决大附件问题的最佳方法 - 我知道附件大小上限因电子邮件主机而异,但在我的学校,它就像 4MB...

祝你好运!

于 2009-07-12T01:10:10.367 回答
0

基本上,您的 MIME 附件是可疑的。获取 MIME 规范并仔细检查。如果我没记错的话,你不应该在分号后面加上 \r\n,因为 CRNL 具有特定的分隔含义。我有一段时间没看 MIME 规范了,所以你可能还好。这正是我要开始的地方。

尝试附加为纯文本文件,而不是附件中目录中的文件。此外,您的目录名称有一个 .txt 后缀对我来说很奇怪。我想知道这是否会让 rx 邮件服务器感到困惑。

请记住,对于可以解析的附件,每个邮件服务器都有不同的保真度级别。您最终可能不得不解决它们的局限性。

于 2009-07-12T02:21:14.537 回答
-1

我仍然认为问题在于您的附件标有 MIME 类型“文本/目录”,这是一种为传递电子邮件联系人列表而定义的类型。(见RFC

所以我敢打赌,一些电子邮件客户端正在将带有文本/目录 MIME 类型的 .txt 附件视为纯文本文件,而有些人正试图对它做一些疯狂的事情,认为你的 GPS 坐标列表实际上是一组电话号码什么的。

所以尝试将“text/directory”更改为“text/plain”!

于 2009-07-18T02:14:58.103 回答