在Linux下使用C++发送中文邮件,而用outlook接收是乱码

1.在Linux下用fstream读取内容为中文的文件,存放在string类中
2.在string字符串中,对其进行查找,插入,替换,追加等操作
3.把处理好的string字符串,使用smtp协议来发送邮件
4.windows机器使用outlook来接收邮件,发现正文内容有几处乱码
继续对string类做个测试:
string text;
for(int i = 0 ; i < 1000; i++)
{
          text.append("我");
}
sendMail(text);
windows机器用outlook接收的邮件如下:
鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜
鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜鎴戞垜
可见中间突然换行了。可能是linux下的string与linux的编码处理不够兼容(或者是windows换行是\r\n,linux是\n)。执行string.append()时,string类发现空间不够用,就会向操作系统请求更大的内存,复制内容到新内存,释放原有内存,在这个过程中导致了乱码。
解决方法:
1.在windows下使用记事本编辑文件内容,保存为utf-8编码格式
2.使用samba共享把文件传到Linux机器上
3.在linux使用C读入文件内容到缓存中char*
4.在char*的缓存中,对其进行查找,插入,替换,追加等操作
5.把处理好的char*缓存,转换成string类(string context(char*))使用smtp协议来发送邮件(sendMail(context))
6.windows机器使用outlook来接收邮件,发现中文正文无乱码


因工作需要在Linux环境中用C++编写个发送邮件的程序,着实费了点周折,最终得以满意解决,现将历程与成果与大家分享! 一、刚开始网上一通逛搜,发现Linux环境下,发邮件使用较多的方法是libesmtp包,网上也有示例,按照相关章的指引,很容易就实现的邮件发送,但问题是不知道如何实现SSL。 二、发现libesmtp文件中有个smtp_starttls_set_ctx接口,似乎是可以解决ssl问题的,逛搜libesmtp解决SSL发送邮件的解决办法,几乎无任何信息,后来下载了个libesmtp的源代码包libesmtp-1.0.6.tar.bz2,内含examples示例目录,可以直接编译成功,但似乎是只支持tls邮件发送,而不支持ssl邮件发送,百思不得其解。 三、接着寻找别的解决办法,在CSDN搜到一个csmtp说可以解决SSL邮件发送问题的资源,但下载需要50积分,说心里话能解决问题50积分也是值得的,但没有呀,提供资源者还比较仁义,告知资来源于https://www.codeproject.com,于是乎在codeproject找到了csmtp的资源,有两个版本,v2.4版本包CSmtp_v2_4_ssl.zip,v1.8版本分为window(CSmtp_v1_8a.zip)和linux(CSmtp_v1_8b.zip)两个包。 四、为了能省点精力,就直接用版较低的linux版吧,解压后发现有makefile文件,可直接编译通过,一般的邮件发送成功,但可惜的是v1.8版本也不支持ssl协议。 五、其实从包的名字上就能看出来v2.4版本开始支持 ssl协议,但v2.4并不分windows版本和linux版本,是否能支持linux呢,查看源代码发现有对linux的支持,只是包内没有makefile文件,似乎没有在linux目录下编译过,于是编写了个makefile文件尝试编译,竞然编通过,而且发送文件成功,经过测试可以支持ssl邮件发送,因暂无需求tls未做测试。 六、现将程序重新打包成csmtp_v2.4_linux.tar文件,与大家分享,文中所提到的相关资源包都一并打包到资源中了。 最后感谢原创christopher w. backen提供的代码资源!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值