Todos os produtos
Search
Central de documentação

Direct Mail:Exemplos de chamada PHP para SMTP

Última atualização: Jun 27, 2026

Envie e-mails pelo endpoint SMTP do Direct Mail com PHP, utilizando a biblioteca PHPMailer ou uma classe SMTP personalizada.

Pré-requisitos

Antes de começar, verifique se você tem:

  • PHP 7.4 ou posterior instalado

  • Composer instalado (para o Método 1)

  • Endereço de remetente configurado no console do Direct Mail, com a senha SMTP definida

  • Credenciais SMTP (endereço do remetente e senha SMTP) armazenadas como variáveis de ambiente — nunca codifique credenciais diretamente no código-fonte

Para armazenar as credenciais como variáveis de ambiente:

export DM_SMTP_USER="your-sender@example.com"
export DM_SMTP_PASS="your-smtp-password"

Envio de e-mails com PHP via protocolo SMTP

Escolha um método conforme a configuração do seu projeto. O Método 1 utiliza o PHPMailer, a biblioteca de e-mail PHP mais adotada. Já o Método 2 emprega uma classe personalizada leve que dispensa gerenciador de pacotes.

Método 1: PHPMailer

Instale o PHPMailer com o Composer:

composer require phpmailer/phpmailer
Nota: Para instalar manualmente sem o Composer, baixe os arquivos PHPMailer.php , Exception.php e SMTP.php na página PHPMailer v6.6.5 no GitHub . Em seguida, abra o arquivo PHPMailer.php e altere o charset padrão de self::CHARSET_ISO88591 para self::CHARSET_UTF8 .
<?php
require 'vendor/autoload.php'; // Use this line if installed via Composer

// Uncomment the three lines below if you installed PHPMailer manually:
// require 'PHPMailer.php';
// require 'Exception.php';
// require 'SMTP.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer(true);

try {
    // SMTP server settings
    $mail->CharSet    = 'UTF-8';
    $mail->isSMTP();
    $mail->SMTPDebug  = SMTP::DEBUG_SERVER;           // Remove or set to DEBUG_OFF in production

    // SSL on port 465 (recommended)
    $mail->Host       = 'ssl://smtpdm.aliyun.com';   // Direct Mail SMTP endpoint
    $mail->Port       = 465;

    // Alternative: STARTTLS on port 80
    // $mail->Host       = 'smtpdm.aliyun.com';
    // $mail->Port       = 80;
    // $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;

    $mail->SMTPAuth   = true;
    $mail->Username   = getenv('DM_SMTP_USER');       // Sender address (from environment variable)
    $mail->Password   = getenv('DM_SMTP_PASS');       // SMTP password (from environment variable)

    // Sender and recipients
    $mail->setFrom(getenv('DM_SMTP_USER'), 'Mailer'); // Display sender address; supports send-on-behalf
    $mail->addAddress('recipient@example.com', 'Recipient Name');
    // $mail->addAddress('recipient2@example.com', 'Second Recipient'); // Add multiple recipients as needed
    $mail->addReplyTo('replyto@example.com', 'Reply Contact');
    $mail->addCC('cc@example.com');
    $mail->addBCC('bcc@example.com');

    // Optional: custom message header for unsubscribe policy and IP pool
    // $createJson = [
    //     "Version" => "1.0",
    //     "Unsubscribe" => [
    //         "LinkType"    => "default",
    //         "FilterLevel" => "mailfrom_domain"
    //     ],
    //     "OutboundIp" => [
    //         "IpPoolId" => "<your-ip-pool-id>"    // Replace with your IP pool ID
    //     ]
    // ];
    // $jsonString  = json_encode($createJson, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    // $base64Trace = base64_encode($jsonString);
    // $mail->addCustomHeader('X-AliDM-Settings', $base64Trace);

    // Attachment (optional)
    $mail->addAttachment('/path/to/file.jpg', 'attachment.jpg');

    // Email content
    $mail->isHTML(true);
    $mail->Subject = 'Subject test';
    $mail->Body    = 'Test content';
    // $mail->AltBody = 'Plain-text fallback for non-HTML clients';

    $mail->Sender = getenv('DM_SMTP_USER');

    $mail->send();
    echo 'Message sent successfully.';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer error: {$mail->ErrorInfo}";
}
?>

A tabela a seguir descreve as principais configurações do exemplo:

Configuração

Descrição

Host e Port

Utilize ssl://smtpdm.aliyun.com com a porta 465 para SSL (criptografado desde o início). Use smtpdm.aliyun.com com a porta 80 e ENCRYPTION_STARTTLS para iniciar sem criptografia e atualizar depois. Recomenda-se a porta 465 com SSL.

SMTPAuth

Defina como true para ativar a autenticação com seu endereço de remetente e senha SMTP.

setFrom

Define o endereço de remetente exibido. Este endereço pode diferir de Username ao enviar em nome de outro endereço.

Sender

Especifica o remetente do envelope (o endereço MAIL FROM usado durante o handshake SMTP).

SMTPDebug

Defina como SMTP::DEBUG_OFF ou remova esta linha antes de implantar em produção.

Método 2: Classe SMTP personalizada (email.class.php)

Adote este método quando não for possível usar o Composer ou quando preferir uma solução independente.

<?php
require 'email.class.php';

$mailto      = 'recipient@example.com';      // Recipient address
$mailsubject = "Test email";
$mailbody    = 'This is the email content';

// SMTP connection settings
$smtpserver     = "smtpdm.aliyun.com";
$smtpserverport = 80;
// For SSL, use the two lines below instead:
// $smtpserver     = "ssl://smtpdm.aliyun.com";
// $smtpserverport = 465;

$smtpusermail = getenv('DM_SMTP_USER');   // Sender address (from environment variable)
$smtpuser     = getenv('DM_SMTP_USER');   // Full sender address, e.g. test@example.net
$smtppass     = getenv('DM_SMTP_PASS');   // SMTP password (from environment variable)

$mailsubject = "=?UTF-8?B?" . base64_encode($mailsubject) . "?=";
$mailtype    = "HTML";

$smtpreplyto = "replyto@example.com";     // Optional reply-to address

$smtp = new smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);
$smtp->debug = false;

$cc                 = "";
$bcc                = "";
$additional_headers = "";
$sender             = "Display Name";      // Sender display name

$smtp->sendmail($mailto, $smtpusermail, $mailsubject, $mailbody, $mailtype,
                $cc, $bcc, $additional_headers, $sender, $smtpreplyto);
?>

Antes de usar o email.class.php, certifique-se de que o arquivo inclua o cabeçalho Reply-To no método sendmail. Adicione a linha abaixo caso esteja ausente:

$header .= "Reply-To: " . $replyToAddress . "\r\n"; // $replyToAddress is the $smtpreplyto parameter
  • O arquivo email.class.php não vem incluído no Direct Mail. Baixe-o de uma source confiável ou utilize a implementação de referência abaixo.

  • A variável $mailto aceita apenas um endereço de destinatário. Para enviar a vários destinatários, passe uma string separada por vírgulas.

  • A variável $smtpuser deve conter o endereço completo do remetente, exatamente como configurado no console do Direct Mail.

Implementação de referência do email.class.php

<?php

/**
 * email smtp (support php7)
 *
 */

class Smtp
{
    /* Public Variables */
    public $smtp_port;

    public $time_out;

    public $host_name;

    public $log_file;

    public $relay_host;

    public $debug;

    public $auth;

    public $user;

    public $pass;

    /* Private Variables */
    private $sock;

    /* Constractor */
    function __construct($relay_host = "", $smtp_port = 80,$auth = false,$user,$pass)
    {
        $this->debug = FALSE;

        $this->smtp_port = $smtp_port;

        $this->relay_host = $relay_host;

        $this->time_out = 30; //is used in fsockopen()

        $this->auth = $auth;//auth

        $this->user = $user;

        $this->pass = $pass;

        $this->host_name = "localhost"; //is used in HELO command
        $this->log_file = "";

        $this->sock = FALSE;

    }

    /* Main Function */

    function sendmail($to, $from, $subject, $body, $mailtype, $cc, $bcc, $additional_headers, $fromUser, $replyToAddress)
    {

        $mail_from = $this->get_address($this->strip_comment($from));

        $body = preg_replace("/(^|(\r\n))(\.)/", "\1.\3", $body);

        $header = "MIME-Version:1.0\r\n";

        if($mailtype=="HTML"){

            $header .= "Content-Type:text/html; charset=utf-8\r\n";

        }

        $header .= "To: ".$to."\r\n";

        if ($cc != "") {

            $header .= "Cc: ".$cc."\r\n";

        }

        $header .= "From: $fromUser<".$from.">\r\n";

        $header .= "Subject: ".$subject."\r\n";

        $header .= "Reply-To: ".$replyToAddress."\r\n";

        $header .= $additional_headers;

        $header .= "Date: ".date("r")."\r\n";

        $header .= "X-Mailer:By Redhat (PHP/".phpversion().")\r\n";

        list($msec, $sec) = explode(" ", microtime());

        $header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">\r\n";

        // To enable the email tracking feature, use the following code to set the tracking link in the message header. For more information about the prerequisites and constraints, see Enable the data tracking feature.
        //$header .= "Content-Transfer-Encoding: quoted-printable\r\n";
        //$header .= "X-AliDM-Trace: ". base64_encode(json_encode(['TagName'=>'user_created_tag','OpenTrace'=>"1"]))."\r\n";
        $TO = explode(",", $this->strip_comment($to));

        if ($cc != "") {

            $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));

        }

        if ($bcc != "") {

            $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));

        }

        $sent = TRUE;

        foreach ($TO as $rcpt_to) {

            $rcpt_to = $this->get_address($rcpt_to);

            if (!$this->smtp_sockopen($rcpt_to)) {

                $this->log_write("Error: Cannot send email to ".$rcpt_to."\n");

                $sent = FALSE;

                continue;

            }

            if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {

                $this->log_write("E-mail has been sent to <".$rcpt_to.">\n");

            } else {

                $this->log_write("Error: Cannot send email to <".$rcpt_to.">\n");

                $sent = FALSE;

            }

            fclose($this->sock);

            $this->log_write("Disconnected from remote host\n");

        }

        return $sent;

    }

    /* Private Functions */

    function smtp_send($helo, $from, $to, $header, $body = "")
    {

        if (!$this->smtp_putcmd("HELO", $helo)) {

            return $this->smtp_error("sending HELO command");

        }

        //auth
        if($this->auth){

            if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {

                return $this->smtp_error("sending HELO command");

            }

            if (!$this->smtp_putcmd("", base64_encode($this->pass))) {

                return $this->smtp_error("sending HELO command");

            }

        }

        if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) {

            return $this->smtp_error("sending MAIL FROM command");

        }

        if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">")) {

            return $this->smtp_error("sending RCPT TO command");

        }

        if (!$this->smtp_putcmd("DATA")) {

            return $this->smtp_error("sending DATA command");

        }

        if (!$this->smtp_message($header, $body)) {

            return $this->smtp_error("sending message");

        }

        if (!$this->smtp_eom()) {

            return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");

        }

        if (!$this->smtp_putcmd("QUIT")) {

            return $this->smtp_error("sending QUIT command");

        }

        return TRUE;

    }

    function smtp_sockopen($address)
    {

        if ($this->relay_host == "") {

            return $this->smtp_sockopen_mx($address);

        } else {

            return $this->smtp_sockopen_relay();

        }

    }

    function smtp_sockopen_relay()
    {

        $this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."\n");

        $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);

        if (!($this->sock && $this->smtp_ok())) {

            $this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."\n");

            $this->log_write("Error: ".$errstr." (".$errno.")\n");

            return FALSE;

        }

        $this->log_write("Connected to relay host ".$this->relay_host."\n");

        return TRUE;

    }

    function smtp_sockopen_mx($address)
    {

        $domain = preg_replace("/^.+@([^@]+)$/", "\1", $address);

        if (!@getmxrr($domain, $MXHOSTS)) {

            $this->log_write("Error: Cannot resolve MX \"".$domain."\"\n");

            return FALSE;

        }

        foreach ($MXHOSTS as $host) {

            $this->log_write("Trying to ".$host.":".$this->smtp_port."\n");

            $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);

            if (!($this->sock && $this->smtp_ok())) {

                $this->log_write("Warning: Cannot connect to mx host ".$host."\n");

                $this->log_write("Error: ".$errstr." (".$errno.")\n");

                continue;

            }

            $this->log_write("Connected to mx host ".$host."\n");

            return TRUE;

        }

        $this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")\n");

        return FALSE;

    }

    function smtp_message($header, $body)
    {

        fputs($this->sock, $header."\r\n".$body);

        $this->smtp_debug("> ".str_replace("\r\n", "\n"."> ", $header."\n> ".$body."\n> "));

        return TRUE;

    }

    function smtp_eom()
    {

        fputs($this->sock, "\r\n.\r\n");

        $this->smtp_debug(". [EOM]\n");

        return $this->smtp_ok();

    }

    function smtp_ok()
    {

        $response = str_replace("\r\n", "", fgets($this->sock, 512));

        $this->smtp_debug($response."\n");

        if (!preg_match("/^[23]/", $response)) {

            fputs($this->sock, "QUIT\r\n");

            fgets($this->sock, 512);

            $this->log_write("Error: Remote host returned \"".$response."\"\n");

            return FALSE;

        }

        return TRUE;

    }

    function smtp_putcmd($cmd, $arg = "")
    {

        if ($arg != "") {

            if($cmd=="") $cmd = $arg;

            else $cmd = $cmd." ".$arg;

        }

        fputs($this->sock, $cmd."\r\n");

        $this->smtp_debug("> ".$cmd."\n");

        return $this->smtp_ok();

    }

    function smtp_error($string)
    {

        $this->log_write("Error: Error occurred while ".$string.".\n");

        return FALSE;

    }

    function log_write($message)
    {

        $this->smtp_debug($message);

        if ($this->log_file == "") {

            return TRUE;

        }

        $message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;

        if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {

            $this->smtp_debug("Warning: Cannot open log file \"".$this->log_file."\"\n");

            return FALSE;

        }

        flock($fp, LOCK_EX);

        fputs($fp, $message);

        fclose($fp);

        return TRUE;

    }

    function strip_comment($address)
    {

        $comment = "/\([^()]*\)/";

        while (preg_match($comment, $address)) {

            $address = preg_replace($comment, "", $address);

        }

        return $address;

    }

    function get_address($address)
    {

        $address = preg_replace("/([ \t\r\n])+/", "", $address);

        $address = preg_replace("/^.*<(.+)>.*$/", "\1", $address);

        return $address;

    }

    function smtp_debug($message)
    {

        if ($this->debug) {

            echo $message;

        }

    }

}
?>