前两天想用,javamail实现一个发送邮件验证码的功能,但是又不想用qq或者163邮箱,于是乎查到了postfix这么个东西,用postfix+cyrus-sasl成功的实现了邮件的发送,中间经历了千辛万苦,终于能用javamail和配置好的postfix阿里云服务器给发送邮件了,特此记录下!
1.Ubuntu16.04 阿里云的产品
2.一个域名
3.postfix,cyrus-sasl
一、DNS解析的配置
按照如图的解析配置就行了,这一步还是挺简单的
二、安装配置postfix
sudo apt-get install postfix
上面的命令执行后,可以到/etc/postfix目录下,找到main.cf的文件按照如下内容配置
mydomain=xxx.com.cn
myorigin = $mydomain
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = mail.xxx.com.cn
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname,$mydomain , iZ2819v97ovZ,localhost.localdomain, , localhost
relayhost =
relay_domains=$mydestination
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
上面的配置看起来很繁琐,但是主要配置的下面的几个属性
mydomain=xxx.com
myhostname=mail.xxx.com.cn
mydestination=$mydomain,$myhostname
一般情况下,配置完以上的几个属性,如果不出意料的话,你用如下的命令是可以向你的公网邮箱发送邮件的:
echo "this is a test mail"|mail -s "test" your_email_address
到这里,到qq邮箱或者163邮箱你能发现发送这封邮件给你的是一个root@xxx.com.cn地址的邮箱,这时候你也许就会和我一样,乐呵呵的拿着root@xxx.com.cn这个地址(默认密码设置为空),用javamail去进行邮件发送的测试了,如果不出意料的话,你会得到以下的报错,而且翻遍全网基本都找不到一个有用的解释
#错误代码如下
454 4.7.1 <to@somedomain.com> Relay access denied
我对这个报错的理解是,你还没有smtp的账号密码,所以你不能用javamail通过postfix发送邮件,不知道我理解的到不到位,反正我是这么感觉的。
三、postfix配置smtp账号密码
首先安装cyrus-sasl
sudo apt-get insatll sasl2-bin
1.再次找到/etc/postfix/main.cf文件,在文件的末尾,加入如下配置
#默认情况下下面的配置内容都不会有,把下面的直接拷贝即可
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_client_restrictions = permit_sasl_authenticated
broken_sasl_auth_clients = yes
smtpd_sasl_path = smtpd
smtpd_sasl_security_options = noanonymous
smtpd_sasl_authenticated_header = yes
message_size_limit = 15728640
加入以上配置的时候记得重启下postfix
systemctl restart postfix.service
2.在/etc/postfix/sasl目录下,新建smtpd.conf,内容如下
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
3.接着使用saslpasswd2创建用户
#your_user_name@xxx.com.cn
saslpasswd2 -c -u xxx.com.cn your_user_name
会提示你输入密码,输入一次确认一次
4.接着进行操作
sudo cp -a /etc/sasldb2 /var/spool/postfix/etc/
这里很关键,在ubuntu下postfix所能浏览的目录有限制,必须把数据库文件复制到postfix的运行目录下,不然在用户验证的时候会出错。
5.将postfix添加到sasl组:
gpasswd -a postfix sasl
修改sasldb的权限
chmod 640 /var/spool/postfix/etc/sasldb2
查看sasldb2中的用户
sasldblistusers2 -f /var/spool/postfix/etc/sasldb2
如果你仔细的完成了如上的操作的话,基本上用javamail发送邮件是没问题了,下载直接给出我javamail操作postfix的代码
package mail;
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
public class MailTest {
private String sendMailUserName;
private String sendMailPassword;
private String toMail;
private String title;
private String content;
public MailTest(String sendMailUserName, String sendMailPassword, String toMail, String title,
String content){
this.sendMailPassword = sendMailPassword;
this.sendMailUserName= sendMailUserName;
this.toMail=toMail;
this.title =title;
this.content=content;
}
public void send() throws MessagingException, UnsupportedEncodingException {
Properties props = new Properties();
props.put("mail.smtp.host", "mail.xxx.com.cn");
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(sendMailUserName,sendMailPassword);
}
});
Transport transport = session.getTransport("smtp");
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("root@xxx.com.cn","社会人"));
message.setSubject(title);
message.setText(content);
message.setRecipient(Message.RecipientType.TO,new InternetAddress(toMail));
transport.send(message);
}
}
调用方法如下
public static void main(String[] args) throws Exception {
MailTest test = new MailTest("root@xxx.com.cn","your_password","xxx@163.com","test","test");
test.send();
}
最后为了告诉你们这样配置是可行的,我截个图。
centos版的友情链接,我没试过但是基本都是同样配置,下载的文件名不同而已:https://blog.csdn.net/qq_33325153/article/details/52948447?ref=myread,https://www.hyahm.com/article/225.html