草庐IT

IOS 编码正文邮件(为 SES 创建我自己的 mime 邮件)

coder 2024-01-12 原文

我正在开发一个应用程序,我可以在没有 IOS 邮件 API 的情况下发送邮件(邮件是使用 SES 亚马逊服务发送的,无需用户交互和附加文件...)。在我的 API 中,我必须使用所有 MIME 协议(protocol)发送编码邮件(这不是问题所在)。我发送很好的邮件,用 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(NSISOLatin1StringEncoding)。所以我尝试在那篇文章的帮助下:[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。 �bient�t!当我只打印正文时,NSLog 也是如此 我做错了什么?我如何才能很好地编码邮件正文?

最佳答案

这是回答这个问题的工作代码,它添加了一个 pdf 文件,偶尔也添加了一个 csv

-(NSData*)formatedMail{


    CFUUIDRef   uuidRef   = CFUUIDCreate(kCFAllocatorDefault);
    NSString    *uuid     = (__bridge_transfer  NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
    CFRelease(uuidRef);

    NSDate* today = [[NSDate alloc] init];
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];

    NSString* date =[dateFormatter stringFromDate:today];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSMutableString *rawMime = [[NSMutableString alloc] init];
    [rawMime appendFormat:@"To: %@\n", email_to];
    [rawMime appendFormat:@"From: \"name_from" <e-mail_from>\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 appendFormat:@"Date: %@\n", date];
    [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"];

    //Here's come the body part
    [rawMime appendString:@"Content-type: text/plain; charset=\"UTF-8\"\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: application/octet-stream; "];
        [rawMime appendFormat:@"name=\"%@\";\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];

    return rawMessageData;
}

_pdfAttached 是 NSString,表示以 base64 编码的 PDF 我希望它能有所帮助,很抱歉之前没有发布解决方案

这里的代码不是发送而是创建邮件正文。在这里你可以做一些你不能用 SESSendRawEmailRequest 做的事情,例如把一个“show name”放在 to 和 from 之间。我建议您使用这两个部分来定义发件人,您会发现它提供了只有 SESSendRawMessage 无法提供的可能性。最后说,如果您不想出现异常,您不应该忘记在 SESSEndRawEmailRequest 中输入发件人和发件人地址。

关于IOS 编码正文邮件(为 SES 创建我自己的 mime 邮件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10228039/

有关IOS 编码正文邮件(为 SES 创建我自己的 mime 邮件)的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  6. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  7. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  8. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  9. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  10. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

随机推荐