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未正确配置,返回了空字符串或无效值,后续处理时就会将字符串当作对象调用方法,触发报错。
解决方案
检查后台配置
登录Magento后台,确认self::PROP_CONFIG_ADMIN_FROM_NAME和self::PROP_CONFIG_ADMIN_FROM_EMAIL对应的配置项已正确填写,确保返回值不为空且格式合法(邮箱需符合标准格式)。添加参数校验
在构建$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; // 终止邮件发送流程 }改用配置标识传参
如果后台已经配置了发送者标识(如在Stores > Configuration > General > Store Email Addresses中设置的标识),可以直接传标识给setFromByScope,替代手动构建数组:// 替换原$sender数组和setFromByScope调用 ->setFromByScope('general', $this->storeManager->getStore()->getId())
内容的提问来源于stack exchange,提问作者Mukesh
相关产品推荐
相关产品推荐

