SmtpClient发邮件时为什么用MailMessage.From而不用MailMessage.Sender

今天在看C#高级编程(第9版)的时候,在768页看到这样的一段代码

SmtpClient sc = new SmtpClient();
sc.Host = "邮箱服务器地址";
MailMessage mm = new MailMessage();
mm.Sender = new MailAddress("公司邮箱", "发件人");
mm.To.Add(new MailAddress("我的163邮箱", "接收人"));
mm.CC.Add(new MailAddress("抄送的邮箱", "抄送人"));
mm.Subject = "测试程序发送邮件";
mm.Body = "<b>我发送了邮件---我是程序发出的</b>";
mm.IsBodyHtml = true;
mm.Priority = MailPriority.High;
sc.Send(mm);

以前没有做过Email项目,所以,直接就敲到了VS下,编译,但是出问题,报了个错

我心思是没有指定发件人的用户名和密码,因此又增加了一行代码

sc.Credentials = new System.Net.NetworkCredential("发件邮箱", "密码");

但是依然报这个错误,继续找办法吧,看了看网上其他人发邮件的代码,发现他们用的是From,因此,又增加了一行代码

mm.From = new MailAddress("公司邮箱", "发件人");

发现顿时就好使了,而且两个可以同时存在,或单独From存在,都好使。

这……我就郁闷了,因为F12定位到定义,From和Sender的注解里面只差了一个字

一个是发信人,一个是发件人,而且From是发信人,Sender是发件人,一字之差不应该Sender不好使,From好使啊,疑惑增加ing……

那就用ILSpy反编译看一下吧

我擦,更加疑惑,不可能只是因为From比Sender多了一个判断是否为null就用From吧。

那就继续看反编译的代码吧。在SmtpClient里找到Send方法,代码如下

public void Send(MailMessage message)
        {
            if (Logging.On)
            {
                Logging.Enter(Logging.Web, this, "Send", message);
            }
            if (this.disposed)
            {
                throw new ObjectDisposedException(base.GetType().FullName);
            }
            try
            {
                if (Logging.On)
                {
                    Logging.PrintInfo(Logging.Web, this, "Send", "DeliveryMethod=" + this.DeliveryMethod.ToString());
                }
                if (Logging.On)
                {
                    Logging.Associate(Logging.Web, this, message);
                }
                SmtpFailedRecipientException ex = null;
                if (this.InCall)
                {
                    throw new InvalidOperationException(SR.GetString("net_inasync"));
                }
                if (message == null)
                {
                    throw new ArgumentNullException("message");
                }
                if (this.DeliveryMethod == SmtpDeliveryMethod.Network)
                {
                    this.CheckHostAndPort();
                }
                MailAddressCollection mailAddressCollection = new MailAddressCollection();
                if (message.From == null)
                {
                    throw new InvalidOperationException(SR.GetString("SmtpFromRequired"));
                }
                if (message.To != null)
                {
                    foreach (MailAddress current in message.To)
                    {
                        mailAddressCollection.Add(current);
                    }
                }
                if (message.Bcc != null)
                {
                    foreach (MailAddress current2 in message.Bcc)
                    {
                        mailAddressCollection.Add(current2);
                    }
                }
                if (message.CC != null)
                {
                    foreach (MailAddress current3 in message.CC)
                    {
                        mailAddressCollection.Add(current3);
                    }
                }
                if (mailAddressCollection.Count == 0)
                {
                    throw new InvalidOperationException(SR.GetString("SmtpRecipientRequired"));
                }
                this.transport.IdentityRequired = false;
                try
                {
                    this.InCall = true;
                    this.timedOut = false;
                    this.timer = new Timer(new TimerCallback(this.TimeOutCallback), null, this.Timeout, this.Timeout);
                    string pickupDirectory = this.PickupDirectoryLocation;
                    switch (this.DeliveryMethod)
                    {
                    case SmtpDeliveryMethod.Network:
                        goto IL_235;
                    case SmtpDeliveryMethod.SpecifiedPickupDirectory:
                        break;
                    case SmtpDeliveryMethod.PickupDirectoryFromIis:
                        pickupDirectory = IisPickupDirectory.GetPickupDirectory();
                        break;
                    default:
                        goto IL_235;
                    }
                    if (this.EnableSsl)
                    {
                        throw new SmtpException(SR.GetString("SmtpPickupDirectoryDoesnotSupportSsl"));
                    }
                    bool allowUnicode = this.IsUnicodeSupported();
                    this.ValidateUnicodeRequirement(message, mailAddressCollection, allowUnicode);
                    MailWriter mailWriter = this.GetFileMailWriter(pickupDirectory);
                    goto IL_275;
                    IL_235:
                    this.GetConnection();
                    allowUnicode = this.IsUnicodeSupported();
                    this.ValidateUnicodeRequirement(message, mailAddressCollection, allowUnicode);
                    mailWriter = this.transport.SendMail(message.Sender ?? message.From, mailAddressCollection, message.BuildDeliveryStatusNotificationString(), allowUnicode, out ex);
                    IL_275:
                    this.message = message;
                    message.Send(mailWriter, this.DeliveryMethod > SmtpDeliveryMethod.Network, allowUnicode);
                    mailWriter.Close();
                    this.transport.ReleaseConnection();
                    if (this.DeliveryMethod == SmtpDeliveryMethod.Network && ex != null)
                    {
                        throw ex;
                    }
                }
                catch (Exception ex2)
                {
                    if (Logging.On)
                    {
                        Logging.Exception(Logging.Web, this, "Send", ex2);
                    }
                    if (ex2 is SmtpFailedRecipientException && !((SmtpFailedRecipientException)ex2).fatal)
                    {
                        throw;
                    }
                    this.Abort();
                    if (this.timedOut)
                    {
                        throw new SmtpException(SR.GetString("net_timeout"));
                    }
                    if (ex2 is SecurityException || ex2 is AuthenticationException || ex2 is SmtpException)
                    {
                        throw;
                    }
                    throw new SmtpException(SR.GetString("SmtpSendMailFailure"), ex2);
                }
                finally
                {
                    this.InCall = false;
                    if (this.timer != null)
                    {
                        this.timer.Dispose();
                    }
                }
            }
            finally
            {
                if (Logging.On)
                {
                    Logging.Exit(Logging.Web, this, "Send", null);
                }
            }
        }

看代码里我注红色的部分,可以发现,Send方法,必须要求From存在,如果From不存在的话,就会抛出异常,但是并没有强制要求Sender存在,Sender可以存在,如果Sender存在就用Sender,不存在就用From,但是必须保证From存在。

时间: 2024-08-26 15:00:10

SmtpClient发邮件时为什么用MailMessage.From而不用MailMessage.Sender的相关文章

用foxmail发邮件时出现 错误信息::ssl连接错误, errorCode: 5

用foxmail发邮件时出现 错误信息::ssl连接错误, errorCode: 5 解决办法:设置--账号设置--服务器--勾掉ssl复选框

ant发邮件时遇到的问题

1. 在本地环境上搭建了jmeter+ant+jenkins环境,遇到邮件发不出的问题,解决办法如下: 在ant的安装包下的lib里加上四个jar包:mail-1.4.7.jar,commons-email-1.2.jar,activation.jar,ant-javamail.jar,见附件或者自行下载. 然后在build.xml中加上发邮件相关的:  <target name="sendEmail">         <mail             from=

javax.mail 发邮件时添加附件

import java.util.Properties; import javax.mail.Authenticator; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import

python使用SMTP发邮件时使用Cc(抄送)和Bcc(密送)

SMTP发送邮件的时候,并没有特殊的通信语句告诉邮件服务器 谁是主送,谁是抄送/密送,这三个角色都是以同样的方式告诉邮件服务器的,然后重点在邮件内容里. 邮件内容分为头和体两部分(就像http),头部包含了各种meta信息,其中说明了谁要用to,谁要cc,谁要bcc. 一个典型的带to和bcc的邮件发送过程debug日志如下: send: 'ehlo E42.lan\r\n' reply: b'250-smtp.qq.com\r\n' reply: b'250-PIPELINING\r\n' r

[转载]发邮件组件Nodemailer——nodejs中间件系列

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站,我们自己的Geek网站!! 关于作者 张丹(Conan), 程序员Java,R,PHP,Java

python学习(5)--网易邮箱发邮件异常解决办法

在用python发邮件时,发现用网易邮箱作为发件人.会出现以下异常: smtplib.SMTPDataError: (554, b'DT:SPM 163 smtp12,EMCowxxn7yO5rI9bT0uuEg--.45230S2 1226142521,please see http://mail.163.com/help/help_spam_16.htm?ip=133.13.132.12&hostid=smtp12&time=1533242532') 通过查看上面的网址:http://

如何使cron任务出错时发邮件

如果设置了 MAILTO,cron就会将任务的标准输出和标准错误输出重定向到邮箱(即发送邮件).但如果只想接到错误报警邮件 -- 即任务正常执行时不发送,只在出错时发送 -- 应该怎么实现呢? 方法很简单,指定该任务的标准输出为 /dev/null 就可以了. [email protected] #m   h dom mon dow user  command 0   1    *     *     *     root   script.sh > /dev/null 这样,正常执行的时候,不

检测所有磁盘分区使用率和inode使用率,当发现某分区容量或者inode量大于85%时,发邮件通知你

监控磁盘使用率 写一个shell脚本,检测所有磁盘分区使用率和inode使用率并记录到以当天日期为命名的日志文件里,当发现某个分区容量或者inode使用量大于85%时,发邮件通知你自己. 思路:1.就是先df -h 然后过滤出已使用的那一列,然后再想办法过滤出百分比的整数部分,然后和85去比较,同理,inode也是一样的思路. 2.df -h.df -i 记录磁盘分区使用率和inode使用率,date +%F 日志名格式3.取出使用率(第5列)百分比序列,for循环逐一与85比较,大于85则记录

杂项收集,包括-发邮件、二维码生成、文件下载、压缩、导出excel

本篇就最近工作解决的问题做个代码收集.包括以下几个方面:发邮件.二维码生成.文件下载.压缩.导出excel.有一种可用的解决方法就好,不求全面,不求原理. 1.发邮件: 命名空间:System.Net.Mail程序集:System(在 system.dll 中) tips: MailMessage 类的实例用于构造可使用 SmtpClient 类传输到 SMTP 服务器以便传递的电子邮件. 若要指定电子邮件的发件人.收件人和内容,请使用 MailMessage 类的关联属性.一般需要注意的有 发