.Net实现邮件定时发送问题总结

环境:
Windows下使用C#实现邮件发送,用的是163邮箱
步骤:
1)登录163邮箱,选择设置-》POP3/SMTP/IMAP设置
开启SMTP服务
2)开启客户端授权码,并设置授权码(此授权码会用于客户端用户登录凭证密码)
3)使用System.Net.Mail实现邮件发送

问题:
采用25端口,在本地实现邮件发送,发送成功,而将程序部署到服务器,却无法发送。
排查:
1)在服务器上,打开命令提示符, 输入:telnet smtp.163.com 25
返回:正在连接smtp.163.com…无法打开到主机的连接。 在端口25:连接失败。
由此判断,可能是由于服务器关闭端口导致,经查实,猜测正确
https://help.aliyun.com/knowledge_detail/51777.html
尝试方案:
1)改为SSL连接,使用465端口,163邮箱服务器SSL设置帮助如下:
http://help.163.com/10/1111/15/6L7HMASV00753VB8.html
2)在服务器上,打开命令提示符,输入:telnet smtp.163.com 465
进入telnet页面(全黑),光标闪烁,表示465端口正常
3)在代码里修改端口为465,设置EnableSSL=true,尝试发送,发送失败。
搜索查询,得到的问题答案是:
System.Net.Mail只支持显式SSL
引发的问题:
1)什么是显式SSL和隐式SSL
explicit SSL:
explicit SSL会执行以下操作:尝试连接25端口 -> 申请加密连接( StartTLS)-> 认证-> 发送数据, 如果SMTP服务器要求一开始就需要加密连接,那么使用explicit SSL 就会发送失败
implicit SSL:
申请加密连接(Start SSL) -> 连接-> 认证-> 发送数据
(参考来源:
https://blogs.msdn.microsoft.com/webdav_101/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465/
2)怎么验证邮箱服务器是使用explicit SSL 还是 implicit SSL:
按惯例来说,使用25端口正常模式下的SMTP发送,使用的是显式的SSL,而使用465端口,采用SSL协议的SMTPS发送,使用的是隐式SSL,邮件发送使用587端口的使用的是显式SSL。
想要确定到底是使用哪一种SSL,可以通过Telnet端口号来确定,比如”telnet smtp.163.com 25.如果服务器返回文本信息标识连接成功,那么你就是在使用显式SSL连接,如果你连接成功但没有看到任何返回,那么你就是使用隐式SSL连接
(参考来源: https://stackoverflow.com/questions/172811/is-there-a-way-i-can-tell-whether-an-smtp-server-is-expecting-a-client-to-connec
最终方案:
使用第三方插件 Aegis Implicit Mail (AIM) V1.0.3
https://sourceforge.net/p/netimplicitssl/wiki/Home/
遇到问题:
1)
如果发送的邮件内容中包含HTML内容,需要使用以上带6个参数的MimeMailer的构造函数,邮件才能正确显示HTML

 _mailer = new MimeMailer(smtpInfo.SmtpHost, smtpInfo.SmtpPort.Value, smtpInfo.SmtpUserName,
                smtpInfo.SmtpPassword, SslMode.Ssl, AuthenticationType.Base64);

2)发送的主题包含中文,无法正确显示。(乱码)
最后还是修改了插件源码,给主题加上使用UTF-8编码才解决了问题。

主要参考:
http://www.ruanyifeng.com/blog/2008/06/mime.html
https://en.wikipedia.org/wiki/MIME#Difference_between_Q-encoding_and_quoted-printable

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: .NET Core 可以使用多种方式来实现定时任务。 1. 使用 System.Threading.Timer 类: 这是一个内置类,可以在指定的时间间隔内执行指定的方法。 例如: ``` using System; using System.Threading; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Timer t = new Timer(ExecuteTask, null, 0, 2000); Console.ReadKey(); } private static void ExecuteTask(Object state) { Console.WriteLine("Task Executed"); } } } ``` 2. 使用 Hangfire 第三方库: Hangfire 是一个开源的任务调度库,可以用于创建、调度和监控后台任务。 安装 Hangfire 库: ``` Install-Package Hangfire ``` 在 Startup 类的 Configure 方法中添加以下代码: ``` app.UseHangfireServer(); app.UseHangfireDashboard(); ``` 然后,可以使用以下代码在应用程序中创建定时任务: ``` using Hangfire; namespace ConsoleApp1 { class Program { static void Main(string[] args) { RecurringJob.AddOrUpdate(() => Console.WriteLine("Task Executed"), Cron.Minutely); Console.ReadKey(); } } } ``` 3. 使用 Quartz.NET 第三方库: Quartz.NET 是一个开源的任务调度库,支持多种触发器和作业执行程序。 安装 Quartz.NET 库: ``` Install-Package Quartz ``` 使用以下代码创建定时任务: ``` using Quartz; using Quartz.Impl; namespace ConsoleApp1 { class Program { static void Main(string[] args) { ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); IScheduler scheduler = schedulerFactory.GetScheduler().Result; scheduler.Start ### 回答2: .NET Core 定时任务是在.NET Core 框架下实现的一种功能,用于在指定的时间间隔或特定时间点自动执行特定的任务。 在.NET Core中,有多种不同的方式可以实现定时任务。一种常见的方法是使用 System.Threading.Tasks 命名空间中的 Task 和 TaskScheduler类来执行异步任务,并结合定时器 Timer 类来达到定时执行的效果。开发人员可以在应用程序启动时创建一个定时器对象,并设置触发间隔或特定时间点,然后指定一个任务(或者使用委托)作为定时器的回调函数,在触发时执行。 另一种方式是使用第三方库,如Quartz.Net。Quartz.Net 是一个功能强大的开源定时任务库,它提供了更多的灵活性和精确性,可以支持更复杂的定时任务调度需求。通过Quartz.Net,开发人员可以创建作业和触发器,设置任务执行间隔和时间点,还可以配置任务的失败和重试策略,实现更加高级的定时任务调度。 无论使用哪种方式,都可以在.NET Core应用程序中实现定时任务。定时任务可以用于各种应用场景,例如定时数据备份、日志清理、定时邮件发送等。通过合理地安排定时任务,开发人员可以提高应用程序的稳定性和可靠性,实现一定程度的自动化操作。 总之,.NET Core 提供了多种方式来实现定时任务,开发人员可以根据具体需求选择合适的方法。无论是使用内置的定时器类还是使用第三方库,都可以在.NET Core应用程序中实现定时任务的调度和执行。 ### 回答3: .NET Core是一个跨平台的、开源的开发框架,具有丰富的功能和强大的性能,可以帮助开发者构建高性能的应用程序。其中,定时任务是.NET Core框架的一个常见需求。 在.NET Core中,可以使用多种方式实现定时任务。以下是其中两种常用的方式: 1. 使用Timer类:Timer类位于System.Threading命名空间中,可以用于创建定时任务。通过指定一个时间间隔和一个回调方法,Timer类可以在指定的时间间隔后重复执行回调方法。开发者可以根据业务需求使用Timer类,在指定的时间间隔内执行任务。 2. 使用Hangfire库:Hangfire是一个.NET Core中常用的开源库,用于管理和调度定时任务。Hangfire库提供了简单易用的API,可以轻松实现任务的调度和管理。通过在代码中配置定时任务的执行时间和具体的执行逻辑,Hangfire库可以在指定的时间点执行任务。 以上是.NET Core中实现定时任务的两种常用方式,开发者可以根据具体需求选择合适的方式。无论是使用Timer类还是Hangfire库,都可以帮助开发者轻松实现定时任务,提升应用程序的灵活性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值