昨晚,媳妇很感伤的看着我
媳妇:以后岁数大了,我要走你前面去了,你再找个老伴
我:我不想找
媳妇:你找一个,不用替我守着,以后你说你头疼发烧,也得有个给你端水递药的呀
媳妇抹着眼泪:到老是个伴
我:我想找个年轻的
现在我左脸还有一个掌印,火辣辣的

基于 JavaMail 1.5.5 ,实现了邮件发送功能,也对接了一些客户,没出现什么问题
代码如下
/**
* 邮件发送
* @param message 邮件内容
* @param to 收件人邮箱
* @param attachment 附件
*/
public static void sendEmail(String message, String to, File attachment) throws Exception {
//设置邮件会话参数
Properties props = new Properties();
//邮箱的发送服务器地址
props.setProperty("mail.smtp.host", MAIL_HOST);
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.put("mail.smtp.ssl.enable", "true");
//邮箱发送服务器端口,这里设置为465端口
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth", "true");
//获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm
Session session = Session.getDefaultInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(MAIL_USER_NAME, MAIL_AUTH_CODE);
}
});
// 开启调试,生产不开启
session.setDebug(true);
Multipart multipart = new MimeMultipart();
BodyPart contentPart = new MimeBodyPart();
//contentPart.setContent(message, "text/html;charset=UTF-8");
contentPart.setText(message);
multipart.addBodyPart(contentPart);
if (attachment != null) {
BodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(attachment);
attachmentBodyPart.setDataHandler(new DataHandler(source));
//MimeUtility.encodeWord可以避免附件文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
multipart.addBodyPart(attachmentBodyPart);
}
//通过会话,得到一个邮件,用于发送
Message msg = new MimeMessage(session);
//设置发件人
msg.setFrom(new InternetAddress(MAIL_USER_NAME));
//设置收件人,to为收件人,cc为抄送,bcc为密送
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
// msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(to, false));
// msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(to, false));
msg.setSubject("我是主题");
//设置邮件消息
msg.setContent(multipart);
//设置发送的日期
msg.setSentDate(new Date());
//调用Transport的send方法去发送邮件
Transport.send(msg);
}
View Code
附件名是做了编码处理的

我们来看下接收情况
Foxmail

outlook windows 版本

一切看似都很平静

直到她们的出现,让我慌了神
QQ邮箱(web 端)

outlook web 版本

此刻,我们的脑中应该有 2 个问题
1、乱码该如何修复
2、为什么客户端版(Foxmail、outlook windows版)接收正常,而 web版 却出现了乱码?
这个上网一搜,很容易就能找到答案,加一个系统属性即可

mail.mime.splitlongparameters 默认值是 true ,表示编码后的附件名文件名长度超过 60 之后会进行多段拆分,每 60 个字符作为一个参数,最后不足 60 个字符的作为一个参数
我们把 mail.mime.splitlongparameters 设置成 false ,再看下效果
QQ 邮箱

outlook web

有人可能会有疑问了:你说 60 就 60,你说拆分就拆分?

既然不信我,那我们从源码找答案

设置附件名的时候,有这样一段代码

注意第一个 if 中的条件,是有三个
1、附件名编码后的长度
2、 mail.mime.splitlongparameters
3、 mail.mime.encodeparameters ,默认值是 true
当三个条件都为 true ,才会以 60 字符为单位进行多段拆分
你好_好久不见_别来无恙_20230306.txt 编码后再拆分得到的结果是

文件名被拆分成了三段,我可曾欺你们?

此刻需要纠正下,web 版出现的附件名不是乱码,而是编码之后未能正确解码
为什么未能正确解码?
那是因为不支持 RFC2231 style encoded parameters
其实可能不只是 web 版不支持,可能还有其他的邮件客户端不支持,只是楼主未去尝试而已
1、是要满足三个条件才会对附件名进行多段拆分,忘记了的往上翻一翻
2、为什么要进行附件名的多段拆分? 呃呃呃...,由你们来回答
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=
这个问题在这里已经有了答案:WhatisRuby'sdouble-colon`::`?(12个答案)关闭8年前。什么是::?@song||=::TwelveDaysSong.new
这个问题在这里已经有了答案:Whatdoes`if__FILE__==$0`meaninRuby(6个答案)关闭6年前。我在审查Ruby代码时偶然发现了这个语法。代码是:if__FILE__==$PROGRAM_NAME#somecode...end我想__FILE__是一个变量,可以让我获取我所在文件的名称?但是$PROGRAM_NAME简化了什么?另外,为什么这个if语句是必需的,因为程序可以使用或不使用它?
我在一个我想在formtasticGem中覆盖的方法中找到了这个。该方法如下所示:defto_htmlinput_wrappingdohidden_field_html是什么意思?在第三行做什么?我知道它对数组有什么作用,但在这里我不知道。 最佳答案 你可以这样读:hidden_field_htmllabel_with_nested_checkbox是连接到hidden_field_html末尾的参数-为了“清晰”,他们将其分成两行 关于ruby-on-rails-没有参数的`
我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成
我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe
我想验证一个电子邮件地址是否是PayPal用户。是否有API调用来执行此操作?是否有执行此操作的ruby库?谢谢 最佳答案 GetVerifiedStatus来自PayPal'sAdaptiveAccounts平台会为您做这件事。PayPal没有任何codesamples或SDKs用于Ruby中的自适应帐户,但我确实找到了编写codeforGetVerifiedStatusinRuby的人.您需要更改该代码以检查他们拥有的帐户类型的唯一更改是更改if@xml['accountStatus']!=nilaccount_status
我想知道我应该如何着手这个项目。我需要每周向人们发送一次电子邮件。但是,这必须在每周的特定时间自动生成并发送。编码有多难?我需要知道是否有任何书籍可以提供帮助,或者你们中的任何人是否可以指导我。它必须使用rubyonrails进行编程。因此有一个网络服务和数据库集成。干杯 最佳答案 为什么这么复杂?您只需安排工作。您可以使用Delayed::Job例如。Delayed::Job让您可以使用run_at符号在特定时间安排作业,如下所示:Delayed::Job.enqueue(SendEmailJob.new(...),:run_