java邮件服务器搭建_邮件服务器+javamail(仅包括发送)搭建
前言:
最近寫一個(gè)管理系統(tǒng)需要用到發(fā)送郵件的功能,曾經(jīng)在javamail中使用過163的smtp服務(wù),但是郵件要么被當(dāng)成垃圾郵件,要么就是無(wú)法在一天之內(nèi)發(fā)送超過20封,四天前我再次使用javamail時(shí),發(fā)現(xiàn)我的163賬號(hào)被凍結(jié),允許我在廁所哭一會(huì)兒。然后換了qq的smtp服務(wù),開啟服務(wù)還需收短信費(fèi)用,以為花了錢可以弄好,結(jié)果又發(fā)現(xiàn),javamail和騰訊的smtp握手失敗,已哭暈在廁所。最后忍無(wú)可忍只好自己搭一個(gè)郵件服務(wù)器。
牢騷發(fā)完了,開始進(jìn)入主題,我使用的是centos6.5系統(tǒng),以及和postfix郵件服務(wù)器,postfix郵件服務(wù)器的搭建需要使用到cyrus-sasl、postfix、dovecot,具體他們的功能我不在這里闡述,畢竟網(wǎng)上一大堆。
一、cyrus-sasl安裝與配置
yum -y install cyrus-sasl
與jdk安裝一樣最好查看他的版本,如果有版本提示則就證明安裝成功。
/usr/sbin/saslauthd -v
之后需要修改saslauthd文件,選擇使用shadow方式認(rèn)證。(溫馨提示:可以在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
測(cè)試cyrus-sasl
創(chuàng)建系統(tǒng)用戶root,并修改其密碼,測(cè)試cyrus-sasl,如下:
useradd root &&echo 'rootmail'| passwd --stdin root
su - root
mkdir -p ~/mail/.imap/INBOX
啟動(dòng)cyrus-sasl
/etc/init.d/saslauthd start
chkconfig saslauthd on
現(xiàn)在來(lái)使用剛剛創(chuàng)建的用戶進(jìn)行認(rèn)證測(cè)試,如下:
testsaslauthd -u root-p 'rootmail'
如果出現(xiàn)OK "Success"代表啟動(dòng)成功,否則請(qǐng)嚴(yán)格檢查配置文件。
二、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(這里是寫你的服務(wù)器的域名前加上一個(gè)前綴,一般我們都喜歡用mail,域名必須可訪問)
mydomain = XXX.com(這里是寫你的服務(wù)器的域名,域名必須可訪問)
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
啟動(dòng)postfix并設(shè)置開機(jī)自啟
/etc/init.d/postfix start
chkconfig postfix on
查看postfix的監(jiān)聽端口,如果發(fā)現(xiàn)是25端口證明postfix已經(jīng)成功啟動(dòng)
netstat -tunlp
ps -ef |grep postfix
我們來(lái)測(cè)試postfix是否可以發(fā)郵件
telnet mail.XXX.com 25
mail from:root@XXXX.com
rcpt to:xxxx@qq.com
data
XXXXXXXX
quit
登錄郵箱發(fā)現(xiàn)確實(shí)有一封郵件。
這個(gè)時(shí)候,我們來(lái)試試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?{
/**
*?向用戶發(fā)送郵件
*/
private?static?final?long?serialVersionUID?=?1L;
private?MimeMessage?mimeMsg;?//?MIME郵件對(duì)象
private?Session?session;?//?郵件會(huì)話對(duì)象
private?Properties?props;?//?系統(tǒng)屬性
private?boolean?needAuth?=?false;?//?smtp是否需要認(rèn)證
private?String?username;?//?smtp認(rèn)證用戶名和密碼
private?String?password;
private?Multipart?mp;?//?Multipart對(duì)象,郵件內(nèi)容,標(biāo)題,附件等內(nèi)容均添加到其中后再生成
private?String?log;
public?MailUtils()?{
}
public?MailUtils(String?smtp)?{
setSmtpHost(smtp);
createMimeMessage();
}
public?void?setSmtpHost(String?hostName)?{
System.out.println("設(shè)置系統(tǒng)屬性:mail.smtp.host?=?"?+?hostName);
if?(props?==?null)
props?=?System.getProperties();?//?獲得系統(tǒng)屬性對(duì)象
props.put("mail.smtp.host",?hostName);?//?設(shè)置SMTP主機(jī)
props.put("mail.smtp.localhost",?"localHostAdress");
}
public?boolean?createMimeMessage()?{
try?{
System.out.println("準(zhǔn)備獲取郵件會(huì)話對(duì)象!");
session?=?Session.getDefaultInstance(props,?null);?//?獲得郵件會(huì)話對(duì)象
}?catch?(Exception?e)?{
log?=?"獲取郵件會(huì)話對(duì)象時(shí)發(fā)生錯(cuò)誤!"?+?e.toString();
System.err.println(log);
return?false;
}
try?{
mimeMsg?=?new?MimeMessage(session);?//?創(chuàng)建MIME郵件對(duì)象
mp?=?new?MimeMultipart();?//?mp?一個(gè)multipart對(duì)象
//?Multipart?is?a?container?that?holds?multiple?body?parts.
return?true;
}?catch?(Exception?e)?{
log?=?"創(chuàng)建MIME郵件對(duì)象失敗!"?+?e;
System.err.println(log);
return?false;
}
}
public?void?setNeedAuth(boolean?need)?{
System.out.println("設(shè)置smtp身份認(rèn)證: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("設(shè)置郵件主題!");
try?{
mimeMsg.setSubject(MimeUtility.encodeText(mailSubject,"utf-8","B"));
return?true;
}?catch?(Exception?e)?{
log?=?"設(shè)置郵件主題發(fā)生錯(cuò)誤!"+e;
System.err.println(log);
return?false;
}
}
public?boolean?setBody(String?mailBody)?{
try?{
System.out.println("設(shè)置郵件體格式");
BodyPart?bp?=?new?MimeBodyPart();
//?轉(zhuǎn)換成中文格式
bp.setContent(
""
+?mailBody,?"text/html;charset=utf-8");
mp.addBodyPart(bp);
return?true;
}?catch?(Exception?e)?{
log?=?"設(shè)置郵件正文時(shí)發(fā)生錯(cuò)誤!"?+?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);?//得到數(shù)據(jù)源
mbp.setDataHandler(new?DataHandler(fds));?//得到附件本身并至入BodyPart
mbp.setFileName(fds.getName());??//得到文件名同樣至入BodyPart
mp.addBodyPart(mbp);
}
return?true;
}catch(Exception?e){
log?=?"增加附件時(shí)出錯(cuò):"+e;
e.printStackTrace();
return?false;
}
}
public?boolean?addFile(String?path,?String?name){
try{
MimeBodyPart?mbp=new?MimeBodyPart();
FileDataSource?fds=new?FileDataSource(path);?//得到數(shù)據(jù)源
mbp.setDataHandler(new?DataHandler(fds));?//得到附件本身并至入BodyPart
mbp.setFileName(MimeUtility.encodeText(name,"utf-8","B"));
mp.addBodyPart(mbp);
return?true;
}catch(Exception?e){
log?=?"增加附件時(shí)出錯(cuò):"+e;
e.printStackTrace();
return?false;
}
}
public?boolean?setFrom(String?from)?{
System.out.println("設(shè)置發(fā)信人!");
try?{
mimeMsg.setFrom(new?InternetAddress(from));?//?設(shè)置發(fā)信人
return?true;
}?catch?(Exception?e)?{
log?=?"設(shè)置發(fā)信人出錯(cuò):"+e;
return?false;
}
}
public?boolean?setTo(String?to)?{
System.out.println("設(shè)置收信人");
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("正在發(fā)送郵件....");
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("發(fā)送郵件成功!");
transport.close();
return?true;
}?catch?(Exception?e)?{
log?=?"郵件發(fā)送失敗!"?+?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();
}
}
運(yùn)行成功!
尾聲
到此結(jié)束,但是在這里我并沒有配置反垃圾策略,有需要的同學(xué)可以百度下,并且在這里,如果我發(fā)送大量的郵件的話,還是無(wú)法避免封ip,這也是為什么要購(gòu)買郵件服務(wù)器的原因吧。
總結(jié)
以上是生活随笔為你收集整理的java邮件服务器搭建_邮件服务器+javamail(仅包括发送)搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 木马查杀
- 下一篇: 海湾5000汉字编码app