博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java远程调用邮件服务器,实现邮件发送
阅读量:7207 次
发布时间:2019-06-29

本文共 4605 字,大约阅读时间需要 15 分钟。

写这篇文章的背景是公司Android客户端需要实现一个功能,实现类似于密码找回或者用户注册完发送一个邮件给用户的功能,当然这些逻辑客户端只负责请求自己的服务端,自己的服务端再去请求邮件服务器。

邮件服务器使用的Apache的James,Java写的开源的,而且方便调用。远程调用使用的是Java Mail的API。

首先我们需要把James这个邮件服务器跑起来,官网下载地址:,下载先来之后直接解压,直接运行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地址,比如:

 

114.114.114.114
8.8.8.8
false
false
50000

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的,新浪的大家也可以试一下。

 

你可能感兴趣的文章
CLR的执行模型(4):执行程序集的代码
查看>>
同一脚本sh 脚本名 报Syntax error: "(" unexpected而./脚本名不报错,求解!!
查看>>
ZJOI2008皇帝的烦恼
查看>>
新手windows安装nginx
查看>>
浏览器兼容问题踩坑收集
查看>>
Python 实用技巧
查看>>
object c中@property 的使用
查看>>
Sping 核心IOC容器
查看>>
poj 2524
查看>>
MapReduce
查看>>
论文阅读笔记五十六:(ExtremeNet)Bottom-up Object Detection by Grouping Extreme and Center Points(CVPR2019)...
查看>>
回收期计算
查看>>
response响应
查看>>
10 个十分难得的 javascript 开发经验
查看>>
Common Subsequence
查看>>
【CSS3】标签使用说明
查看>>
n皇后问题—回溯法 C++实现
查看>>
on delete cascade
查看>>
Connected Graph
查看>>
openfile iscisi 配置
查看>>