Javamail新建邮件后,怎么保存进已发送或草稿箱?

hellwindy 2014-07-22 10:21:27

public void sendMail(String subject, String from, List<String> to, List<String> cc,
List<String> bcc, String bodyText, List<File> 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分
...全文
1007 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
李晓东1 2017-03-28
虽然过去有点久,但是本人也遇到这个问题,本人用的是263企业邮箱, 浏览器登录,里头有个”编辑文件夹”的选项,就是一个小扳手的图标,其他邮箱应该也是,其实就是设置的意思,点进去之后会看到一个'发信设置',点击后右边展开内容里可以看到‘保存客户端发件’的选项,说到这应该已经明白了吧,把下面的选项都勾上就保存就可以啦
回复 1
shunfeng556 2016-04-25
请教楼主,如何设置的服务器,具体说下。能够让java发送的邮件在登陆发送者邮箱后的已发送出看到? 请教了。
回复
lillita 2016-01-26
求助楼主,如何设置的服务器,具体说下。求教。
回复
hellwindy 2015-06-17
问题解决了 解决方式也很奇葩,在服务端有个设置,勾上之后发送时就能自动保存了 不选那个勾怎么都解决不了 应该是邮箱服务设置的问题
回复
jieshao0815 2014-07-29
/** * 身份认证 * @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); } }
回复
jieshao0815 2014-07-29
你在代码最顶端加一个身份验证试试,也就是先验证身份再发送, //判断是否需要身份验证 MyAuthenticator authenticator=null; Properties pro = mailInfo.getProperties(); if (mailInfo.isValidate()) { //如果需要身份认证,则创建一个密码验证器 authenticator = new MyAuthenticator("邮箱名", "邮箱密码"); } //根据邮件会话属性和密码验证构造一个发送邮件的Session Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
回复
逛街的猫 2014-07-25
学习一下~~~
回复
zgd77521 2014-07-25
应该是没有这个方法的,发邮件的时候,点击发送时候客户端自动调用方法,把你发送的邮件显示到发件箱里,读取的应该是邮件自己的数据库,你怎么通过自己的程序存到它的库呢?如果这样的话你只有自己写一个客户端了
回复
须等待 2014-07-25
引用 11 楼 hellwindy 的回复:
[quote=引用 10 楼 ygycomon 的回复:] 邮件协议里没有“保存已发送”这个东西吧。 这个已发送这个功能明显是客户端的功能,协议里只是规范服务器怎么转发。你既然是直接走协议不走客户端,没有进已发送应该很正常吧
如果我要人工存进去要怎么做呢? Folder,Message包括子类都看遍了[/quote] 我对邮件协议只有个大概的映像了,我大概分析一下: 1. 邮件协议里没有保存已发送这个规范,Folder也好Message也好都只是协议的实现,是协议的子集,必然都没有这个功能的。那么保存已发送必然是邮件客户端自己的行为,你走协议是走到邮件服务器,所以不管你怎么折腾都不会在已发送里找到你走协议发的邮件。 2. 邮件协议里有保存已发送这个规范,这个你得去看下协议了,我映像里好像是没有的。如果有,那应该是你要在报文里设置某个标识给服务器看,这里又有区别: 2.1 如果服务端没有实现保存已发送这个规范,那它果断直接就把你的标识忽略了,它没有保存这个功能,你再怎么折腾都是白搭。 2.2 如果服务端有实现规范,那么你发送的邮件肯定是被服务器存起来了,至于你为什么从客户端看不到,这和客户端的机制有关系,客户端怎么拉取数据的你不知道,这个就很难分析原因了。最直接的办法是看服务器端的数据持久化里到底有没有持久化你的数据。 综上,你还是先把协议研究清楚了再说吧。
回复
须等待 2014-07-24
邮件协议里没有“保存已发送”这个东西吧。 这个已发送这个功能明显是客户端的功能,协议里只是规范服务器怎么转发。你既然是直接走协议不走客户端,没有进已发送应该很正常吧
回复
LOVE-漂泊 2014-07-24
引用 7 楼 hellwindy 的回复:
[quote=引用 4 楼 sizhouzhou 的回复:] 这个要看你数据库的表设计了 有没有这个字段或者是你们数据库设计师分表的
兄弟,邮件是走服务器协议,根本没数据库的[/quote] 那 历史记录可以取到吗?
回复
hellwindy 2014-07-24
引用 6 楼 huxiweng 的回复:
自己搭建的邮件服务器? 如果使用pop3 SMTP的别人的邮件服务器,都会有记录的
用的magic winmail邮件服务器,它自带的web程序发完就有历史记录,我用SMTP发完就出去了且成功了,但本地没有已发送记录
回复
hellwindy 2014-07-24
引用 4 楼 sizhouzhou 的回复:
这个要看你数据库的表设计了 有没有这个字段或者是你们数据库设计师分表的
兄弟,邮件是走服务器协议,根本没数据库的
回复
hellwindy 2014-07-24
引用 10 楼 ygycomon 的回复:
邮件协议里没有“保存已发送”这个东西吧。 这个已发送这个功能明显是客户端的功能,协议里只是规范服务器怎么转发。你既然是直接走协议不走客户端,没有进已发送应该很正常吧
如果我要人工存进去要怎么做呢? Folder,Message包括子类都看遍了
回复
LOVE-漂泊 2014-07-23
比如你点击的是发送并保存 你就要走发送和保存这两个方法 不是一直走发送哪一个方法 你需要进行判断 然后看应该调用哪个方法 触发的函数不同 所谓标示 只是区分方便而已 具体要看你数据库怎么设计的 然后根据标示存进去就行
回复
LOVE-漂泊 2014-07-23
引用 2 楼 hellwindy 的回复:
[quote=引用 1 楼 sizhouzhou 的回复:] 你可以给draft设三个标示 一个是发送 一个是保存 一个是发送并保存 根据选择的按钮进行判断所走的方法 就可以了
问题是我无论怎么设flag,信发出去了,在我本地的已发送里就是没有,能不能详细说说[/quote] 这个要看你数据库的表设计了 有没有这个字段或者是你们数据库设计师分表的
回复
zgd77521 2014-07-23
找了半天也没找到,这个方法到底有没有?还是说邮件客户端自己处理的?但是一般用到发送邮件的话肯定是批量处理,甚至每天可能都要发很多封邮件,这样保存下来的话也会造成发件人邮箱饱满,还得手动清理。再找找吧,希望LZ找到具体办法了告诉我一声哈~
回复
hellwindy 2014-07-23
引用 1 楼 sizhouzhou 的回复:
你可以给draft设三个标示 一个是发送 一个是保存 一个是发送并保存 根据选择的按钮进行判断所走的方法 就可以了
问题是我无论怎么设flag,信发出去了,在我本地的已发送里就是没有,能不能详细说说
回复
ohfiner 2014-07-23
自己搭建的邮件服务器? 如果使用pop3 SMTP的别人的邮件服务器,都会有记录的
回复
LOVE-漂泊 2014-07-22
你可以给draft设三个标示 一个是发送 一个是保存 一个是发送并保存 根据选择的按钮进行判断所走的方法 就可以了
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2014-07-22 10:21
社区公告
暂无公告