阿里云虚拟主机邮件发不出去,使用465端口发信解决代码

阿里云虚拟主机邮件发不出去,错误提示:SMTP ERROR: Failed to connect to server: (0)
25端口默认屏蔽,暂时无法申请开通的,您考虑使用加密465端口发信也是可以的,可参考如下 :


适用场景

因服务器的25端口默认封闭,需要使用SSL加密端口(通常是465)来对外发信,以下样例适用于程序调用外部邮箱发信的场景,调用的邮箱服务器需要支持SSL加密。这里介绍.NET和PHP的样例,其他语言实现方法思路基本相同。

基本原理

通过连接外部邮箱的发信服务器,并通过程序配置的账号密码鉴权验证来发送邮件,而不是服务器本身来发送邮件。基本原理与本地电脑使用outlook等客户端连接邮箱服务器发送邮件一致。

实现要点

基本实现方式与连接25端口发送邮件一致,但改为SSL加密协议后,需要特别注意:

  • 将连接外部邮箱服务器的端口改为邮箱服务器的SSL加密端口(通常是465端口),具体配置可以与邮箱服务商咨询。
  • 在程序中启用SSL加密协议连接邮箱服务器。

具体实现

  • .NET源代码实现样例及Demo(适用于Windows操作系统)
  • PHP源代码及Demo
  • ASP源代码及Demo

    .NET源代码实现样例及Demo

截取部分源代码样例如下:

 

	
  1. MailMessage mmsg = new MailMessage();
  2. //邮件主题
  3. mmsg.Subject = "主题";
  4. mmsg.BodyFormat = MailFormat.Html;
  5. //邮件正文
  6. mmsg.Body = "正文";
  7. //正文编码
  8. mmsg.BodyEncoding = Encoding.UTF8;
  9. //优先级
  10. mmsg.Priority = MailPriority.High;
  11. //发件者邮箱地址
  12. mmsg.From = "xxxxxx";
  13. //收件人收箱地址
  14. mmsg.To = "xxxxxx";
  15.  
  16.  
  17. mmsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
  18. //用户名
  19. mmsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "xxxxxx");
  20. //密码
  21. mmsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "xxxxxx");
  22. //端口
  23. mmsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 465);
  24. //使用SSL mmsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");
  25.  
  26. //Smtp服务器
  27. System.Web.Mail.SmtpMail.SmtpServer = "smtp.xx.com";
  28.  
  29. SmtpMail.Send(mmsg);

Demo下载

可将以上Demo上传至服务器测试发信是否能够成功。

PHP源代码及Demo

截取部分源代码样例如下

 

	
  1. <?php
  2.  
  3. require 'PHPMailerAutoload.php';
  4. require_once('class.phpmailer.php');
  5. require_once("class.smtp.php");
  6. $mail = new PHPMailer();
  7.  
  8. $mail->CharSet ="UTF-8"; //设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置为 UTF-8
  9. $mail->IsSMTP(); // 设定使用SMTP服务
  10. $mail->SMTPAuth = true; // 启用 SMTP 验证功能
  11. $mail->SMTPSecure = "ssl"; // 启用SSL
  12. $mail->SMTPDebug = 2;
  13. $mail->Host = "smtp.xxx.com"; // SMTP 服务器
  14. $mail->Port = 465; // SMTP服务器的端口号
  15. $mail->Username = "xxx@xxx.com"; // SMTP服务器用户名
  16. $mail->Password = "xxx"; // SMTP服务器密码
  17. $mail->SetFrom('xxx@xxx.com', 'qq'); // 设置发件人地址和名称
  18. $mail->AddReplyTo("xxx@xxx.com","xxx@xxx.com");
  19. // 设置邮件回复人地址和名称
  20. $mail->Subject = 'xxx'; // 设置邮件标题
  21. $mail->AltBody = "为了查看该邮件,请切换到支持 HTML 的邮件客户端";
  22. // 可选项,向下兼容考虑
  23. $mail->MsgHTML('<html>helo</html>'); // 设置邮件内容
  24. $mail->AddAddress('xxx@xxx.com', "xxx@xxx.com");
  25. //$mail->AddAttachment("images/phpmailer.gif"); // 附件
  26. if(!$mail->Send()) {
  27. echo "发送失败:" . $mail->ErrorInfo;
  28. } else {
  29. echo "恭喜,邮件发送成功!";
  30. }
  31.  
  32. ?>

Demo下载

可将以上Demo上传至服务器测试发信是否能够成功。

ASP源代码及Demo

 

	
  1. <%
  2. Set Mail = CreateObject("CDO.Message")
  3.  
  4. Mail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
  5. Mail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") ="smtp.126.com"
  6. Mail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
  7.  
  8. Mail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = 1
  9.  
  10. Mail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
  11.  
  12. Mail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
  13. Mail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") ="xxx@126.com"
  14. Mail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") ="xxxxx"
  15.  
  16. Mail.Configuration.Fields.Update
  17.  
  18. Mail.Subject="Email subject"
  19. Mail.From="xxxxx"
  20. Mail.To="xxxx"
  21. Mail.TextBody="This is an email message."
  22.  
  23. Mail.Send
  24. Set Mail = Nothing
  25. %>
  26. <%="发送成功!!!"%>

Demo下载

调试方法

  1. 联系邮箱服务商拿到使用SSL加密方式发信的设置。通常包含:
    • 发信服务器地址,如smtp.xx.com
    • 发信服务器端口号,加密端口一般是465,普通端口25
    • 邮箱用户名,可能是email地址,也可能是email地址前缀,具体可咨询邮箱服务商
    • 邮箱客户端密码,部分邮箱服务商Web浏览器登录界面的登录密码和客户端密码并不相同,可能需要单独设置,具体可咨询邮箱服务商。
  2. 在本地电脑使用客户端软件(Outlook,Foxmail等),使用上述拿到的配置来设置本地客户端,并发信测试,如果不能发送,也需要联系邮箱服务商。具体配置方法略。这步主要是验证第1步拿到的配置是否正确,如果配置不正确,本地发信就会报错。

  3. 把程序中的邮箱服务器配置项按照上述测试通过的配置来编写,并实际发信测试。