上一篇说了hmailserver如何设置反垃圾邮件功能,现在来说说如何让自己的hmailserver发出去的邮件不要被别人反垃圾了。
hmailserver的反垃圾邮件功能中有提到给垃圾评分标准,其中比较主要的四个,SPF、HELO、DNS MX、DKIM签名,看hmailserver默认的分值,无疑DKIM签名是最高的,如果校验DKIM失败,直接会当作垃圾邮件的。无疑,如果对方的邮件服务器启用了这几个校验,如果你发出去的邮件未通过,就会被当作垃圾邮件了,我试了一下,都没有设置,发往gmail的邮件直接发送失败,发往腾讯企业邮箱的邮件还收到了。

那如何让这些校验通过呢?首先你最好得有一个固定IP,这样才好设置SPF,需要给你的域名添加一个txt记录,里面包含你邮件服务器的IP。可以用nslookup来查询一下qq.com的txt记录,那就是SPF了,关于SPF的介绍,可以查看http://baike.baidu.com/view/1372988.htm来了解一下。HELO这是直接在hmailserver的Settings-Protocols-SMTP-Delivery of e-mail中的local host name中填写。MX记录解析,这个在域名中添加mx记录即可,最后就到了DKIM签名。
DKIM的全称是Domain Key Identified Mail,域名密钥识别邮件,就是邮件服务器对自己发的邮件签名,表示这个邮件是自己发出去的,如果一个对方邮件服务器能够验证这个签名,就表明这个邮件可能不是垃圾邮件,因为垃圾邮件一般都会伪造地址发送的。那岂不是那些垃圾邮件发送者只要给垃圾邮件也每个签名也能表示它发送的不是垃圾邮件?接收邮件服务器如何能辨别这个签名真假?那发送邮件服务器跟接收邮件服务之间有个约定,呃,你记好了,我的签名是如何如何防伪的,这就是基于私钥与公钥的签名。
发送方基于私钥给邮件DKIM签名,接收方根据发送方的公钥来验证这个DKIM签名,很明显,私钥是给发送邮件服务器来使用的,那公钥如何传输呢?不多说了,了解一下就行了,下面是网上的介绍。

一些签名的具体细节:
1、算法,必须支持rsa-sha256,可选支持rsa-sha1。key size建议1024。
标准化(Canonicalization). 有的邮件服务器可能会少量修改文件内容,比如换行或者移除一些空格等等。因此DKIM定义了两种2、标准化方法,simple和relaxed。simple最简单,就是一个字节也不能改,改了就错。relaxed就是可以少量的修改一些空格等等。邮件头和内容这两部分的标准化可以选择不同的方法,表示起来用/隔开,比如simple/relaxed表示头部用simple方式,内容用relaxed方式来标准化。
3、过程,签名是先对内容(body)部分hash,然后把这个body hash放在header里面,再对头部做签名。头部也不是所有字段都签名的,只有一些常用的字段,或者比较有意义的,会被签名。像Received和Return-Path这样的字段一般不被签名。而From则必须被签名。

下面我们来给hmailserver加上DKIM签名,工欲善其事,必先利其器,咱们得把器准备好,hmailserver这个主角可不能少,当然,用其他的邮件服务器也可以参考一下。
Openssl,我们要用它来生成私钥与公钥,在这里下载openssl的windows版本,根据需求吧,64位系统就下64位的,我这里下的是Win32 OpenSSL v1.0.0a,安装这个得先安装Visual C++ 2008 Redistributables,呃,中文windows就下中文的,英文就下英文的,别搞得装不上重下,装好openssl咱就来生成密钥吧。
详情可以参考一下这篇文章
http://www.elandsys.com/resources/sendmail/dkim.html
默认openssl安装在C:\OpenSSL-Win32,按照下面命令生成

cd C:\OpenSSL-Win32\bin
openssl.exe genrsa -out rsa.private 1024 //生成私钥
openssl.exe rsa -in rsa.private -out rsa.public -pubout -outform PEM //生成公钥

然后会看到bin目录下多了两个文件rsa.private与rsa.public,先把私钥rsa.private移到hmailserver的安装目录去,然后用记事本打开rsa.public,里面有一串base64编码的字符串,掏出来,然后到域名解析的控制面板去添加一个txt记录,名称为hmail._domainkey(hmail这个可自定义,后面的_domainkey是必需的),记录值为k=rsa; t=y; p=base64,这个p=后面的base64换成rsa.public里面的那串字符串,t=y表示测试模式,告诉接收服务器忽略DKIM签名,可以去掉,也可以加个v=DKIM1来说明版本,添加完txt记录,可以用以下命令来查看一下是否生效了

nslookup
set type=txt
hmail._domainkey.domain.com //domain.com替换为你的域名

如果看到像下面的结果就表示生效了

非权威应答:
s0907._domainkey.qq.com text =

“k=rsa; t=y; p=MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhAJJepXlnnJe5bFumOeyG8v2W8
LFpudv3kOkV3eMapHGkl1TU6hgVCyNSOJgYgQkvozdZRJ5b9d7FJsrEhHbeR+klTcLYCe1u1HP7HbxdU
fDU34szV/Tc0rE125WENSGXlwIDAQAB”

这里公钥就设置完成,然后在hmailserver邮件服务器中设置私钥。
打开到Domains-你的域名-DKIM signing,选上Enabled激活DKIM签名先,
Private key file就选择之前移到hmailserver目录的rsa.private文件,
Selector里填入hmail,这个要跟添加txt记录时_domainkey前面的值一致。
Header method与Body method都选择Relaxed,前面说了Simple比较严格一些,如果你添加的记录里面多或少了一个空格,那就通不过了。
Signing algorithm,签名算法,SHA1肯定是赶不上SHA256安全,不过SHA256加密时占用CPU资源会高一些,根据你自己的需求选吧。
设置完成,当然得Save一下,然后发个邮件给gmail试试,呃,为啥选gmail呢,因为gmail比较好看,比较好看原始邮件,可以在里面查找到dkim=pass字样,还有dkim-signature后面的签名,OK,成功了,DKIM签名就说到这里,费了一中午时间。
并不是说你做到了这样你的邮件就不会被判为垃圾邮件了,只是少了许多可能罢了,还有方方面面的原因,比如你的ip在rbl里之类的,不在赘述。

最后还是补充一点关于SPF记录的设置吧,让你的邮件通过SPF验证,哪怕你是动态IP,也一样过
参考:http://www.linuxfocus.org/ChineseGB/December2004/article354.shtml
SPF 记录包含在一个 TXT 记录之中,格式如下:v=spf1 [[pre] type [ext] ] … [mod]
最常见的就是v=spf1 ip4:xxx.xxx.xxx.xxx ~all,还有v=spf1 include:sub.domain.com ~all,实际上一样的。
参数描述
v=spf1,SPF 的版本,如果使用 Sender ID 的话,这个字段就应该是 v=spf2
ip4:xxx.xxx.xxx.xxx或include:sub.domain.com,include:包含一个给定的域名的测试,include:domain 的形式书写。
ip4:使用 IPv4 进行验证,这个可以以 ip4:ipv4 或 ip4:ipv4/cidr 的形式使用。建议使用这个参数,以减少域名服务器的负荷。
还有几个可选参数:
ip6:使用 IPv6 进行验证
a:使用一个域名进行验证,这将引起对域名服务器进行一次A记录查询,可以按照a:domain, a:domain/cidr a/cidr 的形式来使用。
mx:使用DNS MX记录进行验证,MX记录定义了收信的MTA,这可能和发信的MTA是不同的,这种情况基于mx的测试将会失败,可以用mx:domain, mx:domain/cidr或mx/cidr这些形式进行mx验证。
ptr:使用域名服务器的PTR记录进行验证,这时,SPF使用PTR记录和反向图进行查询。如果返回的主机名位于同一个域名之内,就验证通过了,这个参数的写法是ptr:domain
exist:验证域名的存在性,可以写成exist:domain的形式。
另外可用ext对上面的几个参数进行的扩展,如果没有这个字段,那么仅使用单个记录进行问询。
看了上面的几个应该明白了吧,既然我动态IP没法用IP地址来验证,我可以验证mx、验证域名是否存在,这样就可以了,于是老夫发到gmail的邮件,里面就会显示已经通过了。
信息如下:

Return-Path:
Received: from mail.osmail.cn ([121.35.164.244])
by mx.google.com with SMTP id o2si8011332ybn.89.2010.11.18.23.51.54;
Thu, 18 Nov 2010 23:51:55 -0800 (PST)
Received-SPF: pass (google.com: domain of admin@osmail.cn designates 121.35.164.244 as permitted sender) client-ip=121.35.164.244;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of admin@osmail.cn designates 121.35.164.244 as permitted sender) smtp.mail=admin@osmail.cn; dkim=pass (test mode) header.i=@osmail.cn
dkim-signature: v=1; a=rsa-sha256; d=osmail.cn; s=hmail;
c=relaxed/relaxed; q=dns/txt; h=From:Subject:Date:Message-ID:To:MIME-Version:Content-Type;
bh=KJqaSfBaD5OTEAwPyYjfJB0AduS/gOcD2VRqIXQZ69k=;
b=dMePUGCBJVvJNuATpLIEH8XaL5IeWHufhDYf4nCpWd0MvLt3DtfRCNsuyA413wsGoaSZJ/OXxXU0GdJ/

转:http://dagai.net/archives/870

给hmailserver添加DKIM签名的更多相关文章

  1. 给hMailServer添加DKIM图文教程

    https://www.hmailserver.org/viewtopic.php?f=4&t=12

  2. C#实现.Net对邮件进行DKIM签名和验证,支持附件,发送邮件签名后直接投递到对方服务器(无需己方邮件服务器)

    项目地址 https://github.com/xiangyuecn/DKIM-Smtp-csharp 主要支持 对邮件进行DKIM签名,支持带附件 对整个邮件内容(.eml文件)的DKIM签名进行验 ...

  3. 给hmailserver添加SSL支持

    我们使用stunnel来给hmailserver添加ssl支持,stunnel是一个开源跨平台提供全局TLS/SSL支持的软件,它可以给很多本身不支持ssl的软件来提供安全的加密连接,同样可以用于hm ...

  4. webAPI过滤器添加参数签名

    项目需求: 接口对安卓和IOS开发接口,需要房子用户窜改数据请求接口.添加sign签名校验参数. 代码如下:加上特性标签就可以控制部分接口验证 public class SignAuthorizeFi ...

  5. Windows Server 2008 R2 下配置TLS1.2,添加自签名证书

    前言 2017年1月1日起App Store上的所有App应用将强制开启ATS功能. 苹果的ATS(App Transport Security)对服务器硬性3点要求: ① ATS要求TLS1.2或者 ...

  6. apk添加系统签名

    上一节,可以通过添加su的方式获取系统权限,但这种存在安全隐患,故不推荐,本文通过获取数字签名方式获取系统权限. 在我们的AndroidManifest.xml中添加    android:share ...

  7. 使用InternalsVisibleToAttribute给assembly添加“友元assembly”特性遭遇"强签名"

    一.如何让Intenal成员暴露给另一个程序集 我们知道Modifier为Internal的类型成员仅限于当前程序集能够访问,但是在某些情况下,我们希望将它们暴露给另一个程序集.比较典型的应用场景包括 ...

  8. 使用签名来保证ASP.NET MVC OR WEBAPI的接口安全

    当我们开发一款App的时候,App需要跟后台服务进行通信获取或者提交数据.如果我们没有完善的安全机制则很容易被别用心的人伪造请求而篡改数据. 所以我们需要使用某种安全机制来保证请求的合法.现在最常用的 ...

  9. DKIM对发送邮件的好处及使用方法

    关于DKIM: What is DKIM? 简单的来说dkim有益于增加邮件服务供应商中的反垃圾邮件系统评分,减少邮件内容被评为垃圾邮件的概率. 但使用它不等同于不会被评为垃圾邮件.另外,邮件的发送次 ...

随机推荐

  1. Git:本地建服务器及入门使用方法

    1. 安装与配置Git服务器 sudo apt-get install git 1.1 注册一个git账号, 用于运行和维护git sudo adduser git 1.2 创建证书登录: 收集所有需 ...

  2. python 廖雪峰的官方网站

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316119884678 ...

  3. ARouter原理剖析及手动实现

    ARouter原理剖析及手动实现 前言 路由跳转在项目中用了一段时间了,最近对Android中的ARouter路由原理也是研究了一番,于是就给大家分享一下自己的心得体会,并教大家如何实现一款简易的路由 ...

  4. [转载]震惊!QWidget竟然可以嵌入到QML中,QMl窗口句柄竟然是这样获取

      背景 记得在初学qml时,就被大佬告知Qml的实现有两种方式“view+item”和“engine+widow”,那么能不能将QWidget嵌入到QML中来呢,我收到的答案是不可以,原因是QML的 ...

  5. 高性能Javascript(1)

    第一部分 加载与运行 <html> <head> <title>Script Example</title> </head> <bod ...

  6. LightCapture for Mac(流程化截图工具)破解版安装

    1.软件简介    LightCapture 是 macOS 系统上的截图软件.LightCapture Mac 版号称是用最简洁的方式来截图,其的界面也确实非常简单整洁,不过功能同样出色,一键截屏. ...

  7. mark 阿里支付

    开源软件企业版特惠高校版博客 我的码云 ·· 8月18日(周六)成都源创会火热报名中,四位一线行业大牛与你面对面,探讨区块链技术热潮下的冷思考. 开源项目 > WEB应用开发 > Web开 ...

  8. 使用VisualSVN Server搭建SVNserver (Windows环境为例)

    使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和Apache相配合来实现源代码的 SVN管理简单的多,下面就看看详细的说明. VisualSVN Server的 ...

  9. JEECG中表单提交的中断

    JEECG平台中基于form表单封装了<t:formvalid>标签,对应实现的类为FormValidationTag.java文件. 很多时候在正式向后台提交数据前想要做判断处理,若通过 ...

  10. Vert.x 示例

    //filename: MainVerticle.java package io.vertx.guides.wiki; import io.vertx.core.AbstractVerticle; i ...