本帖最后由 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, 下载次数: 97)
仅调用了精易模块
程序可能需要 OpenSSL 相关 DLL `ssleay32.dll`
参考 (来源于 ChatGPT)
为什么需要改进邮件发送模块?
在开发需要支持 SSL 加密的邮件发送功能时,我尝试使用以下源码:
https://www.eyuyan.la/post/15472.html
但源码存在以下问题:
- 幽灵文件问题:邮件中会生成一个名为
ATT00001 的空文件(大小:0 B)。这是由于源码中 MIME 边界行的重复定义,导致 Outlook 解析错误。
- 邮件尾部乱码:在测试花瓣邮箱时发现邮件末尾出现乱码符号,这是因为源码中调用了旧版精易模块,导致邮件格式不符合规范。
解决方案与优化成果
- 修复幽灵文件问题:通过正确定义 MIME 边界行,消除了幽灵文件,确保邮件格式完整。
- 修复尾部乱码问题:删除源码中旧版精易模块的相关代码,并改为引用最新版精易模块,解决了乱码符号问题。
- 邮件头优化:修复了部分邮件头格式错误,改进兼容性和解析能力。
- 新增功能:为了确保邮件正文和附件的 Base64 编码内容符合 SMTP 协议,新增了一个子程序 间隔几个字符就换行,将长文本按 76 字符插入换行符。
新增子程序:间隔几个字符就换行
- 用途:按指定字符数自动插入换行符,确保邮件内容格式符合 SMTP 协议,提高兼容性并避免因长行内容导致的解析问题。
- 应用场景:
- 邮件正文:将 HTML 或纯文本编码后,按照协议要求进行换行处理。
- 附件处理:对 Base64 编码的附件内容分段,避免超过每行 76 字符的限制。
源码实现:
.版本 2
.子程序 间隔几个字符就换行, 文本型
.参数 数据, 文本型
.参数 间隔字符数, 整数型
.局部变量 返回数组, 文本型, , "0"
.局部变量 成员数, 整数型
.局部变量 n, 整数型
.局部变量 临时文本, 文本型
.局部变量 计次, 整数型
成员数 = 文本_逐字分割 (数据, 返回数组)
.计次循环首 (成员数, n)
临时文本 = 临时文本 + 返回数组 [n]
计次 = 计次 + 1
.如果真 (计次 = 间隔字符数)
计次 = 0
临时文本 = 临时文本 + #换行符
.如果真结束
.计次循环尾 ()
返回 (临时文本)
详细改动
修改内容说明
-
修复 MIME 边界重复问题
- 在原代码中,每个附件都会重复添加边界行
--Separator ,这会导致 MIME 边界定义不正确,生成邮件时可能导致附加文件异常。
- 修改后注释掉了这些多余的边界定义,保留最终的
--Separator-- ,以正确标记 MIME 结束。
-
删除冗余的 Content-ID 字段
- 原代码为每个附件添加了
Content-ID 字段,但在非嵌入式内容的情况下,Content-ID 是多余的。
- 删除这部分内容可以精简邮件头,同时避免部分客户Duan解析问题。
-
新增换行处理
- 原代码直接使用
编码_BASE64编码 方法对附件内容进行编码,但未处理 SMTP 协议要求的每行 76 字符的换行规则。
- 修改后,新增了换行处理逻辑,调用了子程序
间隔几个字符就换行 ,对 Base64 编码后的内容进行格式化处理,从而符合协议要求。
-
优化附件的 MIME 封闭行
- 在每个附件的 MIME 部分结束后,添加了
--Separator-- ,明确标识 MIME 消息结束位置。
具体修改后的代码分析
以下是关键改动的解释:
1. MIME 边界优化
原代码:
Header = Header + “--” + Separator + #换行符
修改后:
' Header = Header + “--” + Separator + #换行符
- 注释掉每个附件的多余边界定义,仅保留必要的 MIME 边界行,避免生成多余的边界标记。
2. 附件 Base64 编码处理
原代码:
Header = Header + 编码_BASE64编码 (Att_ [i].Body)
修改后:
Header = Header + 编码_BASE64编码 (到字节集 (间隔几个字符就换行 (到文本 (Att_ [i].Body), 76))) + #换行符
- 新增换行逻辑:调用子程序
间隔几个字符就换行 ,将编码后的附件内容格式化为符合 SMTP 要求的每行 76 字符的规范格式。
3. MIME 封闭行
原代码:
Header = Header + “--” + Separator + #换行符
修改后:
Header = Header + “--” + Separator + “--” + #换行符
- 为 MIME 消息部分明确添加结束标记
--Separator-- ,以符合 MIME 协议规范,确保邮件内容完整。
整体改进效果
- 修复了 MIME 边界定义的错误,消除了幽灵文件
ATT00001 。
- 遵循 SMTP 协议的每行 76 字符限制,提升邮件兼容性。
- 消除冗余的邮件头信息,使邮件格式更精简、规范。
|