昨天写了一个发送邮件的测试
首先写一个简单的小测试:
public class TestEmail {
public static void main(String[] args) {
try{
HtmlEmail email = new HtmlEmail();
email.setAuthentication("用户名 ","授权密码");
email.setHostName("smtp.163.com");
email.addTo("收件人邮箱@qq.com");
email.setFrom("发件人邮箱@163.com");
email.setSubject("这是一个用于测试的邮件!");
email.setCharset("GB2312");
email.setMsg("测试邮件的内容!");
email.send();
}catch(EmailException e){
throw new RuntimeException(e);
}
}
}
测试出来是可以发送的 然后我要在自己写的项目添加发邮件的功能,这样肯定是不行的,肯定要对它进行封装,封装之后
配置文件: 工具类:
package com.cxj.utils;
import javax.mail.internet.MimeUtility;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;
public class EmailUtils {
public boolean sendActivateMail(String to,String code){
InputStream in = EmailUtils.class.getClassLoader().getResourceAsStream("activeEmail.properties");
Properties prop = new Properties();
try {
prop.load(in);
String name = prop.getProperty("name");
String password = prop.getProperty("password");
String host = prop.getProperty("host");
String from = prop.getProperty("from");
String subject = prop.getProperty("subject");
String encode = prop.getProperty("encode");
String content = prop.getProperty("content");
content = MessageFormat.format(content,code);
EmailUtils emailUtils = new EmailUtils();
return emailUtils.sendMail(name,password,host,to,from,subject,content,encode);
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public boolean sendMail(String name,String password,String host,String to,String from,String subject,String content,String encode){
try{
HtmlEmail email = new HtmlEmail();
email.setAuthentication(name,password);
email.setHostName(host);
email.addTo(to);
email.setFrom(from);
email.setSubject(subject);
email.setCharset(encode);
email.setMsg(content);
email.send();
return true;
}catch(EmailException e){
e.printStackTrace();
return false;
}
}
}
然后进行测试:
public class TestEmail {
public static void main(String[] args) {
EmailUtils send = new EmailUtils();
send.sendActivateMail("收件人邮箱@qq.com","邮箱主题");
}
}
发送过来是这样的 经过调试我发现,因为我的配置文件中邮件的主题和内容全部都是中文的,所以它在被读取出来时就是乱码。 然后我就去网上找,发现只要这样修改就对了 但是注意,我修改这里的设置的时候,我的配置文件中中文还在,然后我进行设置,勾选配置文件自动将中文转换为ASCII码,设置完之后发现配置文件中的中文直接乱码了。我先是把乱码删除了,然后再把中文写上,结果测试时候直接报错: 我先是自己尝试:
1、把设置改回去 2、配置文件的中文换成数字和英文 3、重启idea
结果他还是不行,但是我如果写死不进行封装的话就不会报错,能发送过来。不知道为什么 去网上找答案基本都是说
我的邮箱相关服务没有开启 我邮箱的账号或者授权密码写错了 我收件人邮箱写错了
但是我保证,这些我都写对了,他还是不行。期间有人和我说,这是因为163邮箱把我的邮件当成垃圾处理了,可是我还是不明白,为什么一直,不封装就能发送过来,封装的就一直报错。
后来我就换成用QQ邮箱发送,结果不封装和封装都可以发送过来,然后我又想试试163邮箱还有救吗 再次测试163,我的配置文件里没有中文,天哪,他竟然可以发送过来了,我不知道为什么,我什么地方都没有改,只是换成QQ邮箱测试了几次,再回来测试它就可以了 然后我就尝试着,去改设置,其实我下了很大的决心去改设置的,因为我怕又想上次一样导致163报错,结果我改完设置,再次尝试发送邮件,竟然可以?我又把配置文件中的邮箱主题和内容换成中文,还是可以! 为什么两次修改设置,结果却截然不同呢?
我终于找到了答案 第一次修改设置的时候,我的配置文件中有中文,修改后配置文件中的中文直接乱码了,然后运行报错(咱也不知道为啥) 第二次修改设置的时候,我的配置文件中没有中文,可以正常运行,并且我后来添加中文,也可以正常运行
所以,这种配置文件中有中文,然后测试时乱码的问题,去修改设置,勾选 “ 配置文件里中文转换为ASCII ” 的时候,配置文件中一定不要有中文,以免出现问题
小白所写,如有错误,欢迎指出。
|