项目需求
用户注册时输入自己的邮箱地址(这里以QQ邮箱为例),用户提交订单,管理员操作订单,订单审核通过时给用户发送邮件提醒用户,审核成功请尽快付款。
前期工作
导入发送邮件功能相关jar包
配置邮件服务器信息
先在邮箱中设置开启smtp和pop3服务然后拿到授权码:
以QQ邮箱服务为例
设置->账户
配置文件及代码
- 写mail.properties配置文件
#服务器主机名 smtp.xx.com
mail.smtp.host=smtp.qq.com #若无法识别可以写IP地址58.251.106.181,此处可能会用在部署到云服务器运行时设置
mail.smtp.username=**********@qq.com
#密码/客户端授权码
mail.smtp.password=*********** #刚刚得到的授权码
#编码字符
mail.smtp.defaultEncoding=utf-8
#是否进行用户名密码校验
mail.smtp.auth=true
#设置超时时间
mail.smtp.timeout=20000
- 配置spring-mybatis.xml。在配置文件中导入properties文件的属性:
<!--邮件配置-->
<context:property-placeholder location="classpath:config/mail.properties" ignore-unresolvable="true"/>
其中ignore-unresolvable="true"属性是配置文件中存在多个property-placeholder时出现解析不了的占位符进行忽略掉。这里我们不设置,因为一旦设置mail.properties中的占位符就无法解析,会被忽略掉。
比如
接着在spring-mybatis.xml中配置一个bean
<!--配置邮件接口-->
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.smtp.host}"/>
<property name="username" value="${mail.smtp.username}"/>
<property name="password" value="${mail.smtp.password}"/>
<property name="defaultEncoding" value="${mail.smtp.defaultEncoding}"/>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
</props>
</property>
</bean>
- Controller测试
@Autowired
private JavaMailSender javaMailSender;//在spring中配置的邮件发送的bean
MimeMessage mMessage=javaMailSender.createMimeMessage();//创建邮件对象
MimeMessageHelper mMessageHelper;
Properties prop = new Properties();
String from;
try {
//从配置文件中拿到发件人邮箱地址
prop.load(this.getClass().getResourceAsStream("/db.properties"));
from = prop.get("mail.smtp.username")+"";
mMessageHelper=new MimeMessageHelper(mMessage,true);
mMessageHelper.setFrom(from);//发件人邮箱
mMessageHelper.setTo(email);//收件人邮箱
mMessageHelper.setSubject("药店通知");//邮件的主题
mMessageHelper.setText("<p>您的处方订单已经通过审核,请及时前往付款</p><br/>" +
"<a href='http://49.233.250.224:8080/yaodian/login/'>登录网上药店</a><br/>"
/* + "<img src='cid:fengye'>"*/,true);//邮件的文本内容,true表示文本以html格式打开
javaMailSender.send(mMessage);//发送邮件
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
本地测试输入url,成功收到邮件!
项目部署
当项目部署到云服务器上运行时会出现运行超时的错误
!!!!因为发送邮件的服务默认的是使用25端口,但是不管是阿里云还是腾讯云都把25端口禁用了原因是怕邮件泛滥
所以我特地去我的腾讯云找到25端口解封,但是还是有类似的信息提示
阿里云也是类似的
或者使用SSL协议发送邮件,使用服务器会使用465端口来发送邮件,而不是被阿里云服务器禁用的25端口。
不用SSL协议的话,一般解开25端口就可以使用
如果还不行可能是因为Linux无法解析域名
将我们的服务器主机名写成IP地址的形式
#服务器主机名 smtp.xx.com
mail.smtp.host=smtp.qq.com #若无法识别可以写IP地址58.251.106.181,此处可能会用在部署到云服务器运行时设置
这样发送邮件的功能就已经能够成功实现了