最近开发一个项目,需要给客户发送报告邮件,在开发中遇到本地调试发送邮件一切正常,但当部署到服务器上的时候,一直返回“发送失败”,在此记录,以免以后采坑

webapi 端代码:

         /// <summary>
/// 发送邮件
/// </summary>
/// <param name="fromMail">发件人邮箱</param>
/// <param name="toMail">收件人邮箱</param>
/// <param name="authorizationCode">发件人授权码</param>
/// <param name="replyTo">收件人回复邮件默认接收地址(不设置也可以)</param>
/// <param name="ccMail">邮件抄送人</param>
/// <param name="filePath">附件地址</param>
/// <param name="sendPeopleCall">收件人称呼</param>
/// <param name="collectSampleDate">收样时间</param>
/// <returns></returns>
public MsgModel SendMails(string fromMail,List<string> toMail,string authorizationCode,string replyTo, List<string> ccMail,List<string> filePath,string sendPeopleCall,string collectSampleDate)
{ try
{
//实例化发送邮件类
MailMessage mailMessage = new MailMessage();
//邮件的优先级 分为 low normal high 通常用Normal即可
mailMessage.Priority = MailPriority.Normal;
//发送人邮件地址
mailMessage.From = new MailAddress(fromMail);
//收件人邮件地址 //考虑群发邮件
foreach(var r in toMail)
{
mailMessage.To.Add(new MailAddress(r));
}
if (replyTo == "" || replyTo == null)
{
replyTo = fromMail;
} //对方回复邮件时默认的接收地址(可以不设置)
//mailMessage.ReplyTo = new MailAddress(replyTo);
if (ccMail != null)
{
//邮件抄送 支持 群发 抄送
foreach (var r in ccMail)
{
mailMessage.CC.Add(r);
}
}
//如果邮件标题包含中文,这里要设置编码方式 否则会出现乱码
mailMessage.SubjectEncoding = Encoding.GetEncoding();
//邮件正文是否是Html 格式
mailMessage.IsBodyHtml = true;
//邮件标题
mailMessage.Subject = $@" REPORT-{collectSampleDate}";
//邮件内容
mailMessage.Body = $@"
Dear {sendPeopleCall},
"; mailMessage.Attachments.Clear();
if (filePath != null&&filePath.Count>)
{
foreach (var r in filePath)
{
var urls = System.AppDomain.CurrentDomain.BaseDirectory.ToString() + r;//获取项目的绝对
//将附件添加到邮件
mailMessage.Attachments.Add(new Attachment(urls));
//获取设置此电子邮件的发送通知
mailMessage.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
} }
//实例化 SmtpClient类
SmtpClient client = new SmtpClient();
client.Host = GetClientHost(fromMail);
//使用安全加密连接
client.EnableSsl = true;
client.Port = ;//默认是25 此处设置成587
//不和请求一块发送
client.UseDefaultCredentials = false; //client.DeliveryMethod = SmtpDeliveryMethod.Network; //验证发送人身份(发件人的邮箱,邮箱里生成的授权码)
client.Credentials = new NetworkCredential(fromMail,authorizationCode); //如果发送失败,SMTP 服务器将发送 失败邮件告知fromEmail
mailMessage.DeliveryNotificationOptions= DeliveryNotificationOptions.OnFailure; client.Send(mailMessage); return new MsgModel
{
Status = true,
Msg = "发送邮件成功" ,
Data = ""
};
}
catch(Exception ex)
{
return new MsgModel
{
Status = false,
Msg = "发送邮件失败!错误:" + ex.Message,
Data=""
};
} }
         /// <summary>
/// 根据发送邮箱 识别发件服务器地址
/// </summary>
/// <param name="fromEmail"></param>
/// <returns></returns>
public string GetClientHost(string fromEmail)
{
var host = "";
if (fromEmail.Length != )
{
var addressStr = fromEmail.Trim().Split(new char[] { '@','.'});
switch (addressStr[])
{
case "":
host = "smtp.163.com";
break;
case "":
host = "smtp.126.com";
break;
case "qq":
host = "smtp.qq.com";
break;
case "gmail":
host = "smtp.gmail.com";
break;
case "hotmail":
host = "smtp.live.com";//outlook邮箱
//client.Port = 587;
break;
case "foxmail":
host = "smtp.foxmail.com";
break;
case "sina":
host = "smtp.sina.com.cn";
break;
default:
host = "smtp.exmail.qq.com";//qq企业邮箱
break; }
}
return host;
}

发送邮箱,以及授权码都放在配置文件webconfig 中,这里不展示。

另外:项目是部署到阿里服务器的,此项目邮件发送端口是587,因此在阿里服务器需要设置允许端口587进出。

在此基础上本地调试可正常发送,部署到服务器上就发送失败,经过查阅相关博客,不断的尝试其他博客的解决方法,其中一个博客中说:本地调试发送了邮件成功后,tx那边认为你当前发送邮件的地址为常用的邮件发送地址,再部署到服务器上的时候,tx就认为你是发送广告,就被禁止当前地址发送邮箱,需要解除禁止。禁止一时半会不知道咋去解禁,于是尝试着替换一个qq邮箱账号进行发送邮件,结果真的是发送成功了。

最新文章

  1. 使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)
  2. 整理:深度学习 vs 机器学习 vs 模式识别
  3. 关于imagic拼接透明背景图片的问题
  4. git 高级命令
  5. POJ 2406 KMP/后缀数组
  6. 1066 Bash游戏
  7. CSS select样式列表-------美化列表
  8. CentOS6.4_x86_开关机查看
  9. Android 编程下的代码混淆
  10. 如何在CODESOFT中自定义删除文档备料
  11. SQL Server Reporting Services – Insufficient Rights Error
  12. delphi if 语句循环语句
  13. POJ1840 hash
  14. 矩阵经典题目六:poj 3070 Fibonacci
  15. Python库
  16. C# — 调用dll出现试图加载不正确格式的程序问题
  17. django登录
  18. 在UWP中实现自己的MVVM设计模式
  19. echarts环形图,自定义说明文字
  20. sudo权限管理

热门文章

  1. AQS系列(五)- CountDownLatch的使用及原理
  2. 面试连环炮系列(十四): HTTP状态码302的跳转逻辑
  3. 程序员offer沟通的4个基本原则
  4. docker拉取慢(net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting head)
  5. Go学习笔记(持续更中,参考go编程基础,go边看边练)
  6. WebShell代码分析溯源(十)
  7. .net core 2.1 Nlog.Web.AspNetCore Nlog日志
  8. HTML基础——基础标签
  9. Ubuntu 18.04安装MySQL
  10. [转]UiPath Installing the Firefox Extension