(1) 发信人调用用户代理来编辑要发送的邮件。
用户代理用SMTP 把邮件传送给发送方邮件服务器。
(2) 发送方邮件服务器将邮件放入
邮件缓存队列中,等待发送。
(3) 运行在发送方邮件服务器的 SMTP 客户进程,发现
在邮件缓存中有待发送的邮件,就向运行在接收方邮件
服务器的SMTP 服务器进程发起 TCP 连接的建立。
(4) TCP 连接建立后,SMTP 客户进程开始向远程的SMTP 服务器进程发送邮件。当所有的待发送邮件发完了,SMTP 就关闭所建立的TCP 连接。
(5) 运行在接收方邮件服务器中的 SMTP 服务器进程收到邮件后,将邮件放入收信人的用户邮箱中,等待收信人在方便时进行读取。
(6) 收信人在打算收信时,调用用户代理,使用 POP3(或IMAP)协议将自己的邮件从接收方邮件服务器的用户邮箱中的取回(如果邮箱中有来信的话)。
由于smtp协议存在一定的缺点,所以后来出现了mime
SMTP 有以下缺点:
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中参数是发送的邮件的信息,包括邮件首部字段、邮件内容格式和传输编码。