在添加附件时尝试通过不同的 smtp 服务发送电子邮件

Posted

技术标签:

【中文标题】在添加附件时尝试通过不同的 smtp 服务发送电子邮件【英文标题】:Trying to send email through different smtp service while adding attachments 【发布时间】:2020-05-09 19:14:03 【问题描述】:

我在使用 PEAR 时遇到问题

$smtp = Mail::factory ('smtp', $params);

通过自定义电子邮件服务器重定向 smtp 并添加附件(实际上是几个),这似乎是不可能的。

$HeadersCO = array (
                'From' => $From,
                'Return-path' => $From,
                'To' => $Email,
                'Subject' => $Subject2C,
                'Reply-To' => $From,
                'Date' => date("r"),
                'Errors-To' => $Admin_Email,
                'Return-Path' => $Company,
                'X-Mailer' => "php v".phpversion(),
                'X-Domain' => $SERVER_NAME,
                'X-Page' => $PHP_SELF,
                'Content-type' => $contentUTF8,
                'MIME-Version' => $mime);

            $mimeCO = new Mail_mime(array('eol' => $crlf));

            $mimeCO->setTXTBody($textcontent);  //Text version
            $mimeCO->sethtmlBody($message);  //HTML version

            $imgNo=0;   
            while ($imgNo < $totalImages)      
                $imageAtt = $imgarr[$imgNo];
                $mimeCO->addAttachment($imageAtt, 'image/jpg');
                $imgNo++;
               

            $bodyCO = $mimeCO->get();
            $hdrsCO = $mimeCO->headers($HeadersCO);

            $mail2C = $smtp->send($email, $hdrsCO, $bodyCO);

这将向正确的电子邮件服务器发送一封电子邮件,其中包含嵌入的图像,但没有附加图像。 $mimeCO-&gt;addAttachment($imageAtt, 'image/jpg'); 似乎根本不起作用,即使我只创建一个带有特定文件的附件。

我在某处读到,使用 PEAR mime & mail 时,您可以将电子邮件重定向到不同的 SMTP 服务或添加附件,但不能同时使用两者。它是否正确?如果是,那么这就解释了为什么我在 PEAR 中使用 $smtp-&gt;send 发送附件时遇到问题。

【问题讨论】:

您是否尝试过类似 PHPMailer 的东西? 嗨。谢谢你。我还没有。我的代码纯粹是 PHP,但是想要通过不同的邮件服务器重定向,我来到了 PEAR。在当前代码上投入了大量时间,我只是想看看是否有使用 PEAR 的解决方案。我听说过 Swift Mailer 和 PHPMailer。认为后者的存在时间更长? 我不确定,但我猜你可以查一下。其中任何一个都应该是可配置的,以允许您使用任何您喜欢的邮件服务器。 【参考方案1】:

我能够通过使用 PHPMailer 解决我对 PEAR [通过外部 SMTP 服务器发送并添加附件] 的限制的困境。

我将 PHPMailer 设置为打开外部 SMTP 通道,最多发送 4 封不同的电子邮件,然后关闭 SMTP 会话,同时选择哪些电子邮件有附件、图像嵌入、不同的主题、不同的正文、回复、收件人和添加地址。

总的来说,我的代码从 1400 多行减少到了 800 行以下,我对这段代码的灵活性感到非常满意。

这是新 PHPMailer 代码的核心:

$mail = new PHPMailer(true);     // Passing `true` enables exceptions

$mail->SMTPDebug = false;        //3 Enables SMTP debugging, 0 turns off 
$mail->isSMTP();                 //Set PHPMailer to use SMTP.  
$mail->SMTPKeepAlive = true;     //Keep SMTP alive            
$mail->Host = "smtp.emailserver.com";//Specify external SMTP servers  
$mail->SMTPAuth = true;                          
$mail->Username = "username@mail.domain.com";               
$mail->Password = "mypass";                           
$mail->SMTPSecure = "tls";       // Enable encryption, 'ssl'                        
$mail->Port = 587;               //Set TCP port to connect to

//Recipients
$mail->addReplyTo('company@mail.domain.com', 'Company Name');
$mail->setFrom('company@mail.domain.com', 'Company Name');  
//Add recipeints
$mail->addAddress($Email, "'".$FirstName." ".$LastName."'");
//CC and BCC
$mail->addBCC('me@mail.domain.com', "WebMaster Backup");
$mail->addCC('company@domain.com', "CC Backup");

//Attachments from array using PHP
$imgNo=0;   
while ($imgNo < $totalImages)  
    $imageAtt = $imgArray[$imgNo];
    $imageNam = $imgName[$imgNo];
    $mail->addAttachment($imageAtt, $imageNam);
    $imgNo++;
       

//Content
$mail->Subject = $Subject2C;
$mail->Body    = $message;
$mail->AltBody = $textcontent;
$mail->isHTML(true); //Set email to be sent as HTML, false for Text only

/* =============Sending Customer Email====#1====== */
if($mail->send())   


/* ==============Sending Company Email=====#2====== */
$mail->clearReplyTos();
$mail->clearAllRecipients(); // clear all Address/CC/BCC
$mail->clearAttachments(); 
$mail->addReplyTo($Email, "'".$FirstName." ".$LastName."'");
$mail->setFrom($Email, "'".$FirstName." ".$LastName."'");  
$mail->addAddress('company@mail.domain.com', 'Email Sent');
$mail->addBCC('me@mail.domain.com', "WebMaster Backup");
$mail->Subject = $Subject2Company;
$mail->Body    = $MessageEmail;
$mail->AltBody = $textcontent; 
$mail->AltBody = $textcontent;
$mail->isHTML(true);

$mail->send();

/* ==============Subscribing Email=========#3====== */
$mail->clearAttachments(); 
$mail->clearReplyTos();
$mail->clearAllRecipients();
$mail->clearCCs();
$mail->addReplyTo('company@mail.domain.com', 'Company Name');
$mail->setFrom('company@mail.domain.com', 'Company Name');      
$mail->addAddress($listmail, 'Subscribe List');     
$mail->addBCC('me@mail.domain.com', "WebMaster Backup");        
$mail->Subject = $subject;
$mail->Body    = $SMessage;
$mail->AltBody = $body;
$mail->isHTML(false); 
$mail->send();

$mail->SmtpClose(); //closing SMTP session

【讨论】:

以上是关于在添加附件时尝试通过不同的 smtp 服务发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

通过 SMTP 发送带有附件、纯文本/文本和文本/html 的电子邮件

在 Golang 中附加文件并通过 SMTP 发送时没有正文部分的电子邮件

如何发送带有附件的电子邮件(使用我自己的SMTP服务器)?

带有多个附件 + html 的 SMTP 邮件 Mime

通过 Gmail SMTP 发送电子邮件时出错

SMTP 中带有纯文本、HTML 和附件的电子邮件的正确电子邮件格式?