7/06/2007

怎样快速解决用本地机的SMTP通过ASP.net 2.0来发送电子邮件的几个小麻烦

ASP.NET今天决定将一些老代码升级到ASP.net 2.0,尤其将一些送电子邮件的代码从以前的 System.Web.Mail 和传统的 CDONT 改为用 System.Net.Mail。这篇文章不是具体讲怎么样写代码去实现这个功能,而是讲我今天遇到的几个SMTP服务器上的设置问题。如果你对代码本身感兴趣,可以参考4GuysfromRolla网站上的英文原文:
http://aspnet.4guysfromrolla.com/articles/072606-1.aspx

我今天刚开始是用 localhost 作为我的主机,连接方式是匿名连接。所以我的 web.config 文件象这样的:

<configuration>
<!-- Add the email settings to the <system.net> element -->
<system.net>
<mailSettings>
<smtp>
<network
host="localhost"
port="25"
/>
</smtp>
</mailSettings>
</system.net>

<system.web>
...
</system.web>
</configuration>

我的asp.net代码是这样:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'!!! UPDATE THIS VALUE TO YOUR EMAIL ADDRESS
Const ToAddress As String = "myname@mycompany.com"
Const UsersEmail As String = "webmaster@mycompany.com"

'(1) Create the MailMessage instance
Dim mm As New MailMessage(UsersEmail, ToAddress)

'(2) Assign the MailMessage's properties
mm.Subject = "Hello, world!"
mm.Body = "This is a message body within ASP.NET."
mm.IsBodyHtml = False

'(3) Create the SmtpClient object
Dim smtp As New SmtpClient

'(4) Send the MailMessage (will use the Web.config settings)
smtp.Send(mm)
End Sub

首先, 出现的SMTP被禁止的问题

运行asp.net网页时,出现了下列错误信息:


An established connection was aborted by the software in your host machine

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine

初步分析,这可能是因为我是在自己的工作台上运行,而我们公司用的反病毒软件 McAfee Enterprise 可能会禁止所有SMTP port 25 的功能。打开 McAfee VirusScan Console,果然发现本机被禁止了SMTP。解决方法是取消如下图的第一个选框,然后按确定保存修改。

VirusScan Console

当然,你也可以更改你发送电邮的 port 号,象不用常规的25而改成其他的。


2), 解决 SMTP 的 relaying 问题

解决了上述问题,我又遇到了另一个错误信息:

Mailbox unavailable. The server response was: 5.7.1 Unable to relay for myname@mycompany.com

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Net.Mail.SmtpFailedRecipientException: Mailbox unavailable. The server response was: 5.7.1 Unable to relay for myname@mycompany.com

不知道具体是哪次的网络设置使得我的台式电脑的IIS不能通过asp.net发送电邮了,但是想起以前在传统里的asp网页制作中也碰到类似问题,所以这次如法炮制。

  1. 打开 IIS 管理界面,先点击 控制面板 --> 管理工具 再选 IIS。
  2. 打开 Default SMTP Virtual Server 然后右击 Domains --> 新建 --> Domain...
  3. 在新建的屏幕上,选 Remote - 远程域名.
  4. 下一屏,填写你准备发送电邮的域名,如上面我代码的例子,我会填上 mycompany.com 然后点 Finish - 完成。
  5. 退出新建后,选中刚建的那个域名,右击打开 Proprieties - 属性 窗口
  6. 选中第一个复选框 Allow incoming mail to be relayed to this domain。
  7. blog_smtp_domain.jpg
你也可以通过你的本地机连接你的公司邮件服务器来转发公司内部或外部的信件,具体做法是将你公司的邮件服务器的IP地址或服务器名输入到上图的转发服务器(Forward all mail to smart host)的文本框内。
切记,输入 IP 地址时,记住用方括号符号来围住 IP address;象这样 [192.168.2.1] 。

另外一些设置改动:

1) 新加域名时,可以用星号表示所有的带有.com的域名 "*.com"
2) 如下图一样,将公司邮件服务器作为本地机的 Smart host 来转发一些本地机不能发送的一些电邮。

blog_smtp_smarthost.jpg

当然: 我今天之所以出现这些小问题,主要是在自己的电脑上测试代码,也许上传到正规网站服务器上就没有这么多问题了。

下一步

通过上述的麻烦,自己决定不用 localhost 来发送asp.net 2 的电子邮件了。下一步是准备修改SMTP host 信息来通过公司的Exchange 邮件服务器来发送我的 asp.net 邮件,那就是另一个会在这讨论的主题了。

Technorati : , ,
Del.icio.us : , ,

标签:

点击此处查看原文...

7/05/2007

怎样让镜像博客网站的游客链接回我的主博客网来留言和对同一文章发表评论

Blogger我以前用的是blogger(http://it.lichao.net),现在将博客全换成 Wordpress平台并搬到了自己的服务器上 (如 http://weblog.lichao.net)。但是我还是想留住 blogspot 网站,一则可以留个备份的,或者做个镜像site;另外,自己一向觉得blogger的静态网页比起 wordPress 在 Google 搜索上有很强的优势。维护两个相同的博客网站不是太麻烦,尤其现在自己都是用离线博客软件来发文。但想让所有网站的游客只在一个地方发表评论就是一个挑战了。

既然我现在主要用 wordpress 平台的博客作为主博,那么我就要想法将所有 blogger 上我的博客的游客引过来。实现这样,包括两步:第一、禁止在镜像网站上的评论功能;第二、每篇文章里都要有指向新博客网站的评论链接。

第一、禁止在镜像网站上的评论功能

在 blogger 网站上禁止评论十分简单。登陆到 blogger.com,然后进入 Setting(设置) --> Comments(评论),在评论页上,选择 Hide (隐蔽) 选项来隐掉所有旧的和新的文章评论。

保存并重新发表你所有文章后,你就会发现你博客网上所有文章没有观看和发表评论的链接了。


第二、每篇文章里都要有指向新博客网站的评论链接

理论上,应该是在镜像博客网站上的每篇文章里都有一个链接,游客一按这个链接就可以直接跳到我主博客网上同一个文章的发表评论处。

可惜,一我不愿意手动在每篇文章里加入此种链接。二由于我的主博并没有按文章标题来做固定链接,所以想从我blogger的文章里自己加上固定链接跳到我主博的文章是有点困难。

我也不愿意只给每个文章加上我主博的首页链接 (http://weblog.lichao.net) ,那样又需要游客重新在我主博上寻找那篇文章。

想了想,就做了一个折衷办法:通过镜像博客文章的标题在主博客里自动搜索到相同主题的帖子。这样,至少游客可以少点麻烦去重新搜寻了。


新版blogger里

首先通过Dashboard(控制板) -->Layout(外观) --> Template(模板) --> Edit HTML(修改HTML)。然后选中修改超文本标志语言的输入框右上角的 Expand Widget Templates (浏览所有widget模板)。

改 HTML 时,先找到标签 <b:if cond='data:blog.pageType != "item"'><b:if cond='data:post.allowComments'> 这是显示文章评论多少的地方,然后加入以下代码。


<!-- added on 2007-07-05 to link back to my main blog -->
<a class='comment-link' expr:href='"http://weblog.lichao.net/?s=" + data:post.title'>View Comments</a>

这个 data:post.title 就可以自动生成文章的标题,并传到主博客网站的搜索网页上去。

改好这个地方后,再到平常显示所有文章评论的地方。在我的blogger模板里,我是先找到以下代码标签:

<b:includable id='comments' var='post'>
<div class='comments' id='comments'>
<a name='comments'/>

<b:if cond='data:post.allowComments'>

再插入自己的代码,插完后的代码就象以下的:

<b:includable id='comments' var='post'>
<div class='comments' id='comments'>
<a name='comments'/>
<!-- added on 2007-07-06 to link back to main blog -->
<a class='comment-link' expr:href='"http://weblog.lichao.net/?s=" + data:post.title'>Please click here to leave your comments</a>
<b:if cond='data:post.allowComments'>

传统旧版的 blogger 的修改方法

旧版的有点不一样,主要是要用 <$BlogItemTitle$> 来自动传递文章的标题。

也是先到你的控制板里,到 Edit HTML 部分。然后找到一般显示评论数的地方,我的是在这里:

<p class="post-footer">
......
<BlogItemCommentsEnabled>
<a class="comment-link" href="<$BlogItemCommentCreate$>"<$BlogItemCommentFormOnclick$>><span style="text-transform:lowercase"><$I18NNumComments$></span></a>
</BlogItemCommentsEnabled>

在</BlogItemCommentsEnabled>后面插入新的代码:

<!-- added by Chao on 2007-07-05 to forward traffic to new weblog site -->
<a class="comment-link" href="http://weblog.lichao.net/?s=<$BlogItemTitle$>" target="_blank"><span style="text-transform:lowercase">查看评论</span></a>

同样在显示所有文章评论的地方,一般在 <!-- Begin #comments -->标签后面。

这个地方改完后就象下面这样:

<!-- Begin #comments -->
<ItemPage>

<div id="comments">

<!-- added by Chao on 2007-07-05 to forward traffic to new weblog site -->

<p style="padding-left:20px;">谢谢你对本文的兴趣和阅读,由于此博客已转为我的镜像博客网,所有文章的评论功能已经取消。如果你想就此文发表评论,请<a href="http://weblog.lichao.net/" target="_blank">按此连接到我的主博客站</a>,然后将你的评论发表到相应的文章后面。若需要帮助来寻找到相应的文章,请试着用相同的文章标题<a href="http://weblog.lichao.net/?s=<$BlogItemTitle$>" target="_blank">进行搜索</a>。

<BlogItemCommentsEnabled><a name="comments"></a>


我的英文原文:http://eblog.lichao.net/archives/2007/programming/web-design/71/

Technorati :
Del.icio.us :

标签:

点击此处查看原文...

5/15/2007

如何快速、轻松地在你网页表单里制作一个简单的Javascript文字(非图片)验证码

javascript_progRef.jpg 如果你要搜索asp,php图片验证码,你可能会得到一大堆可参考的源码。基本上这些都是利用图片生成技术。但是我认为一些简单的随机数字或文字也可以做到这些效果。正巧,最近我必须将我所有的网页表单加上一个验证码以免被人恶意连接以至于产生不必要的表单数据和电子邮件。所以我就决定不借用别人的源码,自己花一点时间把我的上述想法付诸现实。

因为我的网页有 ASP, ASP.NET 也有 PHP 的,所以一个跨网页程序语言的小工具十分有用。Javascript 是我的首选,经过几分钟的摸索,我得到了下面这个简单易运用的小Javascript脚本。你们也可以试一试看!

 

生成一个 Javascript 脚本文件,里面有一个新的文本输入框,隐含表单值和随机产生的文字或数字。

在这个新的脚本里,利用Math.random函数可以快速生成一个4位数的随机数字。

//产生一个四位数的随机数字
var i=parseInt(Math.random()*8999 + 1000);

//新增一个文本输入框到你的网页表单
document.write('<input type="text" name="code_verfiy" value="" />');

//将刚产生的那个随机值赋予给一个新的表单隐含值
document.write('<input type="hidden" name="code" value="' + i + '" />');

//再将刚产生的那个随机值显示出来,从而网页访问者可以照此填写那个新的文本输入框
document.write('<label style="" >' + i + '</label>')

通过脚本调用可以将这个 Javascript 脚本文件放到你的所有网页表单里

调用这个脚本的位置一般来说是放到你提交表单的那个按钮之前。假设我刚才生成的那个脚本文件叫code.js,你的代码会是这样的:

<form name="myForm" action="save.asp">
...... //其他表单内容
<label>Verify Code</label> <script language="JavaScript" type="text/javascript" src="code.js"></script>
....
<input type="submit"....>
</form>

最后,增加一段判断代码来确定提交的表单数据是否来自你的网页本身

不管你是运用同一或单独文件来处理你的表单,你都可以十分简单地加一段代码来判断是否那个随机值被键入。下面的这段代码是用 ASP (VB) 语言写的,如果你使用asp.net,php等,你可以运用它们自己的语法来修改。

'//首先,判断是否有你设定的code_verify值,然后,判断是否匹配你设的那个隐含值 (ASP VB)
If Request.Form("code_verify") = "" OR Request.Form("code_verfiy") <> Request.Form("code") Then
'//如果没有匹配,则停止执行,显示错误信息
Response.write ("error, do not access to this page directly")
Response.End()
Else
'//匹配,一切正常。这下面就是你没有验证码之前的代码。
End If

其他可以改善的地方

好了,你已经有一个可以使用的文本验证码了。如果你还想花时间,你可以将它改的更好。

首先申明,我只在我的网站上测试过,你下载并使用在你自己网站上所带来的所有可能风险,本人概不负责。

好,首先我们可以将那段生成文本输入框的代码从javascript脚本里直接移到你的表单里,这样,你可以用一些客户端脚本来判断它是否被填写。

当然,你还可以增加一些样式使你显示的随机数值看起来像流行的图片验证码,比方说增加一个边框,改变背景和文字颜色等等 (像这个 1234 )。

还有,你也多写一些Javascript来随机产生一些除数字以外的字母等等。

祝大家编程快乐

如果你想参考我的英文原文,请点这 How to create a simple non image validation bar in your web form quicklyhttp://eblog.lichao.net/archives/2007/programming/web-design/52/

Technorati : ,
Del.icio.us : ,

标签:

点击此处查看原文...

5/30/2005

解决Access错误 Selected collating sequence not supported by the operating system

很久以前在唐人街论坛写的一篇文章,自己最近在 Google 查了一下,发现被很多博客转载(不过他们没有注明出处,寒)。所以干脆,转到自己的博客里来算了,时间吗还是按当初发表的时间。

一直想把唐人街中文论坛搬到 1and1 服务器上来。今天总算有空将所有的文件上传来了,但试运行时却发现以下错误提示:

Selected collating sequence not supported by the operating system.

Google了一下,发现不止我一个人有这问题。主要原因是我现在用的这 web hosting 公司用的是英文操作系统英文版OS。论坛所用的 Access文件是动网所附的,言外之意是在中文操作系统下制作的。而根据微软(Microsoft)的官方网站说明:若Access在一种语言下创建,而在另一种语言下使用就会提示这种错误。我原来的 web hosting 公司是支持中文的,所以一直都没事。

微软的技术解释请参见
http://support.microsoft.com/kb//EN-US/

根据微软推荐的解决方法,我知道我是不可能让 1and1 安装多种语言支持包的 -- 因为我曾经给他们技术支持部门打过此类电话(上次是问为什么我的Access中文显示成乱码),被告知他们不会特地为我安装中文包的。

看来这次有得自己动手、丰衣足食了。下面就是我解决此问题的一些过程。

既然微软说是由于建立数据库文件的语言环境的原因,那我是不是可以打开同一语言环境里新建的文件了?在此时,我所想到的“同一语言环境”是同一OS(操作系统)语言环境。因为我现在用的就是英文WinXP,应该是与我的新 web hosting 公司用的一种语言操作系统吧。为证实这个想法,新建一个 Access文件,然后将此新的 Access 文件上传到服务器上,发现照样出现上述问题。结论:不是操作系统的语言版本的问题。

继续找原因。既然我英文WinXP里建立的文件也不行,看来差异就在Access上了。我想我与服务器的差异大概就是我的XP已经装了中文语言支持,而这导致了Access在处理上有些不同。仔细再一读 Microsoft 的技术解释,好像他们提到了数据排序的问题(New Database Sort Order)。我马上打开我的Access程序,然后点"tools"-->"Options",发现我的 New Database Sort Order 既然是 Chinese Character 而不是 General。现在明白了:问题就出在由于不同语言支持的Access新建的文件的默认排序不同。

为顺利解决我的问题:

  1. 打开我的 Microsoft Access ,Open 任意一个文件,然后点"tools",选中 Options,再选 General 项。注意在右下方有 New Database Sort Order下拉框,选中 General。然后关掉该文件。(注意,Options只有在有文件打开的状况下才能使用)
  2. 然后"File" --> "New..." 创建一个空白数据文件,然后"file" --> "Get External Data" -- "Import",打开我的老数据库文件将所有的 tables 全部传到新文件来,然后保存新文件。我要做这步是因为我的论坛里已经有许多的数据在里面,我不愿从头再来。如果你在新建论坛,或新建系统时遇到此类问题,大可新建 table,或用 SQL query 写入初始数据。
  3. 保存此新文件,然后上传到服务器。
  4. 搞定!

谢谢 -- 唐人街论坛版权所有 欢迎转载!

English Keywords: ASP, ACCESS, Chinese database on English Server
原文地址:唐人街论坛版

标签:

点击此处查看原文...