Java远程调用邮件服务器,实现邮件发送

标签: java 远程调用 邮件 | 发表时间:2013-07-09 14:10 | 作者:sunchaoenter
出处:http://blog.csdn.net

写这篇文章的背景是公司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的,新浪的大家也可以试一下。



作者:sunchaoenter 发表于2013-7-9 14:10:13 原文链接
阅读:0 评论:0 查看评论

相关 [java 远程调用 邮件] 推荐:

Java远程调用邮件服务器,实现邮件发送

- - CSDN博客推荐文章
写这篇文章的背景是公司Android客户端需要实现一个功能,实现类似于密码找回或者用户注册完发送一个邮件给用户的功能,当然这些逻辑客户端只负责请求自己的服务端,自己的服务端再去请求邮件服务器. 邮件服务器使用的Apache的James,Java写的开源的,而且方便调用. 远程调用使用的是Java Mail的API.

Commons Email 1.3.1 发布,Java 邮件工具包

- - 开源中国社区最新新闻
该项目是Apache的Commons子项目下的一个邮件客户端组件,它是基于JavaMail的,大大简化了邮件的收发操作. Commons Email 发布了 1.3.1 更新版本,该版本要求 Java 5 或者更新版本支持,同时修复了两个bug:.

Java Mail(一):telnet实现发送收取邮件

- - CSDN博客推荐文章
       最近要做一个解析邮件的东东,就顺便系统的搞一下Java Mail的API吧,以前搞过,现在都忘到十万八千里了,要说技术就得学以致用,要不全扔了.        说起邮箱,工作中挺常用的工具,上学的时候都没怎么用. 国内的邮箱系统相当多了,163、sina、sohu、qq,这些是耳熟能详针对普通用户的邮箱,还有很多针对企业用户的.

java带图片的邮件发送方法实现

- - CSDN博客编程语言推荐文章
// JavaMail需要Properties来创建一个session对象. 它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机. // properties.put("mail.smtp.host", "mailcas.chinapnr.com");// 设置smtp主机. properties.put("mail.smtp.host", "smtp.163.com");// 设置smtp主机.

java 实现注册时发送激活邮件+激活

- - CSDN博客推荐文章
  在很多网站注册的时候,为了验证用户信息的真实合法,往往需要验证用户所填邮件的准确性. 形式为:用户注册时填写邮箱,注册完成后,网站会向用户所填邮箱发送一封激活邮件,用户点击激活邮件中的链接后,方可完成注册.   最近项目中也用到这个需求,做了个Demo与大家分享,大至思想如下:.   用户表t_user有五个字段分别为用户名、密码、邮箱地址、激活码、状态:.

从远程调用框架认识Zookeeper

- - 企业架构 - ITeye博客
从远程调用框架认识Zookeeper. 发表于2014-01-02 11:14| 14814次阅读| 来源博客园| 12 条评论| 作者夏俊. Zookeeper 架构设计 Hadoop 远程调用 分布式. 摘要:在Hadoop的学习过程中,Zookeeper是让很多初学者困惑的技术,夏俊认为远程调用服务是一个很适合Zookeeper应用的场景,他从自己设计的远程调用服务架构谈起,详细介绍了Zookeeper这一应用场景.

Httpclient远程调用WebService示例(Eclipse+httpclient)

- - 企业架构 - ITeye博客
我们将Web Service发布在Tomcat或者其他应用服务器上后,有很多方法可以调用该Web Service,常用的有两种:.       1、通过浏览器HTTP调用,返回规范的XML文件内容.       2、通过客户端程序调用,返回结果可自定义格式.       接下来,我利用Eclipse作为开发工具,演示一个Httpclient调用WebService的简单示例.

java通过贝叶斯算法实现垃圾邮件过滤详解

- - 互联网 - ITeye博客
本文是“java开发邮箱系统”系列文章之一,通过阅读本系列的文章,你可以通过Java实现一个邮件服务器.     贝叶斯算法是常用的垃圾邮件过滤算法,理论依据主要是概率统计中的一些基本理论. 因为这些都可以很方便的在网上查到,所以本文只讲实践,不讲数学知识. 准备400封正常邮件、400封垃圾邮件.

使用 RMI + ZooKeeper 实现远程调用框架

- - zzm
1.1 定义一个 RMI 接口. 1.2 编写 RMI 接口的实现类. 1.3 通过 JNDI 发布 RMI 服务. 4 使用 ZooKeeper 提供高可用的 RMI 服务. 在 Java 世界里,有一种技术可以实现“跨虚拟机”的调用,它就是 . RMI(Remote Method Invocation,远程方法调用).

Java中的锁(Locks in Java)

- - 并发编程网 - ifeve.com
原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一. 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂. 因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况).