用 TclApp 包装程序会导致 smtp 包停止正常工作?

Wrapping program with TclApp causes smtp package to stop working properly?

所以我在尝试使用 Tcl 从我公司的本地邮件服务器发送电子邮件时遇到了一个奇怪的问题。问题是我已经编写了可以运行的代码,但是当我用 TclApp 包装它时它就不起作用了。我相信我已经包含了所有必要的包。

代码:

package require smtp;
package require mime;
package require tls;

set body "Hello World, I am sending an email! Hear me roar.";

#mime info
set token [mime::initialize -canonical text/plain -string $body];

#mail options
set opts {};

#MAIL SERVER + PORT
lappend opts -servers "my_server";
lappend opts -ports 25;

tls::init -tls1 1;
lappend opts -username "someEmail@example.com";
lappend opts -password "somePasswordExample";

#SUBJECT + FROM + TO 
lappend opts -header [list "Subject" "This is a test e-mail, beware!!"];
lappend opts -header [list "From" "theFromEmail@example.com"];
lappend opts -header [list "To" "theToEmail@yahoo.com"]; 

if {[catch {
    smtp::sendmessage $token \
    {*}$opts \
    -queue false \
    -atleastone false \
    -usetls false \
    -debug 1;

    mime::finalize $token;

 } msg]} {
    set out [open "error_log.txt" w];
    puts $out $msg;
    close $out;
}

puts "Hit enter to continue...";
gets stdin;
exit;

这在我 运行 它时有效并且我成功地收到了电子邮件。 但是当我包装它时,它没有。这是包装和执行程序后的输出:

无论出于何种原因,用 TclApp 包装都会使我的程序无法进行身份验证。

*更新:我决定尝试用 Freewrap 包装脚本,看看我是否遇到同样的问题,令人惊讶的是我没有。如果脚本未包装或被 Freewrap 包装,则脚本有效,但 TclApp 无效;这是 TclApp 中的错误还是我只是遗漏了一些明显的东西?

看来这是个老问题了(最后post):https://community.activestate.com/forum/wrapping-package-tls151

  1. 调查打包后的版本是否有相同的.dll 您链接的文章中的依赖项。
  2. 查看 TCL Wiki 以查看这是否是一个已知问题 (TCL 维基 ).
  3. 包装时您是否正确初始化环境(TCL 应用初始化)?

我已经找到并解决了我的问题!希望这个答案能帮助 运行 遇到同样问题的其他人。


我联系了 ActiveState,他们为我指明了正确的方向 - this link ActiveState 论坛上的一个帖子讨论了类似的问题。

我决定 运行 我一直用来将我的程序包装在 TclApp 中的前缀文件 - 我正在使用 base-tk8.6-thread-win32-ix86。 运行 这会打开一个 console/Tcl 解释器,它允许我尝试手动获取我的 Tcl 电子邮件脚本,我发现 前缀 file/interpreter 本身完全没有意识到我系统上任何包的位置 并且我需要附加到 auto_path 我想要的包的位置。此外,我从线程中发现我正在使用的电子邮件脚本需要我没有包含的其他依赖项。即 sha1, SASL, and otp 在他们自己的依赖项中。当我获得这些依赖项时,我的脚本通过 base-tk8.6-thread-win32-ix86 解释器工作,随后通过我的包装程序工作。

另一个线索表明,经过一些研究后这些依赖关系是必要的,我的脚本会给我一个 530: 5.5.1 Authentication Required. 我后来了解到 SASL 解决了这个问题 - 但我对网络一无所知,所以我不会猜对了

我学到的另一件事是 teacup getteacup install 之间有明显的区别,这就是为什么我没有正确安装 Tcl 包并且 TclApp 不知道 SASL、sha1 或 otp .

我不明白的是,也许对这些程序有更深入了解的人可以告诉我,Wish86 是如何知道脚本的包依赖关系并知道在哪里可以找到它们的?直到我尝试在 TclApp 中查找包,我才意识到我的系统上什至没有 sha1、SASL 等,也没有在我的脚本顶部包含它们的 package require 命令,然而Wish86 可以完美执行我的脚本。令人沮丧的是,如果没有神奇的 Wish86 解释器让一切正常运行,就很难知道您是否满足了系统的所有依赖性要求(笑)

看完本帖末尾,我发现有一个关于TclApp去寻找项目中的硬依赖和软依赖的深度的讨论。


编辑:添加了更多信息。