SKPSMTPMessage发送邮件小解

 

即利用第三方开源库SKPSMTPMessage成功发送邮件。
在用SKPSMTPMessage库之前,先讲讲POP3和SMTP协议的一点点知识。POP3(Post Office Protocol,即邮局协议)和SMTP(Simple Mail Transfer Protocol,即简单邮件传送协议)协议是成双成对的用,前者是邮件接收协议,后者则是邮件发送协议,两者是应用层的协议。下面的图或许容易理解
SKPSMTPMessage发送邮件小解
注意:一个邮件服务器既可以作为客户,也可以作为服务器。
例如,当邮件服务器A 向另一个邮件服务器 B 发送邮件时,邮件服务器A 就作为 SMTP 客户,而 B 是SMTP 服务器。
当邮件服务器A 从另一个邮件服务器 B 接收邮件时,邮件服务器A 就作为 SMTP 服务器,而 B是 SMTP 客户。
发送邮件的一系列过程:

(1) 发信人调用用户代理来编辑要发送的邮件。

用户代理用SMTP 把邮件传送给发送方邮件服务器。

(2) 发送方邮件服务器将邮件放入

      邮件缓存队列中,等待发送。

 

(3) 运行在发送方邮件服务器的 SMTP 客户进程,发现

在邮件缓存中有待发送的邮件,就向运行在接收方邮件

服务器的SMTP 服务器进程发起 TCP 连接的建立。

 

(4) TCP 连接建立后,SMTP 客户进程开始向远程的SMTP 服务器进程发送邮件。当所有的待发送邮件发完了,SMTP 就关闭所建立的TCP 连接。

 

(5) 运行在接收方邮件服务器中的 SMTP 服务器进程收到邮件后,将邮件放入收信人的用户邮箱中,等待收信人在方便时进行读取。

 

(6) 收信人在打算收信时,调用用户代理,使用 POP3(或IMAP)协议将自己的邮件从接收方邮件服务器的用户邮箱中的取回(如果邮箱中有来信的话)。

 

 

由于smtp协议存在一定的缺点,所以后来出现了mime

 

SMTP 有以下缺点:

SMTP 不能传送可执行文件或其他的二进制对象。
SMTP 限于传送 7 位的 ASCII 码。许多其他非英语国家的文字(如中文、俄文,甚至带重音符号的法文或德文)就无法传送。
SMTP 服务器会拒绝超过一定长度的邮件。
某些 SMTP 的实现并没有完全按照因特网的SMTP 标准。  
 
来看看mime
MIME 并没有改动 SMTP 或取代它。
MIME 的意图是继续使用目前的 RFC 822 格式,但增加了邮件主体的结构,并定义了传送非ASCII 码的编码规则。

SKPSMTPMessage发送邮件小解

 

MIME 主要包括三个部  :
1、5 个新的邮件首部字段,它们可包含在[RFC 822]首部中。这些字段提供了有关邮件主体的信息。
2、定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化。
3、定义了传送编码,可对任何内容格式进行转换,而不会被邮件系统改变。
MIME 增加 5 个新的邮件首部:
1、MIME-Version: 标志 MIME 的版本。现在的版本号是1.0。若无此行,则为英文文本。
2、Content-Description: 这是可读字符串,说明此邮件是什么。和邮件的主题差不多。
3、Content-Id: 邮件的唯一标识符。
4、Content-Transfer-Encoding: 在传送时邮件的主体是如何编码的。
5、Content-Type: 说明邮件的性质。
内容传送编码Content-Transfer-Encoding :
1、最简单的编码就是7 位 ASCII 码,而每行不能超过 1000 个字符。MIME 对这种由 ASCII 码构成的邮件主体不进行任何转换。
2、另一种编码称为quoted-printable,这种编码方法适用于当所传送的数据中只有少量的非 ASCII 码。
3、对于任意的二进制文件,可用base64 编码。  
内容类型:
1、MIME着标准规定 Content-Type 说明必须含有两个标识符,即内容类型(type)和子类型(subtype),中间用“/”分开。
2、MIME 标准定义了 7 个基本内容类型和15 种子类型。
下面来简单讲讲SKPSMTPMessage发送邮件
首先肯定是下载开源库
导入cfnetwork.frame框架
导入头文件SKPSMTPMessage.h和NSData+Base64Additions.h
遵循SKPSMTPMessageDelegate协议,并实现两个协议方法
下面有个小demo

SKPSMTPMessage * mm=[[SKPSMTPMessage alloc] init];

   [mm setSubject:@”this is subject!”];

   [mm setToEmail:@”目标邮箱@126.com”];

   [mm setFromEmail:@”发送者邮箱@126.com”];

   [mm setRelayHost:@”smtp.126.com”];

   [mm setRequiresAuth:YES];

   [mm setLogin:@”发送者邮箱@126.com”];

   [mm setPass:@”发送者邮箱密码”];

   [mm setWantsSecure:YES];

   

   NSDictionary * plainPart=[NSDictionary dictionaryWithObjectsAndKeys:@”text/plain”,kSKPSMTPPartContentTypeKey,[NSString stringWithCString:”测试正文”encoding:NSUTF8StringEncoding],kSKPSMTPPartMessageKey,@”8bit”,kSKPSMTPPartContentTransferEncodingKey, nil];

   

   NSString * filePath=[[NSBundle mainBundle] pathForResource:@”imageName” ofType:@”png”];

   NSData * data=[NSData dataWithContentsOfFile:filePath];

   NSDictionary*vcfPart =[NSDictionary dictionaryWithObjectsAndKeys:@”text/directory;\r\n\tx-unix-mode=0644;\r\n\tname=”test.png””,kSKPSMTPPartContentTypeKey,

                          @”attachment;\r\n\tfilename=”test.png””,kSKPSMTPPartContentDispositionKey,

                          [dataencodeBase64ForData],kSKPSMTPPartMessageKey,@”base64″,kSKPSMTPPartContentTransferEncodingKey,nil];

   [mm setParts:[NSArray arrayWithObjects:plainPart,vcfPart, nil]];

   mm.delegate=self;

   [mm send];

针对上面demo提一下其中参数。在demo中发送者的邮箱使用的是126邮箱,所以发送邮件的代理服务器主机是smtp.126.com,如果发送者邮箱是qq邮箱,那么设置setRelayHost的值应该是smtp.qq.com。setpart中参数是发送的邮件的信息,包括邮件首部字段、邮件内容格式和传输编码。

 转自:http://blog.sina.com.cn/s/blog_7d280d7c0101da7d.html

 

发表评论

*

* 绝不会泄露


Design By Inzaghi | 京ICP备16047555号-1