如何在Windows中使用默认电子邮件程序打开预定义的电子邮件?

如何在Windows中使用默认电子邮件程序打开预定义的电子邮件?,windows,email,tcl,Windows,Email,Tcl,我正在寻找一种可能性,当用户单击tcl/Tk程序中的按钮时,生成预定义的邮件。到目前为止,我使用的是mailto-协议,但由于预定义消息的正文可能较长,因此消息可能会在某个点被剪切。因此,这不是真正的解决办法 到目前为止,我发现的所有替代方案都有一些缺点。那么,是否有可能满足以下要求 打开默认邮件程序,它可能是一个专有程序(不仅仅是Outlook或Thunderbird等标准程序) 创建(并打开)包含大量文本或附件的预定义消息 在当前版本(Windows 10)之前,应至少在Windows X

我正在寻找一种可能性,当用户单击tcl/Tk程序中的按钮时,生成预定义的邮件。到目前为止,我使用的是
mailto
-协议,但由于预定义消息的正文可能较长,因此消息可能会在某个点被剪切。因此,这不是真正的解决办法

到目前为止,我发现的所有替代方案都有一些缺点。那么,是否有可能满足以下要求

  • 打开默认邮件程序,它可能是一个专有程序(不仅仅是Outlook或Thunderbird等标准程序)

  • 创建(并打开)包含大量文本或附件的预定义消息

  • 在当前版本(Windows 10)之前,应至少在Windows XP上工作,并且用户权限非常有限

  • 必须能够使用tcl或C实现

仅仅在后台发送邮件并不是解决方案,因为它应该真正透明地显示发生了什么以及发送了哪些信息。。。
(我知道已经有很多关于类似主题的问题,但我还没有找到一个适合我的解决方案。)

应该可以通过使用在Windows上自动发送邮件

这是一个仅限Windows的解决方案

一个跨平台的解决方案应该在任何地方都适用,它使用包来构造消息并发送消息。两者都是“标准Tcl库”的一部分,
tcllib
,可在任何打包了Tcl的明智系统上使用

至于

仅仅在后台发送邮件并不是解决方案,因为它应该真正透明地显示发生了什么以及发送了哪些信息

我无法解析它。你可以试着重新表述一下吗


更新:

好吧,在重读标题之后,我想我完全无法理解问题的本质

如果所需的一切都是打开一封电子邮件,比如“一个包含MIME格式文本的文件代表一封电子邮件”,我认为这几乎是不可能的,因为为具有
mailto
方案的URI指定了一个“处理电子邮件的默认程序”

如果需要在Windows上生成一个默认邮件客户端,要求它打开一个窗口,让用户编写一封发送到预定义地址的电子邮件,则可以使用

exec [list rundll32.exe uri.dll,FileProtocolHandler "malto:$addr"]
其中,
addr
变量包含收件人的电子邮件地址

mailto:
uri允许指定消息正文(可能是您当前正在使用的),但它们(正确地)不允许指定要解释为消息的文件名,因此似乎无法使用预先生成的消息打开邮件客户端


更新#2:

好吧,也许我终于明白你说的“应该是真正透明的……”是什么意思了。你的意思是用户必须亲眼看到将发送什么,对吗?但是,仅仅通过向用户展示一个显示将发送哪些邮件的对话框窗口来模拟电子邮件客户端有什么错呢?我所见过的每一个具有类似功能的软件产品都使用这个功能。各种各样的微软和Mozilla产品在脑海中都是最明显的例子。他们只是给你提供了一个对话框来浏览将要发送的内容

请注意,即使用户在真正的邮件客户端中看到“将发送什么”,并用手点击“发送”,也不会阻止处理此消息的主机(通常至少两个)修改它,除非它是加密签名的消息(S/MIME格式)


你确定要走那么远吗?

很抱歉我的回复太晚了。但你的更新是对的。目前,我正在使用某种mailto协议,就像您在第一次更新中建议的那样,更准确地说:
eval exec[auto_execok start]$mailto
,在
$mailto
中使用一个典型的mailto字符串。对于“预定义消息”,我的意思是,消息已经包括标题、收件人、抄送、正文,。。。在我的mailto字符串中,所有这些都包括在内。但由于正文可能很长,正文可能会被截断。因此,我正在寻找替代方案。对于您的更新#2:由于用户可能在我们的程序中有敏感数据,问题是,他是否会信任给定的对话框。他可能会担心,如果程序中真的没有使用其他信息,而这些信息将被发送出去,那么他中断传输的可能性就会增加。通过打开他的默认邮件客户端,我们程序的敏感数据与电子邮件传输分离。@quarenjo,让用户将信息保存到他们选择的文件中(使用我们讨论过的对话框),通过
mailto:
URI打开邮件客户端,并要求客户端查看并附加该文件如何?这是半途而废,但总比什么都没有好。因为我的问题似乎没有简单的解决办法,这可能是一种妥协。我也这么想,现在如果邮件长度超过预设长度,我会弹出一个窗口,要求用户将邮件正文的文本复制到邮件中,这是由
mailto:
生成的。不过,我还是希望我能找到更好的解决方案。