James的安装与使用以及其中可能出现的问题

xiaoxiao2026-03-11  11

[color=darkred][/color]听说James是个不错的java mail server,所以下了个学习,希望可以开发一个自己的mailserver,用别人的太受气了,O(∩_∩)O~ 参考:http://www.iteye.com/topic/213246 http://hi.baidu.com/luoleicn/blog/item/8c382fd4eb86f907a18bb789.html 和相关文档 一、James的安装 [b]环境要求:[/b] JDK1.3+,环境变量JAVA_HOME(我用的是JDK1.6)。 [b] 安装[/b] 1、Apache James 的官方网站为:http://james.apache.org/,当前 Server 的最新版为 2.3.1版. 安装非常简单,下载后得到james-binary-2.3.1.zip 文件,解压后即可。这里假设解压到E盘(E:\james),目录结构如下: [quote]James |_ _apps |_ _bin |_ _conf |_ _ext |_ _lib |_ _logs |_ _tools[/quote] 2、启动 James 服务器 双击或在命令行下执行D:\james\bin 目录下的 run.bat文件(Linux 系统 执行run.sh),即可启动 James 服务器. 如果在控制台看到类似的信息说明启动正常: Using PHOENIX_HOME: E:\jamesUsing PHOENIX_TMPDIR: E:\james\tempUsing JAVA_HOME: D:\jdk1.6.0_02Phoenix 4.2James Mail Server 2.3.1Remote Manager Service started plain:4555POP3 Service started plain:110SMTP Service started plain:25NNTP Service started plain:119FetchMail Disabled 要关闭 James 服务,请使用 Ctrl + C 说明:启动前请确保您的JDK环境变量如JAVA_HOME等已经设置好;James 启动时,其SMTP 服务默认在 25 端口启动,POP3 服务默认在 110 端口启动, NNTP 服务默认在 119 端口启动, 请确保这些端口未被占用。比如本系统下就已经安装了Microsoft的 SMTP 服务,造成 James无法启动,解决方法为:开始--->设置--->控制面板--->管理工具--->服务,打开后找到“Simple Mail Transport Protocol(SMTP)”服务项,关闭即可。 启动成功后,apps目录下多了一个james目录 [quote] james |_ _SAR-INF |_ _conf |_ _logs |_ _var |_mail |_address-error |_error |_indexes |_outgoing |_relay-denied |_spam |_spool |_nntp |_.... … |_users[/quote] SAR-INF 下有一个config.xml是james中的核心配置文件。 Logs 包含了与james有关的Log。调试全靠它了。 Var 包含了一些文件夹通过它们的名字我们大概也能猜测出它们的用途。Mail主要用于存储邮件。nntp主要用于新闻服务器。Users用于存储所有邮件服务器的用户。也就是邮件地址前面的东东。如:pig@sina.com的pig就是所谓用用户。 二、服务配置 服务器启动后会在本机配置一个默认的服务,这可以用来在本机上本服务器范围内收发邮件,但是邮件发不到163等外网邮箱。我们这里关注的重点就是配置一个能发到外网如163这样的邮箱的邮件,这样才有价值。不过由于本人是在本机上测试,一时不能获取公司的域名参数,无法测试接收外网邮箱(如163)的邮件,见晾,不过做法都是一样的,至少我们可以向外网邮箱发送邮件,局域网内可以收、发邮件。 打开E:\james\apps\james\SAR-INF 下的 config.xml 文件,初次启动James之前,不会有这个文件,只有当James服务启动一次之后才自动构件该文件。 找到 …… <postmaster>Postmaster@localhost</postmaster> …… <servernames autodetect="true" autodetectIP="true"> <servername>localhost</servername> </servernames> …… 把localhost该成你自己想要的邮箱域名, 把自动探测IP属性设置为“false”这里假设改成 myself.com 如果开了一个帐号 hx ,那么他的邮件地址就是 hx@myself.com修改结果如下: …… <postmaster>Postmaster@myself.com</postmaster> …… <servernames autodetect="false" autodetectIP="false"> <servername>myself.com</servername> </servernames> …… 找到 <mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor"> <processor> relay-denied </processor> <notice>550 - Requested action not taken: relaying denied</notice> </mailet> 将其注释掉 找到下面元素,去掉其注释 <authRequired>true</authRequired> 这样邮箱访问需要帐号验证,你不希望别人用你的帐号收发消息吧……^_^ 如此,James服务配置已经完成。 三、创建邮件帐号 现在进入命令行控制台,输入telnet localhsot 4555 进入James管理器。 将进入 [quote]JAMES Remote Administration Tool 2.3.1 Please enter your login and password Login id:[/quote] 默认的登陆id 为root 密码也为 root ,登陆成功后结果如下: [quote]Welcome root. HELP for a list of commands[/quote] 创建新用户的命令是:adduser username password 这里创建了两个账户来作为演示使用: hx/hx admin/admin 说明:你可以输入help来获取命令帮助 账号创建成功后,使用quit退出管理器。现在我们可以开始部署我们的JMail应用了。 四、 客户端配置 假设有一个账号,用户名为hx,密码为hx,如何在Outlook中配置呢? 首先,根据用户名,可以得出该用户邮箱地址为hx@myself.com,然后在输入POP3和SMTP服务器时,直接使用服务器机器名myself.com即可 五、用户信息的数据库存储 James邮件用户的用户信息默认保存在apps/james/var/users目录下,通过修改配置文件apps"james"SAR-INF"config.xml,可以把用户信息保存到数据库中,配置方法如下: 假设使用的是MySQL数据库: 第一步:首先将MySQL的驱动程序(例如:mysql-connector-java-bin.jar)考到james的lib目录下(例如:E:/james/lib) 第二步:在MySQL中新建一个数据库mail; 第三步:打开config.xml,找到<users-store>这一项,此面默认的内容为: [quote]<repository name="LocalUsers" class="org.apache.james.userrepository.UsersFileRepository"> <destination URL="file://var/users/"/> </repository>[/quote] 将其注释掉 找到 [quote]<!-- <repository name="LocalUsers" class="org.apache.james.userrepository.JamesUsersJdbcRepository" destinationURL="db://maildb/[color=darkred]users[/color]"> <sqlFile>file://conf/sqlResources.xml</sqlFile> </repository> -->[/quote] 释放注释 其中[color=darkred]users[/color]是存储用户信息的表名,可自定义。 通过修改,我们就把用户信息的存储介质从file改成了db,<sqlFile>是指明了在db中的数据表结构及相关数据库信息。 第四步:仍然是config.xml,找到<data-sources>项,默认内容为空。 这一部很重要,maildb这个数据源在很多地方用到。 找到: [quote] <!-- <data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource"> <driver>com.mysql.jdbc.Driver</driver> <dburl>jdbc:mysql://127.0.0.1/[color=darkred]mail[/color]?autoReconnect=true</dburl> <user></user> <password></password> <max>20</max> </data-source> -->[/quote] 释放注释,填写相应的用户明和密码。 [color=darkred]mail[/color]是事先建好的数据库名(可任意取名)。 如果你的配置正确重新启动james。 james正常启动后,用telnet localhost 4555,进入管理界面,创建邮件帐号。 你将在mysql数据库中看到相应的数据。O(∩_∩)O~ 六、用James收发邮件 现在我们来写两个简单的程序来体验一下如何使用James收发邮件。请注意,示例程序是通用的。 关于接受邮件部分,我们在代码中通过注释来描述。另外我们来回忆一下上述步骤配置James服务器的参数: 1.smtp 服务器:IP或者localhost 由于我James服务就装在我的机器上,所以我可以用localhost 2.两个邮件帐号:hx/hx 对应邮箱地址hx@myself.com admin/admin 对应邮箱地址:admin@myself.com 注意:邮箱域名我们配置的是myself.com 示例程序: import java.io.IOException;import java.util.Properties;import javax.mail.Authenticator;import javax.mail.Folder;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.PasswordAuthentication;import javax.mail.Session;import javax.mail.Store;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeUtility;public class HelloJMail { //发送邮件 public static void sendMail() { //String host = "192.168.1.98"; // 指定的smtp服务器,本机的局域网IP String host = "localhost"; // 本机smtp服务器 //String host = "smtp.163.com"; // 163的smtp服务器 String from = "hx@myself.com"; // 邮件发送人的邮件地址 String to = "admin@myself.com"; // 邮件接收人的邮件地址 final String username = "hx"; //发件人的邮件帐户 final String password = "hx"; //发件人的邮件密码 // 创建Properties 对象 Properties props = System.getProperties(); // 添加smtp服务器属性 props.put("mail.smtp.host", host); props.put("mail.smtp.auth", "true"); // 创建邮件会话 Session session = Session.getDefaultInstance(props, new Authenticator(){ @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { // 定义邮件信息 MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress( to)); //message.setSubject(transferChinese("我有自己的邮件服务器了")); message.setSubject("I hava my own mail server"); message.setText("From now, you have your own mail server, congratulation!"); // 发送消息 session.getTransport("smtp").send(message); //Transport.send(message); //也可以这样创建Transport对象发送 System.out.println("SendMail Process Over!"); } catch (MessagingException e) { e.printStackTrace(); } } //接受邮件 public static void getMail(){ String host = "localhost"; final String username = "hx"; final String password = "hx"; // 创建Properties 对象 Properties props = new Properties(); // 创建邮件会话 Session session = Session.getDefaultInstance(props, new Authenticator(){ @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { // 获取邮箱的pop3存储 Store store = session.getStore("pop3"); store.connect(host, username, password); // 获取inbox文件 Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); //打开,打开后才能读取邮件信息 // 获取邮件消息 Message message[] = folder.getMessages(); for (int i=0, n=message.length; i<n; i++) { System.out.println(i + ": " + message[i].getFrom()[0] + "\t" + message[i].getSubject()); try { message[i].writeTo(System.out); } catch (IOException e) { e.printStackTrace(); } } // 关闭资源 folder.close(false); store.close(); } catch (MessagingException e) { e.printStackTrace(); } System.out.println("GetMail Process Over!"); } //邮件主题中文字符转换 public static String transferChinese(String strText){ try{ strText = MimeUtility.encodeText(new String(strText.getBytes(), "GB2312"), "GB2312", "B"); }catch(Exception ex){ ex.printStackTrace(); } return strText; } public static void main(String[] args) { HelloJMail.sendMail(); //HelloJMail.getMail(); }} 说明: 执行测试时,先执行发送,在main方法中注释掉邮件接受方法调用,等待片刻,再注释掉邮件发送方法调用,执行邮件接受方法调用。因为就算163这样优秀的企业级邮箱也不可能瞬间就能收到发送的邮件。 在邮件发送方法中:sendMail(), 可以尝试一下又本邮件服务器向163邮箱发送邮件,如果想通过163邮件服务器想本地发送邮件,你需要配置DSN。 以下为本机接收James邮件服务器提供服务的邮件结果: 该文件在 E:\james\apps\james\var\mail\inboxes\admin目录下 Return-Path: <hx@myself.com>Delivered-To: admin@myself.comReceived: from localhost ([127.0.0.1]) by hdhr-hanxin (JAMES SMTP Server 2.3.1) with SMTP ID 499 for <admin@myself.com>; Mon, 11 May 2009 11:27:34 +0800 (CST)Date: Mon, 11 May 2009 11:27:34 +0800 (CST)Message-ID: <28380482.1242012454468.JavaMail.hdhr_hanxin@hdhr-hanxin>From: hx@myself.comTo: admin@myself.comSubject: I hava my own mail serverMime-Version: 1.0Content-Type: text/plain; charset=us-asciiContent-Transfer-Encoding: 7bitFrom now, you have your own mail server, congratulation! 七、FAQ 1、在启动james时,提示POP3或SMTP不能使用? 请检查一下,看“管理工具—>服务”里面,是不是启动了别的邮件服务器,已将110或25端口占用了。 实例: james前台直接运行时出错: ERROR [Phoenix.] (): Component named "smtpserver" failed to pass through the Initialization stage. (Reason: Java.net.BindException: Address already in use: JVM_Bind). ERROR [Phoenix.] (): There was an error running phase "startup" for Block named "smtpserver". (Reason: Component named "smtpserver" failed to pass through the Initialization stage. (Reason: Java.net.BindException: Address already in use: JVM_Bind).). org.apache.excalibur.containerkit.lifecycle.LifecycleException: Component named "smtpserver" failed to pass through the Initialization stage. (Reason: Java.net.BindException: Address already in use: JVM_Bind). 原因: james默认设置不允许在同一台机器上跑两个邮件服务器进程。必须关掉另一个! 检测方法: console界面下: d:> telnet 主机名 25(或110) 如果可以登录,出现 220 主机名 Microsoft ESMTP MAIL Service, Version: 6.0.2600.1106 ready at Thu, 25 Aug 2005 14:14:36 +0800 则说明此机器上已有一台邮件服务器在运行。 解决: 检查Windows上运行服务: 跨网传输电子邮件的服务Simple Mail Transfer Protocol (SMTP),是否启动 如启动关闭之! 2、 JAVA_HOME找不到? 请在run.bat中指定JAVA_HOME,若还不行,请在“我的电脑—>系统—>高级—>环境变量”中添加一项JAVA_HOME。 3、服务器启动正常,但客户端不能收发邮件? 请检查客户端配置是否正常,参照前面所讲,另外,请检查james下的config.xml,是否把localhost改成了机器名。 4、修改为数据库储存后,james启动出错: 一般是数据库驱动有错。检查一下 <data-source name="maildb" class="org.apache.james.util.mordred.JdbcDataSource"> <driver>org.gjt.mm.mysql.Driver</driver> <dburl>jdbc:mysql://127.0.0.1/mail</dburl> <user>root</user> <password></password> <max>20</max> </data-source> 的<driver>org.gjt.mm.mysql.Driver</driver>是否对 相关资源:敏捷开发V1.0.pptx
转载请注明原文地址: https://www.6miu.com/read-5045719.html

最新回复(0)