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

Rails 7开发环境用SendGrid发邮件时TCP连接超时(超5秒)求助

Rails 7开发环境SendGrid邮件超时问题解决办法
  • 检查网络连通性
    先确认本地机器能正常访问SendGrid的SMTP服务器,在终端执行以下命令测试:

    telnet smtp.sendgrid.net 587
    # 或者用nc命令
    nc -zv smtp.sendgrid.net 587
    

    如果连接失败,说明是网络问题:可能是本地防火墙拦截了587端口、公司网络有代理限制,或者ISP屏蔽了该端口。需要调整防火墙规则、配置代理,或者联系网络管理员解决。
    如果使用代理,需要在SMTP配置中添加代理参数:

    ActionMailer::Base.smtp_settings = {
      # 其他现有配置
      :proxy => 'http://your-proxy-address:port' # 根据实际代理填写
    }
    
  • 验证SendGrid API Key有效性

    • 登录SendGrid后台,进入API Keys页面,确认你的API Key已开启Mail Send权限,没有的话重新创建一个包含该权限的Key。
    • 在Rails控制台中检查环境变量是否正确加载:
      rails c
      puts ENV['SENDGRID_API_KEY']
      
      确保输出的是完整的API Key,没有空格或截断。
  • 调整SMTP配置参数
    修改config/environments/development.rb中的SMTP设置:

    ActionMailer::Base.smtp_settings = {
      :user_name => 'apikey',
      :password => ENV['SENDGRID_API_KEY'],
      :domain => 'localhost', # 去掉端口号,或替换为你的实际域名
      :address => 'smtp.sendgrid.net',
      :port => 587,
      :authentication => :plain,
      :enable_starttls_auto => true,
      :open_timeout => 30, # 延长连接超时时间
      :read_timeout => 30  # 延长读取超时时间
    }
    

    可以尝试将:enable_starttls_auto改为:enable_starttls => true,强制启用STARTTLS协议。

  • 切换到SendGrid Ruby Gem发送邮件
    如果SMTP方式始终有问题,改用SendGrid官方Ruby Gem直接调用API:

    1. 在Gemfile中添加:
      gem 'sendgrid-ruby'
      
      执行bundle install安装。
    2. 修改邮件发送逻辑,示例代码:
      require 'sendgrid-ruby'
      include SendGrid
      
      class UserMailer < ApplicationMailer
        def welcome_email(user)
          from = Email.new(email: 'your-sender-email@example.com')
          to = Email.new(email: user.email)
          subject = '欢迎注册'
          content = Content.new(type: 'text/plain', value: '感谢您的注册!')
          mail = Mail.new(from, subject, to, content)
      
          sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
          response = sg.client.mail._('send').post(request_body: mail.to_json)
          Rails.logger.info "SendGrid API响应状态: #{response.status_code}"
        end
      end
      
  • 开发环境临时测试方案
    如果只是需要验证邮件内容,不想实际发送邮件,可以用本地邮件预览工具:

    1. 添加letter_opener_web到Gemfile的development组:
      gem 'letter_opener_web', group: :development
      
      执行bundle install。
    2. 在config/environments/development.rb中设置:
      config.action_mailer.delivery_method = :letter_opener_web
      
    3. 启动Rails服务后,访问http://localhost:3000/letter_opener即可查看所有发送的邮件。

内容的提问来源于stack exchange,提问作者Muhammad Kashif Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:35:16