精易论坛

标题: SSL 邮件发送模块优化与问题解决 + 修改后源码下载 [打印本页]

作者: gytxtx    时间: 2024-12-29 21:19
标题: SSL 邮件发送模块优化与问题解决 + 修改后源码下载
本帖最后由 gytxtx 于 2024-12-29 23:14 编辑

由于开发需要支持 SSL 加密的邮件发送模块,我尝试使用了以下源码:

https://www.eyuyan.la/post/15472.html

但效果并不理想,存在以下问题:



邮件内经常会出现一个幽灵文件(文件名:ATT00001;大小:0 B)

经过了查阅资料与询问 ChatGPT,我发现是因为源码中错误重复定义了 MIME 边界行,从而导致 Outlook 生成了幽灵文件。

解决效果:


并且经过我的测试,原代码在 花瓣邮箱 上发送的邮件末尾会出现乱码符号



解决办法:删除源码内置的精易模块代码,改为引用最新版的精易模块即可解决乱码符号问题

此外,本修改源码还修复了一些邮件头格式错误的问题,具体看下面的图片:



为什么要新增这个子程序
新增了一个子程序,用于按指定字符数自动插入换行符,以确保邮件正文和附件编码的格式符合 SMTP 协议,提高兼容性并避免邮件解析问题。

在本修改代码中的具体应用
该子程序主要用于处理邮件正文和附件的 Base64 编码,将长文本按 76 字符插入换行符,满足 SMTP 协议对每行长度的要求,从而确保邮件内容能被服务器正确解析并展示。

  
子程序名返回值类型公开备 注
间隔几个字符就换行文本型 
参数名类 型参考可空数组备 注
数据文本型
间隔字符数整数型
变量名类 型静态数组备 注
返回数组文本型0
成员数整数型 
n整数型 
临时文本文本型 
计次整数型 
成员数 = 文本_逐字分割 (数据, 返回数组)
计次循环首 (成员数, n)
临时文本 = 临时文本 + 返回数组 [n]
计次 = 计次 + 1
如果真 (计次 = 间隔字符数)
计次 = 0
临时文本 = 临时文本 + #换行符

计次循环尾 ()
返回 (临时文本)


请勿用于非法用途!否则后果自负!


Send 修改优化.e (1.12 MB, 下载次数: 102)

仅调用了精易模块
程序可能需要 OpenSSL 相关 DLL `ssleay32.dll`


参考 (来源于 ChatGPT)


为什么需要改进邮件发送模块?

在开发需要支持 SSL 加密的邮件发送功能时,我尝试使用以下源码:

https://www.eyuyan.la/post/15472.html


但源码存在以下问题:  



  1. 幽灵文件问题:邮件中会生成一个名为 ATT00001 的空文件(大小:0 B)。这是由于源码中 MIME 边界行的重复定义,导致 Outlook 解析错误。  

  2. 邮件尾部乱码:在测试花瓣邮箱时发现邮件末尾出现乱码符号,这是因为源码中调用了旧版精易模块,导致邮件格式不符合规范。




解决方案与优化成果  



  1. 修复幽灵文件问题:通过正确定义 MIME 边界行,消除了幽灵文件,确保邮件格式完整。  

  2. 修复尾部乱码问题:删除源码中旧版精易模块的相关代码,并改为引用最新版精易模块,解决了乱码符号问题。  

  3. 邮件头优化:修复了部分邮件头格式错误,改进兼容性和解析能力。  

  4. 新增功能:为了确保邮件正文和附件的 Base64 编码内容符合 SMTP 协议,新增了一个子程序 间隔几个字符就换行,将长文本按 76 字符插入换行符。




新增子程序:间隔几个字符就换行  



源码实现


.版本 2
.子程序 间隔几个字符就换行, 文本型
.参数 数据, 文本型
.参数 间隔字符数, 整数型
.局部变量 返回数组, 文本型, , "0"
.局部变量 成员数, 整数型
.局部变量 n, 整数型
.局部变量 临时文本, 文本型
.局部变量 计次, 整数型

成员数 = 文本_逐字分割 (数据, 返回数组)
.计次循环首 (成员数, n)
    临时文本 = 临时文本 + 返回数组 [zxsq-anti-bbcode-n]
    计次 = 计次 + 1
    .如果真 (计次 = 间隔字符数)
        计次 = 0
        临时文本 = 临时文本 + #换行符
    .如果真结束
.计次循环尾 ()
返回 (临时文本)

详细改动


修改内容说明  




  1. 修复 MIME 边界重复问题  



    • 在原代码中,每个附件都会重复添加边界行 --Separator,这会导致 MIME 边界定义不正确,生成邮件时可能导致附加文件异常。  

    • 修改后注释掉了这些多余的边界定义,保留最终的 --Separator--,以正确标记 MIME 结束。




  2. 删除冗余的 Content-ID 字段  



    • 原代码为每个附件添加了 Content-ID 字段,但在非嵌入式内容的情况下,Content-ID 是多余的。  

    • 删除这部分内容可以精简邮件头,同时避免部分客户Duan解析问题。




  3. 新增换行处理  



    • 原代码直接使用 编码_BASE64编码 方法对附件内容进行编码,但未处理 SMTP 协议要求的每行 76 字符的换行规则。  

    • 修改后,新增了换行处理逻辑,调用了子程序 间隔几个字符就换行,对 Base64 编码后的内容进行格式化处理,从而符合协议要求。




  4. 优化附件的 MIME 封闭行  



    • 在每个附件的 MIME 部分结束后,添加了 --Separator--,明确标识 MIME 消息结束位置。






具体修改后的代码分析  


以下是关键改动的解释:


1. MIME 边界优化


原代码


Header = Header + “--” + Separator + #换行符

修改后


' Header = Header + “--” + Separator + #换行符




2. 附件 Base64 编码处理


原代码


Header = Header + 编码_BASE64编码 (Att_ [zxsq-anti-bbcode-i].Body)

修改后


Header = Header + 编码_BASE64编码 (到字节集 (间隔几个字符就换行 (到文本 (Att_ [zxsq-anti-bbcode-i].Body), 76))) + #换行符




3. MIME 封闭行


原代码


Header = Header + “--” + Separator + #换行符

修改后


Header = Header + “--” + Separator + “--” + #换行符




整体改进效果  



  1. 修复了 MIME 边界定义的错误,消除了幽灵文件 ATT00001。  

  2. 遵循 SMTP 协议的每行 76 字符限制,提升邮件兼容性。  

  3. 消除冗余的邮件头信息,使邮件格式更精简、规范。




作者: gytxtx    时间: 2024-12-29 21:20
等一下,忘传源码了

作者: 艾玛克138    时间: 2024-12-29 21:23
宝贵经验啊,很值得学习
作者: yedou    时间: 2024-12-30 05:27

作者: lassgo    时间: 2024-12-30 05:39
感谢分享,很给力!继续努力哦~
作者: 豆豆灰常开心    时间: 2024-12-30 07:06
感谢分享,很给力!~
作者: 查过    时间: 2024-12-30 07:10
已经顶贴,感谢您对论坛的支持!
作者: qwe111qwe    时间: 2024-12-30 08:17
感谢分享!!!!
作者: wmv520    时间: 2024-12-30 10:37
支持开源~!感谢分享
作者: 烟染    时间: 2024-12-30 11:29
支持开源~!感谢分享
作者: 一指温柔    时间: 2024-12-30 11:53
#在这里快速回复#支持开源~!感谢分享
作者: pipicool    时间: 2024-12-30 14:35
学习一下
作者: kyo9766    时间: 2024-12-30 16:50
学习一下邮件发送,感谢分享
作者: renhe2018    时间: 2024-12-30 18:07
太强大了,支持。
作者: ttggnn    时间: 2024-12-30 20:08
        感谢分享,很给力!~
作者: 396384183    时间: 2024-12-30 20:23
已经顶贴,感谢您对论坛的支持!
作者: 深圳梦    时间: 2024-12-30 20:55
支持开源~!感谢分享
作者: 豆豆灰常开心    时间: 2024-12-31 07:15
下个学习一下
作者: 查过    时间: 2024-12-31 07:20
感谢分享,很给力!~
作者: wuqingg    时间: 2024-12-31 09:35
支持开源~!感谢分享
作者: please    时间: 2024-12-31 09:36
感谢分享,支持开源!!!
作者: bianyuan456    时间: 2024-12-31 18:00
已经顶贴,感谢您对论坛的支持!
作者: 杨明煜    时间: 2025-1-1 09:27
感谢分享,真好!......
作者: cunanhai    时间: 2025-1-1 14:38
我从QQ安装目录复制出来ssleay32.dll,放到源码同目录 他说  --------------------------- 错误 --------------------------- 运行时出错!    错误信息:无法找到指定DLL库文件“ssleay32.dll”中的输出命令“SSL_library_init”    0, 0   --------------------------- 确定    ---------------------------
作者: gytxtx    时间: 2025-1-1 14:39
cunanhai 发表于 2025-1-1 14:38
我从QQ安装目录复制出来ssleay32.dll,放到源码同目录 他说  --------------------------- 错误 ----------- ...

从网上下载一个试试
作者: cunanhai    时间: 2025-1-1 14:43
cunanhai 发表于 2025-1-1 14:38
我从QQ安装目录复制出来ssleay32.dll,放到源码同目录 他说  --------------------------- 错误 ----------- ...

网上下载的也报这个,我这系统真TM见鬼了..
作者: cunanhai    时间: 2025-1-1 14:50
gytxtx 发表于 2025-1-1 14:39
从网上下载一个试试

从华军下载了,还是这样,估计是我系统哪里出问题了...
作者: 515667395    时间: 2025-1-1 15:04
多谢分享
作者: lm88818    时间: 2025-1-2 09:16
感谢分享,支持开源!!!
作者: 想学易语言    时间: 2025-1-2 20:39
咱也不懂,先下载了再说
作者: u42474    时间: 2025-1-5 13:01
Mailer.SendMail  大佬请问这里发送 就直接闪退是为什么
作者: u42474    时间: 2025-1-8 08:58
大佬执行到发送那个命令会直接闪退是为啥哈
作者: 皮皮君    时间: 2025-1-9 20:36
请勿用于非法用途!否则后果自负!
作者: 低吟浅唱sky    时间: 2025-2-3 23:24
谢谢分享
作者: 530278137    时间: 2025-2-15 15:07
666666666666666666
作者: yushizhuo    时间: 2025-3-2 07:11
666666666666666666666666666666666




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4