jjzjj

smtp - Golang smtp.SendMail 阻塞

coder 2023-06-26 原文

我尝试在 go 程序中使用 smtp.SendMail()。 但是它会阻塞并且在超时之前不会返回。 这使我无法找出问题所在。

我的代码:

to := []string{"recepient@example.com"}
err := smtp.SendMail("smtp.web.de:25", smtp.CRAMMD5Auth("example@web.de", "password"), "example@web.de", to, []byte("hi"))
if err != nil {
    fmt.Println(err)
}else{
    fmt.Println("Success")
}

很长一段时间后,我收到以下错误:

dial tcp 213.165.67.124:25: connection timed out

有什么想法可能是真正的问题吗?

最佳答案

SendMail 拨号smtp 服务器使用非tls tcp 连接,可能你的smtp 服务器默认使用tcp 连接ssl,不支持STARTTLS 扩展。客户端发送 STARTTLS commond,服务器不会回复,所以现在是阻塞的。

func SendMail(addr string, a Auth, from string, to []string, msg []byte) error {
    ......

    if ok, _ := c.Extension("STARTTLS"); ok {
        config := &tls.Config{ServerName: c.serverName}
        if testHookStartTLS != nil {
            testHookStartTLS(config)
        }
        if err = c.StartTLS(config); err != nil {
            return err
        }
    }
    ......
}

现在你可以使用 tls 访问 smtp 服务器并且这不是阻塞的,详情参见 example code , 或者使用非 tls 端口。

// SendMailTLS connects to the server at addr, default use TLS
func SendMailTLS(addr string, auth smtp.Auth, from string, to []string, msg []byte) error {
    ......
    tlsconfig := &tls.Config{ServerName: host}
    if err = validateLine(from); err != nil {
        return err
    }
    ......
    conn, err := tls.Dial("tcp", addr, tlsconfig)
    if err != nil {
        return err
    }
    defer conn.Close()
    c, err := smtp.NewClient(conn, host)
    ......

关于smtp - Golang smtp.SendMail 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19210842/

有关smtp - Golang smtp.SendMail 阻塞的更多相关文章

  1. ruby - IO::EAGAINWaitReadable:资源暂时不可用 - 读取会阻塞 - 2

    当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab

  2. ruby - 如何使用 ruby​​ fibers 避免阻塞 IO - 2

    我需要将目录中的一堆文件上传到S3。由于上传所需的90%以上的时间都花在了等待http请求完成上,所以我想以某种方式同时执行其中的几个。Fibers能帮我解决这个问题吗?它们被描述为解决此类问题的一种方法,但我想不出在http调用阻塞时我可以做任何工作的任何方法。有什么方法可以在没有线程的情况下解决这个问题? 最佳答案 我没有使用1.9中的纤程,但是1.8.6中的常规线程可以解决这个问题。尝试使用队列http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html查看文

  3. ruby - 无法通过 SMTP 使 ActionMailer 与 MS Exchange 一起工作 - 2

    这是我的简单测试程序(使用ActionMailer3.0.8,Ruby1.9.2p180MacOSX):require'rubygems'require'action_mailer'ActionMailer::Base.delivery_method=:smtpActionMailer::Base.smtp_settings={:address=>"my_exchange_server",:port=>25,:domain=>'my_domain.org',:authentication=>:login,:user_name=>'my_user',:password=>'my_pass

  4. Ruby Net::SMTP - 使用密件抄送发送电子邮件:收件人 - 2

    我想使用RubyNet::SMTP发送电子邮件。例行公事send_message(msgstr,from_addr,*to_addrs)在我的发送电子邮件的代码中运行良好,但从这个API中不清楚如何将电子邮件发送给需要盲抄的人员列表(bcc:)。我是不是遗漏了什么,或者Net::SMTP是不可能的? 最佳答案 send_message的to_addrs参数指定信封地址。在to_addrs中包含地址对包含在邮件header中的收件人地址和抄送地址没有影响。要密件抄送收件人,请将地址包含在to_addrs参数中,但不要将其包含在msgs

  5. ruby 非阻塞行读取 - 2

    我正在尝试以非阻塞方式从io中读取一行。不幸的是readlineblock。我想我可以用read_nonblock解决这个问题,并在其中存储部分结果的附加缓冲区,检查缓冲区中是否有多行等。但是对于像这样的简单任务来说似乎有点复杂.有更好的方法吗?注意:我正在使用事件多路分解(select)并且我对此很满意,我不想创建线程,使用EventMachine等... 最佳答案 我认为read_nonblock解决方案可能是可行的方法。简单但不是最高效的猴子补丁版本:classIOdefreadline_nonblockrlnb_buffer

  6. ruby-on-rails - 了解为什么 ruby​​ 进程在 100% CPU 时阻塞的方法 - 2

    我们有一个大型Rails应用程序,几天后,我们的ruby​​进程似乎陷入循环并占用100%的CPU,直到乘客服务器死机并引发502错误。您知道找出原因的最佳方法吗?我已经尝试过NewRelic,但它只是性能方面的东西,而且我们的错误太多了,无法猜测问题出在哪里。(我们每天有很多请求和很多UTF-8BSON错误,因为我们使用的是UTF-8url)使用:Rails3.2.6和Ruby1.9.2p290乘客3.0.13MongoDB2.0.1和Mongoid2.4.11NginxFreeBSD8.2 最佳答案 找出ruby卡住位置的简便方

  7. ruby - 在没有安装/运行 SMTP 服务器的情况下使用 Ruby 发送电子邮件? - 2

    在Mac上,我可以使用命令mail从命令行发送电子邮件,但我的MacBookPro上肯定没有安装SMTP服务器。那么,可以在没有SMTP服务器的情况下使用Ruby发送电子邮件吗?我不关心速度,我只想要一种无需额外软件即可发送电子邮件的方式。 最佳答案 您可以从您的Ruby代码中调用mail命令。使用system或反引号或诸如open3之类的更复杂的东西来与系统命令交互...这里是对不同方法的一个很好的概述:http://mentalized.net/journal/2010/03/08/5_ways_to_run_commands_

  8. ruby - 在 Ruby 中执行非阻塞 I/O 的首选方式是什么? - 2

    如果说我想检索一个网页进行解析,但在I/O发生时不阻塞CPU。是否有与Python的Eventlet库等效的东西? 最佳答案 Ruby的最佳HTTP客户端库是Typhoeus,它可用于以非阻塞方式并行执行多个HTTP请求。有阻塞和非阻塞接口(interface):#blockingresponse=Typhoeus::Request.get("http://stackoverflow.com/")putsresponse.body#non-blockingrequest1=Typhoeus::Request.new("http://

  9. Ruby 通过 gmail smtp 发送邮件 - 2

    我正在创建一个ruby​​脚本来检查url的响应状态,如果它等于504,它会向另一个电子邮件地址发送一封邮件。出于某种原因,我得到这个:/usr/lib/ruby/1.9.1/net/smtp.rb:960:in'check_auth_response':534-5.7.14我quadra检查了身份验证数据,它们是有效的。也许代码中可能有问题:require'mail'options={:address=>"smtp.gmail.com",:port=>587,:user_name=>'',:password=>'',:authentication=>'plain',:enable_s

  10. ruby-on-rails - 尝试在 RoR 应用程序中发送电子邮件时遇到 SMTP 错误 - 2

    我一直在拼命尝试使用RoR中的ActionMailer类发送电子邮件,即使终端显示正在发送消息,它仍会返回此错误:et::SMTPAuthenticationError:534-5.7.14这是我的邮件程序类在app/mailers/my_mailer.rb中的样子:classMyMailer这是我的config/application.rb文件的样子:config.action_mailer.delivery_method=:smtpconfig.action_mailer.smtp_settings={address:'smtp.gmail.com',port:587,#domai

随机推荐