修改Javascript/PHP sendEmail函数使用Mailgun HTTP POST


Modify Javascript/PHP sendEmail function to use Mailgun HTTP POST

我有一个sendEmail函数作为一个更大的php脚本的一部分,我得到了在线,我需要修改它来使用我的新Mailgun帐户。我对PHP相当陌生,对邮件服务器和类似的东西更陌生,所以这是上周的一个挑战。Mailgun文档给出了一个使用PHP通过HTTP POST发送邮件的例子(点击顶部的PHP按钮):

function send_simple_message() {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  curl_setopt($ch, CURLOPT_USERPWD, 'api:my-api-key-here');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  curl_setopt($ch, CURLOPT_URL, 'https://api.mailgun.net/v2');
  curl_setopt($ch, CURLOPT_POSTFIELDS, array('from' => 'Excited User <me@samples.mailgun.org>',
                                             'to' => 'obukhov.sergey.nickolayevich@yandex.ru',
                                             'subject' => 'Hello',
                                             'text' => 'Testing some Mailgun awesomness!'));
  $result = curl_exec($ch);
  curl_close($ch);
  return $result;
}

和我现有的sendEmail函数看起来像:

public function sendEmail($to, $subj, $msg, $shortcodes = '', $bcc = false) {
    if ( !empty($shortcodes) && is_array($shortcodes) ) :
        foreach ($shortcodes as $code => $value)
            $msg = str_replace('{{'.$code.'}}', $value, $msg);
    endif;
    /* Multiple recepients? */
    if ( is_array( $to ) )
        $to = implode(', ', $to);
    $headers  = 'MIME-Version: 1.0' . "'r'n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "'r'n";
    $headers .= 'From: ' . address . "'r'n";
    /* BCC address. */
    if ( $bcc ) {
        $headers .= 'Bcc: ' . $to . "'r'n";
        $to = null;
    }
    $headers .= 'Reply-To: ' . address . "'r'n";
    $headers .= 'Return-Path: ' . address . "'r'n";
    /*
     * If running postfix, need a fifth parameter since Return-Path doesn't always work.
     */
    // $optionalParams = '-r' . address;
    $optionalParams = '';
    return mail($to, $subj, nl2br(html_entity_decode($msg)), $headers, $optionalParams);
}

我知道我不想在我的函数中指定to, subject, text等,因为它是从其他现有区域绘制的,所以我试着在函数中添加这样的东西(抱歉,我不知道它是如何放在一起的,因为它太乱了,我把它划掉了,重新开始:

curl_setopt($ch, CURLOPT_POSTFIELDS, array('from' => 'Webmaster <webmaster@mydomain.com>',
                                             'to' => $to,
                                             'subject' => $subj,
                                             'text' => $msg));

我还在sendEmail函数内添加了$ch = curl_init();以及所有curl_setopt行。除此之外,我迷路了,你可能猜到了,什么也没发生。

谁能告诉我如何将两者结合起来,为什么,或者给我指出一个与这类东西非常相似的地方??

提前感谢您的帮助!

根据我对您的问题的理解,您已经将底部代码作为您正在使用的脚本的一部分,但实际的邮件需要沿着顶部给出的示例Mailgun代码行完成?

我把这两个函数混在一起了。未测试。可能有错误

函数具有相同的名称,并以与之前完全相同的方式被调用,接受相同的参数。您将看到,我已经删除了代码的底部部分——实际发送电子邮件的部分——并用示例代码替换了它。在其中,我已经替换了占位符文本,它提供了函数在顶部接收的值:$to, $subj$msg。我还删除了所有的$headers行,因为这些行专门指的是我们不再使用的mail()函数。[编辑:现在应该也可以使用密件抄送选项]

您仍然需要更改一些东西:my-api-key-hereExcited User <me@samples.mailgun.org>。这些信息应该可以从您的Mailgun帐户中获得。

public function sendEmail($to, $subj, $msg, $shortcodes = '', $bcc = false) {
  if ( !empty($shortcodes) && is_array($shortcodes) ) :
      foreach ($shortcodes as $code => $value)
          $msg = str_replace('{{'.$code.'}}', $value, $msg);
  endif;    
  /* Multiple recepients? */
  if ( is_array( $to ) )
      $to = implode(', ', $to);
  /* BCC address. */
  $bccrecip = '';
  if ( $bcc ) {
      $bccrecip = $to;
      $to = '';
  }
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  curl_setopt($ch, CURLOPT_USERPWD, 'api:my-api-key-here');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  curl_setopt($ch, CURLOPT_URL, 'https://api.mailgun.net/v2');
  curl_setopt($ch, CURLOPT_POSTFIELDS, array('from' => 'Excited User <me@samples.mailgun.org>',
                                             'to' => $to,
                                             'bcc' => $bccrecip,
                                             'subject' => $subj,
                                             'text' => $msg));
  $result = curl_exec($ch);
  curl_close($ch);
  return $result;
}