public void sendMail(String subject, String from, List to, List cc,
List bcc, String bodyText, List files, boolean draft) {
Message message = new MimeMessage(session);
try {
// 设置发件人地址
message.setFrom(new InternetAddress(from));
// 设置主题
message.setSubject(subject);
// 设置收件人
if(to!=null){
for (String item : to) {
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(item));
}
}
// 设置抄送人
if(cc!=null){
for (String item : cc) {
message.addRecipient(Message.RecipientType.CC,
new InternetAddress(item));
}
}
// 设置密送人
if(bcc!=null){
for (String item : bcc) {
message.addRecipient(Message.RecipientType.BCC,
new InternetAddress(item));
}
}
if(draft){
message.setFlag(Flags.Flag.DRAFT, true);
}
// 设置邮件内容
Multipart multipart = new MimeMultipart();
MimeBodyPart txtPart = new MimeBodyPart();
txtPart.setContent(bodyText, "text/html;charset=utf-8");
multipart.addBodyPart(txtPart);
// 添加附件
if (files != null && files.size() > 0) {
for (File f : files) {
MimeBodyPart part = new MimeBodyPart();
FileDataSource fds = new FileDataSource(f); // 得到数据源
part.setDataHandler(new DataHandler(fds)); // 得到附件本身并至入BodyPart
String filename=encodeFileName(fds.getName());
part.setFileName(filename); // 得到文件名同样至入BodyPart
multipart.addBodyPart(part);
}
}
message.setContent(multipart);
message.setFlag(Flags.Flag.RECENT, true);
message.saveChanges();
if(!draft){
Transport transport = session.getTransport("smtp");
transport.connect(host, userName, passWord);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
代码如上,邮件能发给接收人,但是无法存入本人的已发送目录。
而且draft是我用来区分发出去还是暂时存草稿的,也没用,谁能指导一下?200分
#1
你可以给draft设三个标示 一个是发送 一个是保存 一个是发送并保存 根据选择的按钮进行判断所走的方法 就可以了
#2
回复1楼:
问题是我无论怎么设flag,信发出去了,在我本地的已发送里就是没有,能不能详细说说
#3
找了半天也没找到,这个方法到底有没有?还是说邮件客户端自己处理的?但是一般用到发送邮件的话肯定是批量处理,甚至每天可能都要发很多封邮件,这样保存下来的话也会造成发件人邮箱饱满,还得手动清理。再找找吧,希望LZ找到具体办法了告诉我一声哈~
#4
回复2楼:
这个要看你数据库的表设计了 有没有这个字段或者是你们数据库设计师分表的
#5
比如你点击的是发送并保存 你就要走发送和保存这两个方法 不是一直走发送哪一个方法 你需要进行判断 然后看应该调用哪个方法 触发的函数不同 所谓标示 只是区分方便而已 具体要看你数据库怎么设计的 然后根据标示存进去就行
#6
自己搭建的邮件服务器?
如果使用pop3 SMTP的别人的邮件服务器,都会有记录的
#7
回复4楼:
兄弟,邮件是走服务器协议,根本没数据库的
#8
回复6楼:
用的magic winmail邮件服务器,它自带的web程序发完就有历史记录,我用SMTP发完就出去了且成功了,但本地没有已发送记录
#9
回复7楼:
那 历史记录可以取到吗?
40分
#10
邮件协议里没有“保存已发送”这个东西吧。
这个已发送这个功能明显是客户端的功能,协议里只是规范服务器怎么转发。你既然是直接走协议不走客户端,没有进已发送应该很正常吧
#11
回复10楼:
如果我要人工存进去要怎么做呢?
Folder,Message包括子类都看遍了
100分
#13
回复11楼:
我对邮件协议只有个大概的映像了,我大概分析一下:
1. 邮件协议里没有保存已发送这个规范,Folder也好Message也好都只是协议的实现,是协议的子集,必然都没有这个功能的。那么保存已发送必然是邮件客户端自己的行为,你走协议是走到邮件服务器,所以不管你怎么折腾都不会在已发送里找到你走协议发的邮件。
2. 邮件协议里有保存已发送这个规范,这个你得去看下协议了,我映像里好像是没有的。如果有,那应该是你要在报文里设置某个标识给服务器看,这里又有区别:
2.1 如果服务端没有实现保存已发送这个规范,那它果断直接就把你的标识忽略了,它没有保存这个功能,你再怎么折腾都是白搭。
2.2 如果服务端有实现规范,那么你发送的邮件肯定是被服务器存起来了,至于你为什么从客户端看不到,这和客户端的机制有关系,客户端怎么拉取数据的你不知道,这个就很难分析原因了。最直接的办法是看服务器端的数据持久化里到底有没有持久化你的数据。
综上,你还是先把协议研究清楚了再说吧。
50分
#14
应该是没有这个方法的,发邮件的时候,点击发送时候客户端自动调用方法,把你发送的邮件显示到发件箱里,读取的应该是邮件自己的数据库,你怎么通过自己的程序存到它的库呢?如果这样的话你只有自己写一个客户端了
#15
学习一下~~~
#17
你在代码最顶端加一个身份验证试试,也就是先验证身份再发送,
//判断是否需要身份验证
MyAuthenticator authenticator=null;
Properties pro = mailInfo.getProperties();
if (mailInfo.isValidate()) {
//如果需要身份认证,则创建一个密码验证器
authenticator = new MyAuthenticator(“邮箱名”, “邮箱密码”);
}
//根据邮件会话属性和密码验证构造一个发送邮件的Session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
10分
#18
/**
* 身份认证
* @author Administrator
*
*/
public class MyAuthenticator extends Authenticator {
String userName = null;
String password = null;
public MyAuthenticator() {
}
public MyAuthenticator(String username, String password) {
this.userName = username;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
}
#19
问题解决了
解决方式也很奇葩,在服务端有个设置,勾上之后发送时就能自动保存了
不选那个勾怎么都解决不了
应该是邮箱服务设置的问题