You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB开发Windows服务发邮件 PDF附件变application_pdf.txt问题

VB.NET 发送PDF附件被重命名为application_pdf.txt问题修复

核心根因

代码存在两处不符合MIME邮件规范的问题,导致邮件网关/客户端无法识别正确的附件文件名,触发默认命名规则(将MIME类型的/替换为_,追加.txt后缀):

  • 二进制内容错误转字符串:读取PDF字节后逐字节用Chr()拼接为字符串的逻辑完全不适用于二进制文件。Chr()按UTF-16处理字符,逐字节拼接会破坏二进制流结构,且Attachment.CreateAttachmentFromString本身是为文本类附件设计的重载,处理二进制文件时会出现元数据识别异常。你之前在Gmail环境下未触发问题,仅因为Gmail网关兼容性较强,会自动补全缺失的元数据,其他SMTP服务商无此兼容逻辑就会触发重命名。
  • 附件元数据缺失:仅设置ContentDisposition.FileName不符合MIME规范,必须同步设置附件ContentType.Name属性,并为二进制附件指定Base64传输编码,否则网关会判定附件元数据缺失,自动生成默认文件名。

修复方案

不需要改动统一处理两种附件来源的架构,只需要将附件传递格式从字符串改为字节数组,补全附件必填元数据即可:

1. 修改文件读取逻辑,删除二进制转字符串的错误代码

原读取代码:

Dim attachBytes() As Byte = Nothing

attachBytes = My.Computer.FileSystem.ReadAllBytes(FileDir & "\" & msg.attachFile)
mailAttachFile = ""
For Each attbyt As Byte In attachBytes
  mailAttachFile &= Chr(attbyt)
Next

修改后直接传递字节数组,不要做字符串转换:

' 直接读取为字节数组,路径拼接建议用Path.Combine避免斜杠问题
Dim attachBytes() As Byte = My.Computer.FileSystem.ReadAllBytes(IO.Path.Combine(FileDir, msg.attachFile))

FTP场景下下载的附件也统一存为字节数组传入发送函数,即可实现发送层不感知附件来源的需求。

2. 修改附件创建逻辑,补全所有规范要求的元数据

原附件添加代码:

If attached <> "" And attachMIME <> "" And attachname <> "" Then
    mail.Attachments.Add(Attachment.CreateAttachmentFromString(attached, attachMIME))
    mail.Attachments.Last().ContentDisposition.FileName = attachname
End If

修改为通过内存流加载二进制附件,补全所有属性:

If attachBytes IsNot Nothing AndAlso attachBytes.Length > 0 AndAlso attachMIME <> "" AndAlso attachname <> "" Then
    ' 用内存流加载字节数组创建附件,适配二进制格式
    Dim attachStream As New IO.MemoryStream(attachBytes)
    Dim targetAttach As New Attachment(attachStream, attachname, attachMIME)
    ' 同步设置两处文件名属性,兼容所有邮件客户端解析规则
    targetAttach.Name = attachname
    targetAttach.ContentDisposition.FileName = attachname
    ' 二进制附件必须指定Base64传输编码
    targetAttach.TransferEncoding = Net.Mime.TransferEncoding.Base64
    mail.Attachments.Add(targetAttach)
End If

验证标准

修改后发出的邮件原始MIME中,附件段应包含如下规范头,即可彻底解决重命名问题:

Content-Type: application/pdf; name=Statement.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=Statement.pdf

内容的提问来源于stack exchange,提问作者droopsnoot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:27:23