前言:

最近写一个管理系统需要用到发送邮件的功能,曾经在javamail中使用过163的smtp服务,但是邮件要么被当成垃圾邮件,要么就是无法在一天之内发送超过20封,四天前我再次使用javamail时,发现我的163账号被冻结,允许我在厕所哭一会儿。然后换了qq的smtp服务,开启服务还需收短信费用,以为花了钱可以弄好,结果又发现,javamail和腾讯的smtp握手失败,已哭晕在厕所。最后忍无可忍只好自己搭一个邮件服务器。

牢骚发完了,开始进入主题,我使用的是centos6.5系统,以及和postfix邮件服务器,postfix邮件服务器的搭建需要使用到cyrus-sasl、postfix、dovecot,具体他们的功能我不在这里阐述,毕竟网上一大堆。

一、cyrus-sasl安装与配置

yum -y install cyrus-sasl

与jdk安装一样最好查看他的版本,如果有版本提示则就证明安装成功。

/usr/sbin/saslauthd -v

之后需要修改saslauthd文件,选择使用shadow方式认证。(温馨提示:可以在Linux中使用/word去查找单词,如下面的MECH=shadow可以输入/MECH=查找)

vim /etc/sysconfig/saslauthd

SOCKETDIR=/var/run/saslauthd

MECH=shadow

FLAGS=

修改smtpd.conf

vim /etc/sasl2/smtpd.conf

添加如下代码

pwcheck_method: saslauthd

mech_list: plain login

log_level: 3

saslauthd_path:/var/run/saslauthd/mux

测试cyrus-sasl

创建系统用户root,并修改其密码,测试cyrus-sasl,如下:

useradd root &&echo 'rootmail'| passwd --stdin root

su - root

mkdir -p ~/mail/.imap/INBOX

启动cyrus-sasl

/etc/init.d/saslauthd start

chkconfig saslauthd on

现在来使用刚刚创建的用户进行认证测试,如下:

testsaslauthd -u root-p 'rootmail'

如果出现OK "Success"代表启动成功,否则请严格检查配置文件。

二、postfix安装与基本配置

yum -y install postfix

查看他的版本与配置

postconf -d | grep mail_version

修改main.cf文件

vim /etc/postfix/main.cf

并添加如下代码

queue_directory = /var/spool/postfix

command_directory = /usr/sbin

daemon_directory = /usr/libexec/postfix

data_directory = /var/lib/postfix

mail_owner = postfix

myhostname = mail.XXX.com(这里是写你的服务器的域名前加上一个前缀,一般我们都喜欢用mail,域名必须可访问)

mydomain = XXX.com(这里是写你的服务器的域名,域名必须可访问)

myorigin = $mydomain

inet_interfaces = all

mydestination = $myhostname, localhost.$mydomain, localhost

local_recipient_maps =

unknown_local_recipient_reject_code = 550

alias_maps = hash:/etc/aliases

alias_database = hash:/etc/aliases

debug_peer_level = 2

debugger_command =

PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin

ddd $daemon_directory/$process_name $process_id & sleep 5

sendmail_path = /usr/sbin/sendmail.postfix

newaliases_path = /usr/bin/newaliases.postfix

mailq_path = /usr/bin/mailq.postfix

setgid_group = postdrop

html_directory = no

manpage_directory = /usr/share/man

sample_directory = /usr/share/doc/postfix-2.6.6/samples

readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES

启动postfix并设置开机自启

/etc/init.d/postfix start

chkconfig postfix on

查看postfix的监听端口,如果发现是25端口证明postfix已经成功启动

netstat -tunlp

ps -ef |grep postfix

我们来测试postfix是否可以发邮件

telnet mail.XXX.com 25

mail from:root@XXXX.com

rcpt to:xxxx@qq.com

data

XXXXXXXX

quit

登录邮箱发现确实有一封邮件。

这个时候,我们来试试javamail。

import java.util.List;

import java.util.Properties;

import javax.activation.DataHandler;

import javax.activation.FileDataSource;

import javax.mail.Address;

import javax.mail.BodyPart;

import javax.mail.Message;

import javax.mail.Multipart;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeBodyPart;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMultipart;

import javax.mail.internet.MimeUtility;

public class MailUtils {

/**

* 向用户发送邮件

*/

private static final long serialVersionUID = 1L;

private MimeMessage mimeMsg; // MIME邮件对象

private Session session; // 邮件会话对象

private Properties props; // 系统属性

private boolean needAuth = false; // smtp是否需要认证

private String username; // smtp认证用户名和密码

private String password;

private Multipart mp; // Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成

private String log;

public MailUtils() {

}

public MailUtils(String smtp) {

setSmtpHost(smtp);

createMimeMessage();

}

public void setSmtpHost(String hostName) {

System.out.println("设置系统属性:mail.smtp.host = " + hostName);

if (props == null)

props = System.getProperties(); // 获得系统属性对象

props.put("mail.smtp.host", hostName); // 设置SMTP主机

props.put("mail.smtp.localhost", "localHostAdress");

}

public boolean createMimeMessage() {

try {

System.out.println("准备获取邮件会话对象!");

session = Session.getDefaultInstance(props, null); // 获得邮件会话对象

} catch (Exception e) {

log = "获取邮件会话对象时发生错误!" + e.toString();

System.err.println(log);

return false;

}

try {

mimeMsg = new MimeMessage(session); // 创建MIME邮件对象

mp = new MimeMultipart(); // mp 一个multipart对象

// Multipart is a container that holds multiple body parts.

return true;

} catch (Exception e) {

log = "创建MIME邮件对象失败!" + e;

System.err.println(log);

return false;

}

}

public void setNeedAuth(boolean need) {

System.out.println("设置smtp身份认证:mail.smtp.auth = " + need);

if (props == null)

props = System.getProperties();

if (need) {

props.put("mail.smtp.auth", "true");

} else {

props.put("mail.smtp.auth", "false");

}

}

public void setNamePass(String name, String pass) {

System.out.println("程序得到用户名与密码");

username = name;

password = pass;

}

public boolean setSubject(String mailSubject) {

System.out.println("设置邮件主题!");

try {

mimeMsg.setSubject(MimeUtility.encodeText(mailSubject,"utf-8","B"));

return true;

} catch (Exception e) {

log = "设置邮件主题发生错误!"+e;

System.err.println(log);

return false;

}

}

public boolean setBody(String mailBody) {

try {

System.out.println("设置邮件体格式");

BodyPart bp = new MimeBodyPart();

// 转换成中文格式

bp.setContent(

""

+ mailBody, "text/html;charset=utf-8");

mp.addBodyPart(bp);

return true;

} catch (Exception e) {

log = "设置邮件正文时发生错误!" + e;

System.err.println(log);

return false;

}

}

public boolean setFiles(List files){

try{

for(String s:files){

MimeBodyPart mbp=new MimeBodyPart();

FileDataSource fds=new FileDataSource(s); //得到数据源

mbp.setDataHandler(new DataHandler(fds)); //得到附件本身并至入BodyPart

mbp.setFileName(fds.getName());  //得到文件名同样至入BodyPart

mp.addBodyPart(mbp);

}

return true;

}catch(Exception e){

log = "增加附件时出错:"+e;

e.printStackTrace();

return false;

}

}

public boolean addFile(String path, String name){

try{

MimeBodyPart mbp=new MimeBodyPart();

FileDataSource fds=new FileDataSource(path); //得到数据源

mbp.setDataHandler(new DataHandler(fds)); //得到附件本身并至入BodyPart

mbp.setFileName(MimeUtility.encodeText(name,"utf-8","B"));

mp.addBodyPart(mbp);

return true;

}catch(Exception e){

log = "增加附件时出错:"+e;

e.printStackTrace();

return false;

}

}

public boolean setFrom(String from) {

System.out.println("设置发信人!");

try {

mimeMsg.setFrom(new InternetAddress(from)); // 设置发信人

return true;

} catch (Exception e) {

log = "设置发信人出错:"+e;

return false;

}

}

public boolean setTo(String to) {

System.out.println("设置收信人");

if (to == null)

return false;

try {

mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress

.parse(to));

return true;

} catch (Exception e) {

return false;

}

}

public boolean setCopyTo(String copyto) {

if (copyto == null)

return false;

try {

mimeMsg.setRecipients(Message.RecipientType.CC,

(Address[]) InternetAddress.parse(copyto));

return true;

} catch (Exception e) {

return false;

}

}

public boolean sendout() {

try {

mimeMsg.setContent(mp);

mimeMsg.saveChanges();

System.out.println("正在发送邮件....");

Session mailSession = Session.getInstance(props, null);

Transport transport = mailSession.getTransport("smtp");

transport.connect((String) props.get("mail.smtp.host"), username,

password);

transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO));

System.out.println("发送邮件成功!");

transport.close();

return true;

} catch (Exception e) {

log = "邮件发送失败!" + e;

System.err.println(log);

return false;

}

}

public String getLog(){

return log;

}

public static void main(String[] args) {

MailUtils utils = new MailUtils("mail.xxx.com");

utils.setFrom("root@xxx");

utils.setSubject("xxxx");

utils.setNamePass("xxx","xxx");

utils.setBody("main");

utils.setTo("xxxx@qq.com");

utils.sendout();

}

}

运行成功!

尾声

到此结束,但是在这里我并没有配置反垃圾策略,有需要的同学可以百度下,并且在这里,如果我发送大量的邮件的话,还是无法避免封ip,这也是为什么要购买邮件服务器的原因吧。

java邮件服务器搭建_邮件服务器+javamail(仅包括发送)搭建相关推荐

  1. Java web小项目_个人主页(1)—— 云环境搭建与项目部署

    摘自:Java web小项目_个人主页(1)-- 云环境搭建与项目部署 作者:丶PURSUING 发布时间: 2021-03-26 23:59:39 网址:https://blog.csdn.net/ ...

  2. java游戏服务器发_网络游戏服务器架构(转)

    网络游戏一般采用C/S结构,客户端负责绘制游戏世界的实时画面,服务器端则负责响应所有客户端的连接请求和游戏逻辑处理,并控制所有客户端的画面绘制,客户端与服务器通过网络数据包交互完成每一步游戏逻辑. 网 ...

  3. 从零开始发布前端代码到服务器上_无服务器计算:让每行代码都能住上“经济适用房”...

    是时候展现真正的实力了!大胆报名吧!! 摘 要 独立的简单函数可以让开发工作变得更加容易,同时由事件驱动的执行可让操作变得更加便宜. 开发人员往往需要花费大量的时间编写代码以解决业务问题.随后,运营团 ...

  4. 逆战网络连接断开连接服务器超时_逆战服务器连接超时 与服务器连接超时的原因...

    今天小编为大家带来了逆战服务器连接超时 与服务器连接超时的原因,感兴趣的朋友们可以跟着小编去下文了解一下哦! 很多玩家都碰到过这种问题,大多都是腾讯的TP安全防卫提示的这个消息,大家大可不必着急,出现 ...

  5. 逆战网络连接断开连接服务器超时_逆战服务器连接断开 与服务器连接断开的原因...

    今天小编为大家带来了逆战服务器连接断开 与服务器连接断开的原因,感兴趣的朋友们可以跟着小编去下文了解一下哦! 很多玩家都碰到过这种问题,大多都是腾讯的TP安全防卫提示的这个消息,大家大可不必着急,出现 ...

  6. eclipse android开发环境搭建_聊聊Spring boot2.X开发环境搭建和基本开发

    对Spring Boot的开发环境进行搭建,并对它的特点做进一步的了解,才能更好地对Spring Boot有更深入的介绍.但是无论如何都需要先来搭建Spring Boot的工程. 搭建Spring B ...

  7. magic winmail邮件服务器,使用magic winmail server轻松架设邮件服务器(三)_邮件服务器...

    在安装完成后,管理员必须对系统进行一些初始化设置,系统才能正常运行.服务器在启动时如果发现还没有设置域名会自动运行快速设置向导,用户可以用它来简单快速的设置邮件服务器.当然用户也可以不用快速设置向导, ...

  8. java 拉取收件箱邮件源码_邮件提醒系统:新邮件识别

    最近在做邮件提醒抄送企业微信消息系统,就目前而言,无论是pop3还是imap都没有一个好的方法只接收新邮件,基本只能依靠收件箱列表message自行判断,下面给出几种思路并作对比. //收件箱 fol ...

  9. 我的世界java版gamemode指令_【服务器相关】【求助!】关于服务器中使用gamemode等命令错误。...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 事情是这样的 我自己开个服务器玩玩,装了一堆插件 给自己了一个op 不知道怎么,TMI内置修改器每一个指令都不能用了,客户端里红字提示an interna ...

  10. java 接口 白名单_策略:服务器上的白名单安全机制

    图片都存在一起,最大的好处就是可以做CDN加速.特别是某些高清图.同理,视频,音频文件也是这样的. 然而今天却并不是要从这个角度去讨论这个话题. 今天的话题,从一个不太可爱的地方谈起:静态潜伏的恶意代 ...

最新文章

  1. 小时候的小霸王游戏!坦克大战 超级玛丽 魂斗罗 忍者神龟 都有!
  2. 计算机网络实验socket编程,计算机网络实验 socket编程
  3. 判断是否是2的N次方
  4. jemalloc java_从源构建tensorflow遇到错误:规则'@jemalloc//:jemalloc'的C编译失败
  5. 什么是 SAP Core Data Service Annotation Propagation
  6. centos7打开图形界面命令_centos7标准版(DVD)命令界面和图形界面相互切换
  7. NETSCREEN用L2TP方式建立×××
  8. 不到100行代码搞定Python做OCR识别身份证,文字等各种字体
  9. matlab 平滑曲线连接_如何使用Affinity Designer for mac编辑矢量曲线和形状
  10. 广告投放管理平台 oython源码_【直播】全新腾讯广告投放管理平台如何帮助广告主乘风破浪?...
  11. C++程序设计:字符图形输出(空白三角形)
  12. 获取微信公众号地址的图片不能正常显示的问题
  13. 神舟K650c i7(W350STQ)上成功装好Mac OS X 10.9,兼谈如何安装WinXP、7、8.1、OSX、Ubuntu五系统(Chameleon、MBR)
  14. 关于keras-yolov3-deepsort
  15. 睡眠即醒 蓝牙_如果您的Mac从睡眠中随机醒来,请尝试防止蓝牙唤醒功能 | MOS86...
  16. 《蛙声十里出山泉》赏析
  17. 如何为你的网站添加标志性的图标(头像)呢?
  18. 关于线性代数:方程组同解
  19. sd卡广播的理解总结
  20. 中国神童13岁免试上大学,极端荣耀后却选择出家为僧!

热门文章

  1. mix2线刷开发板救砖_小米小米Mix 2手机快速救砖,线刷教程分享,小白轻松救活手机...
  2. 使用Docker实现vsftpd配置——用户验证访问上传
  3. 《运筹学》CSU作业答案
  4. c语言ascii码表6,C语言附录ASCII码表
  5. 电子信息工程跨保计算机、生物医学工程保研经验分享~
  6. 那些年我们常用的软件
  7. python生成可执行exe控制Microsip自动填写号码并拨打
  8. Python贪吃蛇小游戏
  9. Python基础篇:Python的数据结构
  10. OpenCV阈值分割