【问题标题】:Set a different SMTP for Newsletter in Magento在 Magento 中为时事通讯设置不同的 SMTP
【发布时间】:2013-12-16 18:32:25
【问题描述】:

我想知道是否可以在 Magento 上设置两个不同的 SMTP 服务器:

一份用于时事通讯,一份用于 Magento 系统电子邮件。

我看到可以在 template.php 中设置 SMTP,但这会影响所有电子邮件。那么可能有两个不同的吗?

谢谢大家!!

附:

我试图修改文件 /app/code/core/Mage/Newsletter/Model/Template.php 正如帖子中所建议的: Magento - How enable SMTP server authentication and secure transport?

并以这种方式使用代码:

public function getMail()

 {
        if (is_null($this->_mail)) {
           /*Start of added code to specify config*/
           $my_smtp_host = 'smtp.mysmtp.com';  // Take it from Magento backoffice or you can specify it here
           $my_smtp_port = '587';    // Take it from Magento backoffice or you can specify it here

           $config = array(

                    'port' => $my_smtp_port, //optional - default 25
                    'auth' => 'login', 
                    'username' => 'mylogin@email.it',
                    'password' => 'mypassword'
                );

            $transport = new Zend_Mail_Transport_Smtp($my_smtp_host, $config);

            Zend_Mail::setDefaultTransport($transport);
            /*End of added code to specify config*/

            $this->_mail = new Zend_Mail('utf-8');
        }
        return $this->_mail;
    }

不幸的是使用系统 smtp 而不是使用这个。

我还评论了这两行:

ini_set('SMTP', Mage::getStoreConfig('system/smtp/host'));
ini_set('smtp_port', Mage::getStoreConfig('system/smtp/port'));

知道为什么仍在使用系统一吗?

【问题讨论】:

  • 首先,可能是因为Mage_Newsletter_Model_Template -> getMail() 不是修补的合适位置。提到的帖子做了一个错误的假设,答案忽略了它并指向使用 Ashley Shroeder 的模块。 Mage_Core_Model_Email_Template -> send()Mage_Newsletter_Model_Template -> send() 是设置邮件传输和发送邮件的位置。

标签: magento smtp newsletter


【解决方案1】:

邮件传输由这两个函数设置和执行

  1. Mage_Core_Model_Email_Template -> send() 在 /app/code/core/Mage/Core/Model/Email/Template.php 中用于事务性电子邮件
  2. Mage_Newsletter_Model_Template -> send() 在 /app/code/core/Mage/Newsletter/Model/Template.php 中用于时事通讯

这是我创建的工作模块代码,用于通过我们的电子邮件服务提供商引导事务性电子邮件它不是简报 send() 函数的粘贴!

请注意,您需要对额外的配置项进行硬编码,因为此代码示例缺少将字段添加到系统配置的设置,但它应该让您了解 send() 函数需要如何为时事通讯模块进行更改。我个人不使用 Newsletter 模块,因为我们有一个促销电子邮件服务提供商,以防止通过将我们的域错误地标记为垃圾邮件来源来毒害我们的域。

public function send($email, $name = null, array $variables = array())
{
    if (!$this->isValidForSend()) {
        Mage::logException(new Exception('This letter cannot be sent.')); // translation is intentionally omitted
        return false;
    }

    /* Set up mail transport to Email Hosting Provider SMTP Server via SSL/TLS */
    $config = array(
            'ssl'      => Mage::getStoreConfig('system/smtp/ssl'),      // option of none, ssl or tls
            'port'     => Mage::getStoreConfig('system/smtp/port'),     // TLS 587 - SSL 465 - default 25
            'auth'     => Mage::getStoreConfig('system/smtp/auth'),     // Auth type none, login, plain, CRAM-MD5
            'username' => Mage::getStoreConfig('system/smtp/username'),
            'password' => Mage::getStoreConfig('system/smtp/password')
        );

    /* Set up transport package to host */
    $transport = new Zend_Mail_Transport_Smtp(Mage::getStoreConfig('system/smtp/host'), $config);
    /* End transport setup */

    $emails = array_values((array)$email);
    $names = is_array($name) ? $name : (array)$name;
    $names = array_values($names);
    foreach ($emails as $key => $email) {
        if (!isset($names[$key])) {
            $names[$key] = substr($email, 0, strpos($email, '@'));
        }
    }

    $variables['email'] = reset($emails);
    $variables['name'] = reset($names);

    // ini_set('SMTP', Mage::getStoreConfig('system/smtp/host'));
    // ini_set('smtp_port', Mage::getStoreConfig('system/smtp/port'));

    $mail = $this->getMail();

    $setReturnPath = Mage::getStoreConfig(self::XML_PATH_SENDING_SET_RETURN_PATH);
    switch ($setReturnPath) {
        case 1:
            $returnPathEmail = $this->getSenderEmail();
            break;
        case 2:
            $returnPathEmail = Mage::getStoreConfig(self::XML_PATH_SENDING_RETURN_PATH_EMAIL);
            break;
        default:
            $returnPathEmail = null;
            break;
    }

    if ($returnPathEmail !== null) {
        $mailTransport = new Zend_Mail_Transport_Sendmail("-f".$returnPathEmail);
        Zend_Mail::setDefaultTransport($mailTransport);
    }

    foreach ($emails as $key => $email) {
        $mail->addTo($email, '=?utf-8?B?' . base64_encode($names[$key]) . '?=');
    }

    $this->setUseAbsoluteLinks(true);
    $text = $this->getProcessedTemplate($variables, true);

    if($this->isPlain()) {
        $mail->setBodyText($text);
    } else {
        $mail->setBodyHTML($text);
    }

    $mail->setSubject('=?utf-8?B?' . base64_encode($this->getProcessedTemplateSubject($variables)) . '?=');
    $mail->setFrom($this->getSenderEmail(), $this->getSenderName());

    try {
        /* Send Transport, empty and log success */
        $mail->send($transport); //transport object
        $this->_mail = null;
        Mage::log('Mailed to: ' . $this->getSenderEmail() . ' ' . $this->getSenderName() . ' ' .$this->getProcessedTemplateSubject($variables), null, 'email.log');
        /* End */
    }
    catch (Exception $e) {
        /* Or empty and log failure */
        $this->_mail = null;
        Mage::log('Failure: ' . $e, null, 'email.log');
        Mage::logException($e);
        return false;
        /* End */
    }

    return true;
}

【讨论】:

  • 我试图阅读您的代码,但找不到有关设置不同 smtp 服务器的部分,一个用于交易电子邮件,另一个用于电子邮件通讯。
  • 事务性电子邮件和时事通讯使用不同的类来包含它们的 send() 函数。有关它们的位置和用途的附加信息,请参阅答案顶部。除非您花时间在 config 中构建管理后端以输入单独服务器的配置设置,否则您可以简单地对 Newsletter 的配置设置进行硬编码,并让 Transactional 从系统配置中提取 SMTP。上面的代码是作为信息发布的,用于创建一个模块来编辑该 Newsletter 类中的 send() 函数。
猜你喜欢
  • 2012-01-11
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
相关资源
最近更新 更多