写这篇文章的背景是公司Android客户端需要实现一个功能,实现类似于密码找回或者用户注册完发送一个邮件给用户的功能,当然这些逻辑客户端只负责请求自己的服务端,自己的服务端再去请求邮件服务器。
邮件服务器使用的Apache的James,Java写的开源的,而且方便调用。远程调用使用的是Java Mail的API。
首先我们需要把James这个邮件服务器跑起来,官网下载地址:http://james.apache.org/,下载先来之后直接解压,直接运行bin\run.bat。出现如下图所示说明运行OK了。
如果运行不成功,可能是你的JDK或者环境变量没有配置好,这个我就不说了。
运行起来之后,会在apps\james\SAR-INF这个目录下生成一个config.xml文件,这就是邮件服务器的配置文件。打开它,修改一些配置:
1.修改<postmaster>localhost</postmaster>,改成你自己的服务器域名,比如:<postmaster>[email protected]</postmaster>
2.修改这些,也是改成自己的
<servernames autodetect="false" autodetectIP="false">
<servername>zhangyuan123.com</servername>
</servernames>
3.修改dns server,这是为了可以发外网邮件,查看DNS地址使用ipconfig/all,然后在配置文件中dnsserver节点下加入server地址,比如:
<dnsserver> <servers> <!--Enter ip address of your DNS server, one IP address per server --> <!-- element. --> <!-- <server>127.0.0.1</server> --> <server>114.114.114.114</server> <server>8.8.8.8</server> </servers> <!-- Change autodiscover to false if you would like to turn off autodiscovery --> <!-- and set the DNS servers manually in the <servers> section --> <autodiscover>false</autodiscover> <authoritative>false</authoritative> <!-- Maximum number of entries to maintain in the DNS cache --> <maxcachesize>50000</maxcachesize> </dnsserver>4.找到C:\Windows\System32\drivers\etc\host文件,其中加入127.0.0.1 zhangyuan123.com
重新启动邮件服务器。
下面就添加一个用户到邮件服务器,James是使用telnet进行命令行操作的。win7默认没有打开telnet服务,可以搜一下如何打开。然后在命令行输入telnet zhangyuan123.com 4555,输入用户名root,密码root。添加一个用户使用命令:adduser admin admin,其他命令我就不说了。
添加完了之后我们就开始使用客户端模仿调用服务器发送一封邮件。
package org.sunchao; 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.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; public class Mail { // String host = "smtp.163.com"; // 163的smtp服务器 // 本机smtp服务器 private static final String HOST = "zhangyuan123.com"; // 邮件发送人的邮件地址 private static final String FROM = "admin@" + HOST; // 邮件接收人的邮件地址 private static final String TO = "[email protected]"; // 发件人的邮件帐户 private static final String USERNAME = "admin"; // 发件人的邮件密码 private static final String PASSWORD = "admin"; public static void main(String[] args) { Mail.sendMail(); // Mail.getMail(); } /** * 发送邮件 */ public static void sendMail() { // 创建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("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 = "admin"; final String password = "admin"; // 创建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; } }把上面代码中qq邮箱地址换成自己的就行。最后run一把就OK了。但是QQ邮箱自身有过滤机制,它会认为来自zhangyuan123.com的邮件是垃圾邮件,你需要设置一下白名单:
再发每一次,QQ邮箱就可以收到了。
对于腾讯的过滤,如果不让他过滤,我估计得交钱给腾讯了,其他的163的,新浪的大家也可以试一下。