java邮件服务器搭建_邮件服务器+javamail(仅包括发送)搭建
前言:
最近寫一個管理系統需要用到發送郵件的功能,曾經在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(仅包括发送)搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 木马查杀
- 下一篇: 海湾5000汉字编码app