写这篇文章的背景是公司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>support@zhangyuan123.com</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 = "test@qq.com";
// 发件人的邮件帐户
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的,新浪的大家也可以试一下。

Java远程调用邮件服务器,实现邮件发送的更多相关文章

  1. Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)

    转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如: ...

  2. java 远程调用 RPC

    1. 概念 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).H ...

  3. java远程调用linux的命令或者脚本

    转载自:http://eksliang.iteye.com/blog/2105862 Java通过SSH2协议执行远程Shell脚本(ganymed-ssh2-build210.jar) 使用步骤如下 ...

  4. Java远程调用

    一.  概念: RMI全称是Remote Method Invocation-远程方法调用,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一.它支持 ...

  5. Ejb远程调用-jboss服务器调用服务器-Bean调用Bean

    英文参考地址 https://docs.jboss.org/author/display/AS71/Remote+EJB+invocations+via+JNDI+-+EJB+client+API+o ...

  6. java远程调用rmi入门实例

    RMI是Java的一组拥护开发分布式应用程序的API.RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol). ...

  7. 如何将一个IP地址移出PBL,不然,国内邮件服务器不能正常发送国外邮件哟。

    550 OU-001 Mail rejected by Outlook for policy reasons. If you are not an email/network admin please ...

  8. java远程执行linux服务器上的shell脚本

    业务场景:需要从服务器A中新增的文件同步至本地服务器,服务器A中内存有限,需同步成功之后清除文件. Java调用远程shell脚本,需要和远程服务器建立ssh链接,再调用指定的shell脚本. 1.创 ...

  9. sshpass 指定密码远程 ssh 到服务器 或者 scp 发送文件到服务器

    在操作linux时,虽然可以对linux配置免秘钥登录,但是在配置免密码登录之前,是需要登录到其他节点主机的,这里提供一种类似ssh的方式,可以在命令后面加上相应的参数来设置你将要登录的远程主机的密码 ...

随机推荐

  1. Android开发之Mediaplayer

    Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发者能够非常方便在在应用中播放音频.视频.本篇博客主要解说在Android平台下怎样播放一个音频文件 ...

  2. C#框架

    从零开始编写自己的C#框架(1)——前言   记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种 ...

  3. jq toggle1.9版本后不支持解决方案

    <script type="text/javascript"> $(document).ready(function(){ $("button"). ...

  4. PS抠出树叶树枝

    1.打开PS 2.加载树叶树枝图片 3.双击该图层,来解锁树叶树枝图层 4.通道面板,只留下蓝色 5.顶部菜单 -> 图像 -> 计算 -> 混合为正片叠底,得到一个新Alpha图层 ...

  5. PHP+Mysql+jQuery实现中国地图区域数据统计(raphael.js)

    使用过百度统计或者cnzz统计的童鞋应该知道,后台有一个地图统计,不同访问量的省份显示的颜色也不一样,今天我将带领大家开发一个这样的案例.上一篇<使用raphael.js绘制中国地图>文章 ...

  6. 基于jQuery的上下无缝滚动应用(单行或多行)

    工作中遇到的一个js代码,现在对.trigger('mouseleave'),仍一知半解... <script>$(function(){//单行应用var _wrap=$('ul.lin ...

  7. 18. Scrum敏捷软件开发

      1)柯维定律 2)如何组件敏捷团队? 团队5~9个人,Mike带过最多的是14个人.个人建议,别超过10个.否则沟通的成本直线上升.(团队的午餐,两个匹萨就够了). 引入特性团队(针对于传统的组件 ...

  8. vs2010下载链接中国简体(中国含msdn)

    昨天一个朋友说vs2010中国版可下载,我开始不相信.只是周末.所以,我下载一试 果然,安装了中国版,原本msdn订户才能够下载,感谢朋友们上传. 文件名 cn_visual_studio_2010_ ...

  9. php中使用随机数

    <?phpsession_start();$s = array("a","b","c","d","e&q ...

  10. C#:vs2010无法打开vs2012创建的项目

    vs低版本打开高版本创建的项目时会提示"选择的文件是解决方案文件,但是用此应用程序的较新版本创建的,无法打开" 解决办法: 写字板打开解决方案sln文件 将其改成你现在用的vs版本 ...