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

Magento中出现Call to a member function getFormattedAddress()错误求助

Magento发送邮件报错:Call to a member function getFormattedAddress() on string

运行下方代码时触发错误,错误栈指向vendor/magento/module-email/Model/AbstractTemplate.php:

if ($sendingDays === $this->scopeConfig->getValue(self::PROP_LAST_DAY_REMINDER, ScopeInterface::SCOPE_STORE)) {

    $emailTemplateId = $this->scopeConfig->getValue(self::PROP_FINAL_RENEWAL_TEST_EMAIL_TEMPLATE, ScopeInterface::SCOPE_STORE);
} else {
    $emailTemplateId = $this->scopeConfig->getValue(self::PROP_RENEWAL_TEST_EMAIL_TEMPLATE, ScopeInterface::SCOPE_STORE);
}

$sender = [
    'name' => $this->scopeConfig->getValue(self::PROP_CONFIG_ADMIN_FROM_NAME, ScopeInterface::SCOPE_STORE),
    'email' => $this->scopeConfig->getValue(self::PROP_CONFIG_ADMIN_FROM_EMAIL, ScopeInterface::SCOPE_STORE)
];

$data = [
    'firstname' => $renewData['firstname'],
    'lastname' => $renewData['lastname'],
    'renewalurl' => $renewalUrl,
    'sendingdays' => $sendingDays,
    'store' => $renewData['store_name'],
    'propUrl' => $this->storeManager->getStore($storeId)->getBaseUrl() . 'prop'
];

$renewalEmailAttempt += 1;
try {
    $transport = $this->transportBuilder
        ->setTemplateIdentifier($emailTemplateId)
        ->setTemplateOptions([
                                 'area' => Area::AREA_FRONTEND,
                                 'store' => $storeId
                             ])
        ->setTemplateVars($data)
        ->setFromByScope($sender, $this->storeManager->getStore()->getId())
        ->addTo($this->scopeConfig->getValue(self::PROP_RENEWAL_TEST_MODE, ScopeInterface::SCOPE_STORE)
                    ? $this->scopeConfig->getValue(self::PROP_RENEWAL_TEST_EMAIL_RECEPIENT, ScopeInterface::SCOPE_STORE)
                    : $emailAddress)
        ->getTransport();

    $transport->sendMessage();
} catch (\Exception $e) {
    $this->_logger->error('Error sending  renewal emails: ' . $renewData['id'] . ' ' . $e->getMessage());
}

错误原因

这个错误的核心是:代码调用getFormattedAddress()方法时,当前对象被意外替换成了字符串。在Magento的邮件发送逻辑中,setFromByScope方法期望第一个参数是后台配置的发送者标识(如'general'),或者是包含合法name和email的数组,但如果你的配置项self::PROP_CONFIG_ADMIN_FROM_NAME或self::PROP_CONFIG_ADMIN_FROM_EMAIL未正确配置,返回了空字符串或无效值,后续处理时就会将字符串当作对象调用方法,触发报错。

解决方案

  1. 检查后台配置
    登录Magento后台,确认self::PROP_CONFIG_ADMIN_FROM_NAME和self::PROP_CONFIG_ADMIN_FROM_EMAIL对应的配置项已正确填写,确保返回值不为空且格式合法(邮箱需符合标准格式)。

  2. 添加参数校验
    在构建$sender数组后,添加校验逻辑,避免空值进入邮件发送流程:

    $sender = [
        'name' => $this->scopeConfig->getValue(self::PROP_CONFIG_ADMIN_FROM_NAME, ScopeInterface::SCOPE_STORE),
        'email' => $this->scopeConfig->getValue(self::PROP_CONFIG_ADMIN_FROM_EMAIL, ScopeInterface::SCOPE_STORE)
    ];
    
    // 新增校验
    if (empty(trim($sender['name'])) || !filter_var($sender['email'], FILTER_VALIDATE_EMAIL)) {
        $this->_logger->error('Invalid sender configuration: name or email is invalid');
        return; // 终止邮件发送流程
    }
    
  3. 改用配置标识传参
    如果后台已经配置了发送者标识(如在Stores > Configuration > General > Store Email Addresses中设置的标识),可以直接传标识给setFromByScope,替代手动构建数组:

    // 替换原$sender数组和setFromByScope调用
    ->setFromByScope('general', $this->storeManager->getStore()->getId())
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:19:59