VB.Net使用Simple MAPI发送HTML格式邮件是否可行及低成本替代方案咨询
解决方案
首先先给你当前使用的Simple MAPI两个已知问题的临时修复方案:
- URL拆分问题:Simple MAPI默认传输纯文本内容时遵循RFC规范,超过76字符会自动折行,你可以将所有URL用尖括号包裹(比如
<https://example.com/path>),同时将URL单独作为一行放置,不要和其他文本拼接,绝大多数邮件客户端即使遇到折行的尖括号包裹URL,也能正确识别为可点击链接。 - 现有代码bug修正:你当前封装的
AddRecipientCC、AddRecipientBCC方法错误传入了howTo.MAPI_TO参数,改为对应MAPI_CC、MAPI_BCC即可正常添加抄送、密送人。
低成本HTML邮件实现方案(无需SMTP、无付费组件)
推荐你用生成EML文件调用默认客户端打开的方案,兼容99%的桌面邮件客户端,完全使用用户本地已配置的邮件账户,不需要任何额外配置,也不需要付费组件:
方案原理
EML是标准的邮件文件格式,所有桌面邮件客户端都支持直接打开EML文件进入编辑待发送状态,你只需要按规范生成带HTML内容的EML文件,调用系统默认程序打开即可,效果和MAPI弹出的编辑窗口完全一致。
实现代码示例
Imports System.Text Imports System.IO Imports System.Diagnostics Public Function SendHtmlEmailByEml(toAddr As String, subject As String, htmlBody As String, Optional attachPath As String = "") As Boolean Try ' 生成临时EML文件路径 Dim tempEmlPath As String = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() & ".eml") ' 构造EML内容 Dim emlContent As New StringBuilder() ' 邮件头 emlContent.AppendLine("To: " & toAddr) emlContent.AppendLine("Subject: " & subject) emlContent.AppendLine("MIME-Version: 1.0") emlContent.AppendLine("Content-Type: text/html; charset=utf-8") emlContent.AppendLine("X-Unsent: 1") ' 关键标识:标记为待发送邮件,客户端打开直接进入编辑模式 emlContent.AppendLine() ' HTML正文 emlContent.AppendLine(htmlBody) ' 写入文件 File.WriteAllText(tempEmlPath, emlContent.ToString(), Encoding.UTF8) ' 调用默认邮件客户端打开 Process.Start(New ProcessStartInfo(tempEmlPath) With {.UseShellExecute = True}) ' 记录日志 If Not UpdateUserLog(Now(), sUsername, "eMail to " & toAddr & " created in default mail client via EML") Then MessageBox.Show("Unable to update user log") End If Return True Catch ex As Exception If Not UpdateUserLog(Now(), sUsername, "eMail to " & toAddr & " *NOT* created, error: " & ex.Message) Then MessageBox.Show("Unable to update user log") End If Return False End Try End Function
方案优势
- 完全支持HTML格式正文、样式、可点击链接,不存在折行问题
- 兼容所有主流桌面邮件客户端(Outlook、Thunderbird、网易邮箱大师、Foxmail等)
- 不需要额外依赖,不需要SMTP配置,不需要付费组件
- 自动使用用户本地已配置的默认邮件账户,符合你IT部门预配置的要求
备选方案(用户环境均安装Outlook时使用)
如果你的用户终端都预装了Outlook,可以直接使用微软官方的Office Interop Outlook组件,免费且原生支持HTML正文:
- 项目中添加引用
Microsoft.Office.Interop.Outlook - 调用代码示例:
Public Function SendHtmlEmailByOutlook(toAddr As String, subject As String, htmlBody As String, Optional attachPath As String = "") As Boolean Try Dim outlookApp As New Microsoft.Office.Interop.Outlook.Application() Dim mailItem As Microsoft.Office.Interop.Outlook.MailItem = outlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem) mailItem.To = toAddr mailItem.Subject = subject mailItem.HTMLBody = htmlBody If Not String.IsNullOrEmpty(attachPath) Then mailItem.Attachments.Add(attachPath) End If mailItem.Display() ' 弹出编辑窗口,由用户手动发送 If Not UpdateUserLog(Now(), sUsername, "eMail to " & toAddr & " created in Outlook") Then MessageBox.Show("Unable to update user log") End If Return True Catch ex As Exception If Not UpdateUserLog(Now(), sUsername, "eMail to " & toAddr & " *NOT* created, error: " & ex.Message) Then MessageBox.Show("Unable to update user log") End If Return False End Try End Function
内容的提问来源于stack exchange,提问作者Tym
相关产品推荐
相关产品推荐

