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

如何在VSTO插件中获取当前查看的Outlook邮件正文并转为字符串

获取Outlook当前查看邮件的正文并传给Python脚本

嘿,我来帮你解决这个问题!在VSTO里获取当前阅读的邮件正文其实没那么复杂,关键是要覆盖Outlook里两种常见的“阅读场景”——单独打开的邮件窗口,以及主界面阅读窗格里显示的选中邮件。下面一步步来:

第一步:获取当前活动的MailItem对象

首先得拿到用户正在看的那封邮件对应的MailItem实例,代码可以这么写:

using Outlook = Microsoft.Office.Interop.Outlook;
using System.Runtime.InteropServices;

public Outlook.MailItem GetCurrentReadingMail()
{
    Outlook.MailItem currentMail = null;

    // 先检查是否有单独打开的邮件窗口(Inspector)
    var activeInspector = Globals.ThisAddIn.Application.ActiveInspector();
    if (activeInspector != null && activeInspector.CurrentItem is Outlook.MailItem)
    {
        currentMail = activeInspector.CurrentItem as Outlook.MailItem;
    }
    else
    {
        // 没有单独窗口的话,看主界面(Explorer)选中的邮件
        var activeExplorer = Globals.ThisAddIn.Application.ActiveExplorer();
        if (activeExplorer != null && activeExplorer.Selection.Count > 0)
        {
            var selectedItem = activeExplorer.Selection[1]; // Outlook索引从1开始哦
            if (selectedItem is Outlook.MailItem)
            {
                currentMail = selectedItem as Outlook.MailItem;
            }
        }
    }

    return currentMail;
}

第二步:提取正文为字符串

拿到MailItem后,你有两种正文格式可选:

  • currentMail.Body:纯文本格式的正文,适合不需要保留格式的场景
  • currentMail.HTMLBody:HTML格式的正文,能保留原邮件的排版、样式

比如提取纯文本的话,一行代码搞定:

var mailBody = currentMail.Body;
// 要HTML的话就换成 var mailBody = currentMail.HTMLBody;

处理完邮件对象记得释放COM资源,避免内存泄漏:

Marshal.ReleaseComObject(currentMail);

第三步:把正文传给Python脚本

这里推荐两种方式,根据正文长度选:

方式1:直接作为命令行参数传递(适合短正文)

using System.Diagnostics;

public void SendToPython(string mailBody)
{
    string pythonExe = @"C:\Python39\python.exe"; // 换成你的Python路径
    string scriptPath = @"C:\YourScripts\mail_processor.py"; // 你的脚本路径

    // 注意转义特殊字符,避免命令行解析出错
    ProcessStartInfo startInfo = new ProcessStartInfo(pythonExe)
    {
        Arguments = $"\"{scriptPath}\" \"{mailBody.Replace("\"", "\\\"")}\"",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    };

    using (Process process = Process.Start(startInfo))
    {
        string output = process.StandardOutput.ReadToEnd();
        process.WaitForExit();
        // 这里可以处理Python脚本的输出,比如打印日志
        System.Diagnostics.Debug.WriteLine("Python返回结果:" + output);
    }
}

对应的Python脚本示例:

import sys

if __name__ == "__main__":
    if len(sys.argv) >= 2:
        mail_content = sys.argv[1]
        # 这里写你的处理逻辑,比如提取关键词、生成摘要等
        print(f"成功收到邮件正文,长度:{len(mail_content)}")

方式2:写入临时文件传递(推荐长正文)

如果邮件正文很长,命令行参数会有长度限制,用临时文件更稳妥:

using System.IO;

public void SendToPythonViaFile(string mailBody)
{
    string pythonExe = @"C:\Python39\python.exe";
    string scriptPath = @"C:\YourScripts\mail_processor.py";
    string tempFile = Path.GetTempFileName();

    // 把正文写入临时文件
    File.WriteAllText(tempFile, mailBody, Encoding.UTF8);

    ProcessStartInfo startInfo = new ProcessStartInfo(pythonExe)
    {
        Arguments = $"\"{scriptPath}\" \"{tempFile}\"",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    };

    using (Process process = Process.Start(startInfo))
    {
        string output = process.StandardOutput.ReadToEnd();
        process.WaitForExit();
        System.Diagnostics.Debug.WriteLine("Python返回结果:" + output);
        // 用完删除临时文件
        File.Delete(tempFile);
    }
}

对应的Python脚本读取临时文件:

import sys
import os

if __name__ == "__main__":
    if len(sys.argv) >= 2:
        temp_file_path = sys.argv[1]
        if os.path.exists(temp_file_path):
            with open(temp_file_path, 'r', encoding='utf-8') as f:
                mail_content = f.read()
            # 处理逻辑...
            print(f"从临时文件读取到正文,长度:{len(mail_content)}")

小提醒

  • 确保你的VSTO项目已经引用了Microsoft.Office.Interop.Outlook程序集
  • 测试的时候记得处理GetCurrentReadingMail()返回null的情况(比如用户没选中任何邮件)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:34:46