邮件内容协议分成很多个段落
首先是日期 Date: RFC 5322 日期格式
然后是收件人发件人段,“To:” 和 "From",以及抄送 "Cc:“ 和 "Bcc“
随后是“Message-ID: “,用于服务器在消息流通中不至于重复发送和存储,识别邮件的唯一性。
最后一段比较关键,格式类似于这样:
MIME-Version: 1.0\r\nContent-type: multipart/alternativeboundary=\"\(boundary)\"\r\n\r\n
意思是表示邮件采用MIME内容编码,可以是多个组成部分,由边界线boundary划分为多个数据区。数据区之间的内容可以是html或者普通文本(参考下列代码)关键是所有文本内容都是用 base64编码重新编排过,所以要用decode_base64解开才能读取。
f !text.isEmpty {body += "--\(boundary)\r\nContent-Type: text/plain charset=UTF-8 format=flowed\r\n\r\n\(text)\r\n\r\n"
}
if !content.isEmpty {
body += "--\(boundary)\r\nContent-Type: text/htmlcharset=UTF-8\r\n\r\n\(content)\r\n\r\n"
}
直接去解析是比较费劲的,因为其实整个编码都是采用了http传输协议的 mime 方式。建议用现成的开源代码去读去,比如CHTTPParser,速度快,效率高,都已经通过几十年检验了的成熟代码。
c++实现的 一行里只能有一个mail地址#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std
void main()
{
CString a
char Line[250000] = {0}
FILE *fpFile = NULL
FILE *fpFiletemp = NULL
fpFile = fopen( "C:\\123.htm" , "r+")
if (NULL == fpFile)
{
//error
}
while( fgets( Line, 250000, fpFile ) != NULL)
{
a = Line
a.TrimLeft()
a.TrimRight()
int Posi = 0
Posi=a.Find('@')
if (-1 != Posi)
{
CString website
website = a.Right(strlen(a) - Posi)
int PosiWebsit = 0
PosiWebsit = website.Find("com")
if (-1 != PosiWebsit)
{
CString website1
CString Mailadd
CString Mailadd1
Mailadd =a.Left(Posi)
website1 = website.Left(PosiWebsit)
int PosiMailadd = 0
PosiMailadd = Mailadd.ReverseFind(_T(' '))
if (-1 != PosiMailadd)
{
Mailadd1 = Mailadd.Right(strlen(Mailadd) - PosiMailadd)
}
else
{
Mailadd1 = Mailadd
}
CString com = ("com")
CString mail = Mailadd1 +website1 + com
fpFiletemp = fopen("C:\\temp.txt","w+")
if (NULL == fpFiletemp)
{
//error
}
fputs(mail, fpFiletemp)
fputs("\n", fpFiletemp)
//fpFiletemp = NULL
}
}
}
fclose(fpFile)
fclose(fpFiletemp)
}
域名解析的过程是,根据字符串找到对应的ip地址,例如字符串“www.baidu.com”对应的IP是61.135.169.105。域名无法解析的意思就是根据你提供的字符串找不到对应的ip地址。
你可以检查一下163的smtp的服务器是不是'smtp.ym.163.com',还是'smtp.163.com'。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)