通过 SMTP 发送邮件?

Posted

技术标签:

【中文标题】通过 SMTP 发送邮件?【英文标题】:Send mail via SMTP? 【发布时间】:2014-03-05 23:43:52 【问题描述】:

我的网站上有一个表格,人们可以在其中加入活动。它背后的代码是这样工作的:

    所有信息都保存在数据库中。这部分工作正常。

    代码的第二部分向我和用户发送一封电子邮件,其中包含他输入的信息(与保存在数据库中的信息相同)

问题是这些电子邮件是通过托管帐户上的默认电子邮件未经身份验证发送的。我不得不修改脚本以强制使用我的主机帐户下的有效电子邮件进行 SMTP 身份验证以修复错误。现在脚本发出了电子邮件,但它以垃圾邮件过滤器结束所有 ISP,因此用户永远不会收到电子邮件。

我不知道该怎么做,或者创建代码以便脚本使用 SMTP 身份验证。以下是我的票价。有人可以帮我吗?

<?
// SEND OUT EMAIL PART
// COPY SEND TO MY SELF
$to = "my@email.com"; 
$from = $_REQUEST['email'] ; 
$name = $_REQUEST['name'] ; 
$headers = "From: $from"; 
$subject = "Thanks!"; 

$fields = array(); 
$fields"name" = "Name"; 
$fields"address" = "Address"; 
$fields"phone" = "Phone"; 
$fields"email" = "E-mail addesse"; 

$body = "INFO:\n\n"; foreach($fields as $a => $b)  $body .= sprintf("%20s: %s\n",$b,$_REQUEST[$a]);  


// SEND TO THE USER
$headers2 = "From: my@email.com"; 
$subject2 = "THANKS!"; 

$fields2 = array(); 
$from = $_REQUEST['email'] ; 
$name = $_REQUEST['name'] ; 
$headers = "From: $from"; 
$subject = "Thanks!"; 

$body2 = "

TEXT TO EMAIL RECEIVER

\n\n"; foreach ($fields2 as $a => $b)  $body2 .= sprintf("%20s: %s\n",$b,$_REQUEST[$a]);  

// ERROR MESSAGES
if($from == '') print "MISSING EMAIL ADDRESS."; 
else  
if($name == '') print "MISSING NAME"; 
else  
$send = mail($to, $subject, $body, $headers); 
$send2 = mail($from, $subject2, $body2, $headers2); 
if($send) 
header( "Location: http://mysite/send.php" ); 
else 
print "MISSING EMAIL ADDRESS ALL FILDS MUST BE FILLED!";  


?>

【问题讨论】:

【参考方案1】:

最好使用专用脚本发送电子邮件。例如PHPMailer,它为您提供各种配置选项,包括 SMTP:

// Send Mail
$mail = new PHPMailer(); // initiate
$mail->IsSMTP(); // use SMTP

// SMTP Configuration
$mail->SMTPAuth = true; // set SMTP
$mail->Host = "myhost"; // SMTP server
$mail->Username = "email@email.com";
$mail->Password = "password";            
$mail->Port = 465; // change port is required

【讨论】:

@Micakkef 我是否只需在我的代码上方添加上述代码,更改信息以使其适合我,上传 PHPmailer 然后它就可以工作,还是我需要做一些额外的工作才能让它工作?我不确定这个 phpmailer 是如何工作的 查看他们的网站以查看工作示例。您将需要下载这些文件并将它们包含在您的脚本中。 phpmailer.worxware.com/index.php?pg=examplebsmtp【参考方案2】:

这是一种方法。您需要包含PHPMailer

#somewhere in code before you call function
include($path_to_PHPMailer."class.smtp.php");

function sendEmail($email,$name,$title,$content,$who=false,$att=array(''))
    //VARIABLE $email is email of sender 
    //VARIABLE $name is name of sender
    //VARIABLE $title is title of email
    //VARIABLE $content is content of email
    $mail = new PHPMailer();
    $mail->IsSMTP(); // telling the class to use SMTP
    // DOUBLE $mail->Host       = "your email_server"; // SMTP server 
    $mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
    // 1 = errors and messages
    // 2 = messages only
    $mail->SMTPAuth   = true;                  // enable SMTP authentication
    $mail->Host       = "your email_server"; // sets the SMTP server
    $mail->Port       = server port;                    // set the SMTP port for the GMAIL server
    $mail->Username   = "your username"; // SMTP account username
    $mail->Password   = "your password";        // SMTP account password

    if($who)
        $mail->SetFrom($email, $name);
        $mail->AddReplyTo($email,$name);
        $address = "set your email";//EMAIL OF RECIPENT
     else
        $mail->SetFrom("set your email", "your name (or service name)");
        $mail->AddReplyTo("set your email","your name (or service name)");
        $address = $email;
    

    $content=str_replace("\n", "<br>", $content);
    $mail->Subject    = $title;
    $mail->Msghtml($content);
    $mail->AddAddress($address, $name);
    $mail->CharSet='utf-8';

    if($att[0]!='')
        foreach ($att as $at)
            $mail->AddAttachment($at);
        
    

    if(!$mail->Send()) 
        return false; //$mail->ErrorInfo;
     else 
        return true;
    

【讨论】:

你能告诉我更多关于将代码添加到我的代码中的位置吗?我不确定 tihs 将如何与我已经得到的东西一起工作,还是应该取代任何东西? 是的,您必须设置您的登录信息。我注意到,它说你的“东西”你必须输入你所拥有的信息......例如,“你的电子邮件服务器”可以是 mail.somedomain.com......你的用户名是你的电子邮件帐户的用户名......那是恒定的...当您要发送电子邮件时,您总是调用此函数并设置所需的信息...$who 变量告诉您​​是接收电子邮件还是发送...true 是接收,false 是发送

以上是关于通过 SMTP 发送邮件?的主要内容,如果未能解决你的问题,请参考以下文章

python通过SMTP发送邮件失败,报错505/535

如何在php中使用ssl通过smtp发送邮件

通过邮件 gem 发送 smtp 电子邮件会导致 554 5.7.0 Reject

如何使用 Ruby 的邮件 gem 通过 smtp 发送电子邮件?

问题通过 SMTP 发送邮件

使用 PHPMailer 通过 SMTP 发送电子邮件