postfix+javamail实现邮件发送

前两天想用,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=myreadhttps://www.hyahm.com/article/225.html

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值