读书人

关于用System.Net.Mail发送邮件 碰到的

发布时间: 2012-05-05 17:21:10 作者: rapoo

关于用System.Net.Mail发送邮件 碰到的问题
Dim mail As New SmtpClient
'//发送方式
mail.DeliveryMethod = SmtpDeliveryMethod.Network
'smtp 服务器
mail.Host = "mail.eye.ac.cn"
'mail.Port = 25
'用户凭证
mail.Credentials = New System.Net.NetworkCredential("ld@mail.eye.ac.cn", "***")
mail.UseDefaultCredentials = True
Dim message As New MailMessage
message.From = New MailAddress("ld@mail.eye.ac.cn")
message.To.Add("cha@chardu.org")
message.Subject = "test" '邮件标题
message.Body = "程序test" '邮件主要内容
'//正文编码
message.BodyEncoding = System.Text.Encoding.UTF8
' //设置为HTML格式
message.IsBodyHtml = True
'//优先级
message.Priority = MailPriority.High
''建立一个attachment类型变量,附件(附件地址)
'Dim myad As New Attachment("D:\全国合理用药监测系统\温州医学院附属眼视光医院药品购进、库存信息项(西药)2009-05.xls")
' ''把附件 attachment变量添加到邮件变量中
'message.Attachments.Add(myad)
Try
mail.Send(message)
Catch ex As Exception
SuMsg(ex.Message)
End Try
以上是我的代码,发送的时候的bug是:不允许使用邮箱名称。 服务器响应为: sorry, you don't authenticate or the domain isn't in the list of allowed rcpthosts.这是什么原因呢?如果我把message.To.Add("cha@chardu.org")改成message.To.Add("ld@mail.eye.ac.cn")又是可以的的。网上说这是主要都和我们申请的免费邮箱有关系。难道就没有解决方案了吗?在线急等。忘高手赐教

[解决办法]
原因很简单:
1 你的邮箱帐号不是VIP的
2 各家邮件服务器提供商对免费邮箱的SMTP处理机制不一样,基本上都有所限制,除了VIP
3 如果有时可以发有时不可以发,那是因为邮件服务器每次都判断发出邮件的地址频率很高或
是tom.com|sohu.com|163.com...其他邮件服务商的。如果是这样把该邮件判断成垃圾邮件或不受理的邮件

解决办法:
1 申请VIP邮箱,会开通通畅的SMPT,那就可以合法使用了
2 发邮件时,发出人邮箱地址的@后缀用随机算法(比如 是 123@abc123.com\123@ubc23.com...)构造后再发出,
就可以解决问题。当然,这样做的毙命是收件人收到邮件后看到的发件人邮箱地址的@???就不是真实的,就说他无法
直接用该地址给回复邮件!

不知道我表达的是否清楚?

那还有其他方法:
1 自己去了解底层的邮件协议,像FOXMAIL那样做,内置邮件服务系统
2 自己构建邮件系统,第3方的
3 就是上面说的:@地址混淆法
适用于网站,因为收件人一般不会给网站回邮件,如果你要做FOXMAIL,那就要用1,2方法了!
[解决办法]

C# code
//发邮件//confusionFromMail:是否产生迷惑邮件服务器的邮件地址//EncryptOption:是否加密邮件//mailDESKey:加密邮件时的DES KEYpublic static void SendMail(            string smtpHost, int smtpPort,             string smtpUser, string smtpPassword,            string fromMail, string sender,             string toMail, string receiver,            string subject, string body,            string attachment, string attachName,            bool smtpByIIS, bool smtpEnableSSL,             bool smtpEnableAuth, bool confusionFromMail, EncryptOption mailEncrypt, string mailDESKey            )        {            //Smtp Server            SmtpClient smtpServer = new SmtpClient(smtpHost, smtpPort);            smtpServer.UseDefaultCredentials = true;            if (smtpEnableAuth)            {                smtpServer.UseDefaultCredentials = false;                smtpServer.Credentials = new System.Net.NetworkCredential(smtpUser, smtpPassword);            }            smtpServer.DeliveryMethod = SmtpDeliveryMethod.Network;            smtpServer.EnableSsl = smtpEnableSSL;            //Confusion Mail 产生迷惑邮件服务器的邮件地址            string frMail = fromMail;            if (confusionFromMail) frMail = [b]BMailHelper.MakeConfusionMail(fromMail);[/b]            //Mail Message            Encoding encoding = Encoding.GetEncoding("GB2312");            MailAddress fromMailAddress = new MailAddress(frMail, sender, encoding);            MailAddress toMailAddress = new MailAddress(toMail, receiver, encoding);            MailMessage mailMessage = new MailMessage(fromMailAddress, toMailAddress);            mailMessage.Priority = MailPriority.High;            //Attachment            string encryptAttachment = EncryptHelper.SignatureAndEncrypt(attachment, mailDESKey, mailEncrypt);            System.Net.Mail.Attachment att = System.Net.Mail.Attachment.CreateAttachmentFromString(encryptAttachment, BFormatingMail.AttachName);            att.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;            att.NameEncoding = encoding;            att.Name = attachName;            mailMessage.Attachments.Add(att);            //Body            mailMessage.SubjectEncoding = encoding;            mailMessage.Subject = subject;            mailMessage.BodyEncoding = encoding;            mailMessage.Body = EncryptHelper.SignatureAndEncrypt(body, mailDESKey, mailEncrypt);            //Sending            smtpServer.Send(mailMessage);            smtpServer.ServicePoint.CloseConnectionGroup(smtpServer.ServicePoint.ConnectionName);        }        /// 产生迷惑邮件服务器的邮件地址        /// <param name="targetMail">发件地址.</param>        [b]public static string MakeConfusionMail(string targetMail)[/b]        {            string s1 = BFormatingMail.GetEmailPart(targetMail, 1) ?? string.Empty;            string[] domains = new string[] {                "asys.com", "aspt.com", "aast.com", "aaet.com",                "bsys.com", "bspt.com", "bast.com", "baet.com",                "csys.com", "cspt.com", "cast.com", "caet.com",                "dsys.com", "dspt.com", "dast.com", "daet.com",                "esys.com", "espt.com", "east.com", "eaet.com",                "fsys.com", "fspt.com", "fast.com", "faet.com",                "gsys.com", "gspt.com", "gast.com", "gaet.com",                "amou.com", "acat.com", "apig.com", "acar.com",                "bmou.com", "bcat.com", "bpig.com", "bcar.com",                "cmou.com", "ccat.com", "cpig.com", "ccar.com",                "dmou.com", "dcat.com", "dpig.com", "dcar.com",                "emou.com", "ecat.com", "epig.com", "ecar.com",                "fmou.com", "fcat.com", "fpig.com", "fcar.com",                "hmou.com", "hcat.com", "hpig.com", "hcar.com",                "imou.com", "icat.com", "ipig.com", "icar.com",                "jmou.com", "jcat.com", "jpig.com", "jcar.com",                "kmou.com", "kcat.com", "kpig.com", "kcar.com",                "lmou.com", "lcat.com", "lpig.com", "lcar.com",                "mmou.com", "mcat.com", "mpig.com", "mcar.com",                "nmou.com", "ncat.com", "npig.com", "ncar.com",                "ayal.com", "ayat.com", "aybt.com", "ayag.com",                "byal.com", "byat.com", "bybt.com", "byag.com",                "cyal.com", "cyat.com", "cybt.com", "cyag.com",                "dyal.com", "dyat.com", "dybt.com", "dyag.com",                "eyal.com", "eyat.com", "eybt.com", "eyag.com",                "fyal.com", "fyat.com", "fybt.com", "fyag.com",                "gyal.com", "gyat.com", "gybt.com", "gyag.com",                "hyal.com", "hyat.com", "hybt.com", "hyag.com",                "iyal.com", "iyat.com", "iybt.com", "iyag.com",                "jyal.com", "jyat.com", "jybt.com", "jyag.com",                "kyal.com", "kyat.com", "kybt.com", "kyag.com"            };            int index = (new Random()).Next(1, domains.Length);            if (index <= 0) index = 1;            string s2 = domains[index - 1];            return string.Format("{0}@{1}", s1, s2);        } 


[解决办法]
我做过邮件群发器,这个问题的根本原因在于,cha@chardu.org 这个邮件服务器会对你的 发送人地址进行mx反向解析,反向解析你发时的ip地址是否和解析出来的ip地址相同。如果相同,则通过。如果不同,则认为是垃圾邮件,不给通过。现在国外的邮箱都是要认证的。
大家看到gmail基本没有垃圾邮件,而sohu.com垃圾邮箱成堆,前者做了反向解析,后者没有做反向解析。
其实大家也发现,gmail也有垃圾邮件,但纯粹的垃圾邮件 极其罕见!
我做的邮件群发可以识别反向解析,这儿就不方便介绍了,免得垃圾邮件成灾...

读书人网 >VB Dotnet

热点推荐