关于email:经典20句商务邮件英语让你写邮件轻松百倍

经典20句商务邮件英语,让你写邮件轻松百倍!:转发邮件:For your information. (FYI)(请知悉) For your reference. (FYR)(供你参考) 表示同意:I’m fine with it.(我对此没有异议) Noted.(我晓得了) 揭示附件:The document is attached.(敬请查收附件) The latest version is attached.(请查收附件获取最新信息) 被动征询:If you have any problems, please let me know.(如果你有任何问题,请通知我) Any further questions, please feel free to reach out.(如需更多谘询,请分割我不要客气) 揭示分割:I’ll keep you posted.(我会与你放弃联系) Please keep me informed.(请随时告知我) 礼貌督促:Please let me know as soon as possible.(心愿尽快告知我) Looking forward to hearing from you soon.(期待能快点听到你的音讯) 诚挚赔罪:Sorry for the delay in replying your letter.(对于未能及早回复,咱们感到很道歉) ...

September 14, 2021 · 1 min · jiezi

关于email:以编程方式设置用于从FastReportNet发送默认电子邮件客户端设置

[FastReport .Net]是实用于Windows Forms,ASP.NET,MVC和.NET Core的全功能[报表]解决方案。它能够在Microsoft Visual Studio 2005-2019中应用。反对.Net Framework 2.0-4.x,.NET Core 3.0及以上版本。 在FastReport .NET 2021.1的新版本中,咱们实现了对.NET 5的反对。增加了新条形码-Deutsce Post Leitcode。将RTF转换为报告对象的算法已失去显着改良。并且还增加了用于转换数字的新性能。 与许多其余报告生成器一样,FastReport.Net容许您通过电子邮件以任何可用的导出格局发送报告。您能够在报告预览模式或自定义利用程序代码中发送电子邮件。 要发送电子邮件,您须要设置发件人,收件人设置。 在“帐户”选项卡上,设置用于发送电子邮件的电子邮件客户端设置以及发件人的地址和名称。 在“电子邮件”选项卡上,设置收件人的地址,电子邮件主题,电子邮件文本,最重要的是要附加到电子邮件的报告格局。发送电子邮件后,报告将以指定的格局主动导出并附加到电子邮件中。  您设置的任何设置都会在发送电子邮件时保留为默认设置,当前您能够应用它们。在EnvironmentSettings组件的利用程序代码中初始化电子邮件设置值时,状况也是如此。仅在发送电子邮件后才保留设置。然而,如果您心愿立刻利用默认电子邮件设置,而不用发送电子邮件来保留它们怎么办?如果您在多用户应用程序中应用报告生成器并心愿进行邮件预设,以便用户仅需输出收件人地址并单击“发送”按钮,这可能会很有用。 默认电子邮件设置位于FastReport.Net报表生成器配置文件中,该文件通常位于指定的门路中 C:UsersUserAppDataLocalFastReportFastReport.config. 在文本编辑器中关上此文件,您将看到一个xml。找到“帐户设置”局部,如果您曾经从预览模式发送邮件,则将看到用于发送邮件的默认设置。要在自定义应用程序中编辑此文件,请应用以下代码: XmlItem xi = Config.Root.FindItem("EmailExport").FindItem("AccountSettings");// save account infoxi.SetProp("Address", "a@a.com");xi.SetProp("Name", "Name");xi.SetProp("Template", "template");xi.SetProp("Host", "host");xi.SetProp("Port", "25");xi.SetProp("UserName", "UserName");xi.SetProp("Password", "Password");xi.SetProp("EnableSSL", "1"); // "0" if SSL needs to be disabled 在这段代码中,咱们浏览了配置文件并找到了邮件设置局部。而后-咱们进行设置。如果此局部或其属性不在配置中,则会主动增加它们。 这样,咱们能够为用户创立预配置的邮件设置。

February 22, 2021 · 1 min · jiezi

关于email:golang发送邮件qq邮箱

golang发送邮件(qq邮箱)后期筹备golang发送邮件的性能,咱们明天介绍golang发送qq邮件,置信大家都有qq邮箱吧,操作起来比拟便捷,应用golang发送邮件更是简略,置信大家看完都能上手操作并学会。 通过编码的形式发送邮件,即理论是调用qq邮箱提供的接口来进行邮件的发送,咱们在编写该性能前,须要拿到qq邮箱的POP3/SMTP服务的受权码 进入本人的qq邮箱->设置->账户->往下滑 开启本人qq邮箱的POP3/SMTP服务,并拿到本人qq邮箱的受权码(反对长期生成),受权码长期有效倡议保留代码编写package mainimport ( "fmt" "gopkg.in/gomail.v2")func main() { m := gomail.NewMessage() //发送人 m.SetHeader("From", "xxx@qq.com") //接管人 m.SetHeader("To", "xxx@qq.com") //抄送人 //m.SetAddressHeader("Cc", "xxx@qq.com", "xiaozhujiao") //主题 m.SetHeader("Subject", "小佩奇") //内容 m.SetBody("text/html", "<h1>新年快乐</h1>") //附件 //m.Attach("./myIpPic.png") //拿到token,并进行连贯,第4个参数是填受权码 d := gomail.NewDialer("smtp.qq.com", 587, "xxx@qq.com", "xxxxxx") // 发送邮件 if err := d.DialAndSend(m); err != nil { fmt.Printf("DialAndSend err %v:", err) panic(err) } fmt.Printf("send mail success\n")}成果展现 大家若是有乏味的想法应用golang实现,能够反馈,咱们能够一起尝试和学习。

February 16, 2021 · 1 min · jiezi

关于email:每日情话之跟着大佬学node邮件服务器

node-mail-service基于node的邮件服务定时每日给女朋友们发送情话嘿嘿嘿就是照着大佬学习的Github我的项目地址 启动服务git clone 本我的项目yarn install 或 npm installyarn serve 或 npm run serve创立你的邮件服务找一个你喜爱的文件夹执行 yarn init 创立一个package.jsonyarn add nodemailer axios node-schedule 下载要用到的三个依赖:获取情话、邮件服务、定时工作去你的邮箱开启邮件服务并获取受权码创立index并根据本我的项目实现邮件服务node index 或 yarn serve 启动服务;终端顺次显示爱心启动、你的情话、行将收回、发送胜利|发送失败配置邮箱服务以163邮箱为例 function sendMail(text, title = "敬爱的小宝贝") { const user = "你的163邮箱@163.com"; // 用163邮件服务就应用你的163邮箱,用qq邮件服务就用qq邮箱 const pass = "你的受权码"; // 邮箱受权码,见下① const to = "对方的邮箱@qq.com"; // 对方的邮箱,任意邮箱 const transporter = nodemailer.createTransport({ service: '163', host: "smtp.163.com", port: 994, // 不同的邮箱端口号不同,见下罕用邮箱服务器地址及端口② secure: true, auth: { user: user, // 用户账号 pass: pass, //受权码 }, }); console.log('行将收回'); transporter.sendMail({ from: user, to: to, subject: title, text: text, }).then(res => { console.log('发送胜利:', res); }).catch(err => { console.log('发送失败:', err); });}注:① 进入你的邮箱,找到左上角账号前面的设置,抉择POP3/SMTP/IMAP设置,开启IMAP/SMTP服务、POP3/SMTP服务发个短信即可,短信发完下面会显示你的受权码,163邮箱只显示一次,留神保留。 其余邮箱步骤大致相同。 ...

January 18, 2021 · 1 min · jiezi

DMARC-介绍

DMARC 是什么?DMARC 是 “Domain-based Message Authentication, Reporting & Conformance” 的缩写。它用来检查一封电邮是否来自所声称的发送者。DMARC 建立在广泛使用的 SPF 和 DKIM 协议上, 并且添加了域名对齐检查和报告发送功能。这样可以改善域名免受钓鱼攻击的保护。 这是来自 dmarc.org 的示意图: 为什么 DMARC 如此重要?根据 dmarc.org 的说法: 随着社交网络和电子商务的繁荣,垃圾邮件发送者和钓鱼攻击发起者基于利益的原因,想要入侵用户的账户,破解用户的信用卡等。Email 的相对容易攻击的特性备受罪犯们的青睐。只是简单地把企业的 logo 嵌入到 email 中,就能获取用户的信任。用户很难辨别一封假的 email,邮件提供商也很难判断哪些邮件有可能会伤害用户。邮件发送者基本上对邮件认证的问题一无所知,因为他们缺少合理的反馈机制。那些尝试部署 SPF 和 DKIM 的企业的进展非常慢,因为没有监督进度和除错的机制。 DMARC 解决了这些问题。它帮助 email 发送者和接收者来共同保护 email,避免了昂贵的入侵损失。 DMARC 记录是什么?DMARC 记录作为 TXT 资源记录发布到 DNS 中。它指示当验证失败时,应当如何处理收到的 email。 考察以下的发布在域名 “sender.exampledomain.com” 上的 DMARC 记录: v=DMARC1;p=reject;pct=100;rua=mailto:postmaster@exampledomain.com在这个例子中,发送者请求接收者完全拒绝验证未通过的 email,并且发送相关报告至 postmaster@exampledomain.com。如果发送者是在测试配置的话,"reject" 有可能被替换成 "quarantine",意味着验证未通过的 email将被隔离。DMARC 记录使用可扩展的 “标签-值” 语法。 DMARC 记录标签是什么?这是一个典型的 DMARC 记录: ...

May 25, 2019 · 1 min · jiezi

简单两步使用node发送qq邮件

node发送邮件非常简单,这里只做qq的演示,你可以举一反三.使用nodemailer包let transporter = nodemailer.createTransport({ // 使用qq发送邮件 // 更多请查看支持列表:https://nodemailer.com/smtp/well-known/ service: ‘qq’, port: 465, // SMTP 端口 secureConnection: true, // 使用了 SSL auth: { user: ‘751734566@qq.com’, // 这里密码不是qq密码,是你设置的smtp授权码 // 获取qq授权码请看:https://jingyan.baidu.com/article/6079ad0eb14aaa28fe86db5a.html pass: ‘xxxxxxxx’, }});接下来我们设置我们到发送内容let mailOpt= { from: ‘“test” <xxxxxx@qq.com>’, // 你到qq邮箱地址 to: ‘xxxx@qq.com’, // 接受人,可以群发填写多个逗号分隔 subject: ‘Hello’, // 主题名(邮件名) // 可以发送text或者html格式,2选1 // text: ‘Hello world?’, // 纯文本 html: ‘<b>Hello world?</b>’ // html};如果我们想发一个稍微漂亮到邮件怎么办?我们可以使用html模板来实现const template = require(‘art-template’);let html = template(__dirname + ‘/mail_temp.html’, obj) // mail_temp.html为你想使用到页面模板,obj为你的参数// 例如obj = { name : ’test’, phone : ‘183xxxxxxxx’, time : new Date()}<section> 新用户:{{name}}({{phone}})于{{time}}进行了注册.</section>所有准备完成,让我们发送邮件吧!// 执行发送transporter.sendMail(mailOptions, (error, info) => { if (error) { return console.log(error); } console.log(‘邮件已发送成功,邮件id: %s’, info.messageId);});文档参考nodemailer : https://www.npmjs.com/package...art-template : https://aui.github.io/art-tem… ...

February 28, 2019 · 1 min · jiezi

正式的介绍「Mutt」:命令行的邮件大师 (一文详解)

为什么要用Mutt?这个世界已经有了成百上千的漂亮邮件客户端,为什么还要用命令行里的?其实说什么功能都没用。说到本质上,其实是一种Geek精神,一种爱折腾的精神,一种Customizability的精神。就像明明有WhatsApp,还要用IRC一样的精神;明明有Finder,还要用Ranger的精神。在终端里待久了,会比较烦GUI,所以不管什么软件都会寻求终端的替代方案。对于这个需求来说,在Linux的世界里,似乎就只有一个选择:Mutt。Mutt的可配置性,强如Vim。配置起来也和Vim差不多,有专门的~/.muttrc供你配置软件本身。需要理解的是:Mutt本身是一个框架而已。收件、发件、编辑邮件等功能,是要通过搭配不同的程序来做到的。Mutt的模块搭配方案就像穿衣搭配一样,收件发件过滤邮件转发邮件各种功能都有很多种程序可以用,mutt怎么搭配呢?常用选项有这些(User/Transport/Delivery):MUA 收件:fetchmail或getmail或OfflineIMAPMTA 发件:sendmail或msmtp或postfix。其中msmtp兼容强,postfix对国内不友好MDA 分类: procmail或maildrop邮件编辑:VIM。参考邮件代理(功能分类):Email agent (infrastructure) - Wikipedia)一般搭配是:老式搭配:mutt + getmail + sendmail + procmail新式搭配:mutt + fetchmail + msmtp + maildrop但是maildrop不支持Mac,而procmail比较通用一点。所以这里我们用:mutt + fetchmail + msmtp + procmail安装:# Mac$ brew install mutt fetchmail msmtp procmail# Ubuntu$ sudo apt-get install mutt fetchmail msmtp procmail -yMutt或各个写协作程序在配置前都是不能使用的,学习曲线还是比较陡峭的,所以要做好准备去花好一段去了解和学习各个部件。大概的配置流程是:配置收件:/.fetchmailrc配置过滤:/.procmailrc配置发件:/.msmtprc配置mutt框架本身:/.muttrc注意:初学过程中,不要一上来就配置mutt。最好是先从各个部件开始:收件->过滤邮件->阅读邮件->发件->mutt界面,按照这种顺序。配置参考:参考Arch Wiki:Mutt (极详细,但对人类不友好)参考Youtube:Mutt - Email for everyone (nerds like me)收件:配置FetchmailFetchmail是由著名的《大教堂与集市》作者 Eric Steven Raymond 编写的。Fetchmail是一个非常简单的收件程序,而且是前台运行、一次性运行的,意思是:你每次手动执行fetchmail命令,都是在前台一次收取完,程序就自动退出了,不是像一般邮件客户端一直在后台运行。注意:fetchmail只负责收件,而不负责存储!所以它是要调用另一个程序如procmail来进行存储的。fetchmail的配置文件为~/.fetchmailrc。然后文件权限最少要设置chmod 600 /.fetchmailrc参考:Using Fetchmail to Retrieve Email比如我们要设置多个邮箱账户同时收取,那么配置如下:poll pop.AAA.com protocol POP3 user “me@AAA.com” password “123"poll pop.BBB.com protocol POP3 user “me” there with password “123” is falko here fetchallpoll pop.CCC.com protocol POP3 user “me” there with password “123” is till here keeppoll pop.DDD.com protocol POP3 user “me” password “123”# 全局选项mimedecodemda “/usr/local/bin/procmail"其中,各种参数可以不按顺序,也可以不在一行。 空格隔开每个参数,poll隔开每个账户。here, there, with, is等等,都不是关键词,随便写不影响参数。poll后面是邮件服务器的地址,一般是pop.xxx.comprotocol后面是收件协议,一般是pop或pop3user后面是用户名,可以是username,也可以是邮箱地址password后面是密码以上是必填,其它都不是必要的四选一:fetchall, nofetchall, keep, nokeepmimedecode用来自动解码MIMEmda后面指定本机安装的邮件过滤分类程序。如果不填,则收取的邮件在本地不会保存。可以用$ which procmail查一下路径。配置完成后,可以运行fetcmail -v来看看是否有错误信息,如果能够正常显示很多行的收取信息,那么就能正确登录邮箱收取了。一般收取的命令如下:# 只收取未读邮件$ fetchmai# 收取所有邮件$ fetchmail -a# (重要)收取新邮件,但不在服务器端删除已经收取的邮件$ fetchmail -k但是fetchmail只负责收取,不负责“下载”部分,你找不到邮件存在哪了。所以还需要配置MDA分类器,如procmail,才能看到下载后的邮件。注意:Fetch其实不是在Mutt“里”使用的,而是脱离mutt之外的!也就是说,Mutt只负责读取本地存储邮件的文件夹更新,而不会自动帮你去执行fetchmail命令。你必须自己手动执行,或者用Crontab定期收取,或者设为Daemon守护进程,还可以在Mutt中设置快捷键执行Shell命令。设置Mutt快捷键收取邮件的方法是在/.muttrc中加入macro:macro index,pager I ‘<shell-escape> fetchmail -vk<enter>‘这样的话,你就可以在index邮件列表中按I执行外部shell命令收取邮件了。邮件过滤:配置ProcmailProcmail是单纯负责邮件的存储、过滤和分类的,一般配合fetchmail收件使用。在Pipline中,fetchmail把收到的邮件全部传送到Procmail进行过滤筛选处理,然后Procmail就会把邮件存到本地形成文件,然后给邮件分类为工作、生活、重要、垃圾等。当然,分类规则是自己可以指定的。可以根据发信人、主题、长度以及关键字 等对邮件进行排序、分类、整理。参考:ProcmailProcmail 的配置文件是 /.procmailrc ,记得改权限:chmod 600 /.procmailrc。内容也非常简单,前面是邮件位置、日志等默认选项,后面则是一块一块的过滤规则。基本配置:MAILDIR=$HOME/Mail #邮件存储地址DEFAULT=$MAILDIR/inbox #默认:收件箱VERBOSE=offLOGFILE=/tmp/procmaillog# 某个垃圾邮件规则:0* ^From: webmaster@st.zju.edu.cn/dev/null #垃圾文件的存储位置# 其它所有都存到收件箱中:0:inbox/其中,$HOME/Mail是设定的邮件存储位置。我们需要手动创建mkdir /Mail,否则程序会报错。配置好后,我们再测试一下,假设邮箱里有一封未读邮件,就会看到:$ fetchmail1 message for Jason@aliyun.com at pop3.aliyun.com (7833 octets).reading message Jason@aliyun.com@pop3.aliyun.com:1 of 1 (7833 octets) flushed$ tree /Mail/Users/Jason/Mail└── inbox ├── cur ├── new │ └── 1549706227.89809_0.Jason-mba.lan └── tmp可以看到,一封新邮件保存到了/Mail/inbox/new/中,文件为1549706227.89809_0.Jason-mba.lan。但是手动打开以后是这样的:这个实际上就是邮件的真面目:MIME格式(协议)的邮件源码。就像HTML一样,展示给我们的和背后的源码不一样。那么怎么把这个类似HTML的MIME格式邮件解析为我们人能读懂的内容呢?这个我们就要靠mutt自己了,mutt自身具备基本的MIME邮件解析功能(不包括HTML格式邮件读取)。但是这里我们先不讲邮件阅读的问题,把它留在最后。发件:配置msmtpmsmtp是作为替代sendmail发邮件程序的更好替代品。msmtp的配置文件为/.msmtprc,记得改权限:chmod 600 /.msmtprc配置内容比收件还简单,因为发件永远比收件简单。Tip: 发件的服务器是smtp协议。收件才是pop3协议。基本配置:account default auth login host smtp.XXX.com port 587 from ME@XXX.com user ME password passwd tls on tls_certcheck offlogfile /tmp/msmtp.log其中注意,关于tls,如果是阿里云则不用写,如果是Outlook的话,必须写: tls on tls_starttls on tls_certcheck off主界面:配置MuttMutt的配置文件为/.muttrc,记得改权限:chmod 600 /.muttrc另外:mutt的配置文件还可以放在/.mutt/muttrc。这种方法有一个好处,即/.mutt/目录下可以放很多主题、插件等文件。基本配置:# 通用设定set use_from=yesset envelope_from=yesset move=yes #移动已读邮件set include #回复的时候调用原文set charset=“utf-8"auto_view text/html #自动显示HTML# 发送者账号set realname=“Solomon Xie"set from=“solomonxie@aliyun.com”# 分类邮箱set mbox_type = Maildir #Mail box typeset folder = “$HOME/Mail"set spoolfile = “$HOME/Mail/inbox” #INBOXset mbox="$HOME/Mail/seen” #Seen boxset record="$HOME/Mail/sent” #Sent boxset postponed="$HOME/Mail/draft” #Draft box# 关联程序(需要自己用which命令确定一下)set editor=“vim -nw"set sendmail="/usr/local/bin/msmtp"极简配置综合上面的四大配置文件,下面是我的四个文件的极简配置:另外可参考网友的极简配置:https://gist.github.com/ihars…现在我的目的是先让收发件运行起来,至于界面美化、快捷键设定等,我们以后再说,里面很有学问。确认邮箱服务器有没有问题即使上面配置一切OK,也不一定能正常收发邮件。因为你用的Gmail、QQ、网易、阿里云等等,后台都有一系列的第三方收取设置。这是各不相同的。比如QQ和网易,现在几乎已经不能用了(2019),为什么?因为它们完全阻止了第三方客户端收发件。即使你去后台设置面板,可以通过手机短信验证之类设置,但是会发现实际上总是验证不了总是通过不了。所以本质上,他们只允许自己的官方客户端不允许任何别的手机、PC客户端(流氓行径)Gmail在国内用不了众所周知。现在比较好用的只有阿里云和微软的Outlook了。除了第三方客户端的允许,我们还要设置POP。最好放开全部邮件或者最近30天,然后禁止客户端删信。这是什么意思呢?POP默认客户端在收件后,服务器上的邮件就自动删除了!这个不太合适,所以必须要禁止例如阿里云邮箱:Mutt主界面的基本操作参考:How to Use the Fast and Powerful Mutt Email Client with Gmail参考Youtube:mutt - Terminal Email Client - Linux TUI邮件列表操作:基本:q:Quit, d:删除当前邮件, s:将邮件移动至指定文件夹, m:创建新邮件, r:回复当前邮件, ?:帮助移动:j/k 上下移动邮件, z/Z上下翻页, <Number> 跳至序号处(不进入邮件)<Enter> 打开选中的邮件/在当前文件夹搜索d 将选中邮件标记为删除, N 将选中邮件标记为未读, $ 让标记的东西生效,如删除、未读等。f 转发选中邮件, e 编辑选中邮件c切换文件夹(inbox/seen/draft等), 需要输入文件夹名称,或按?在列表里选择,j/k上下移动。gi查看Inbox,ga查看所有邮件,gd查看Draft,gs查看星标邮件在邮件中的操作:j/k 上一封/下一封邮件, <Space>: 向下翻页, <Enter>: 向下滚动e 编辑当前邮件, t编辑TO,c编辑CC,b编辑BCC,y发送邮件,a添加附件,Return查看附件,E编辑附件,D删除附件使用命令操作Mutt如同Vim一样,不光可以把命令绑定为快捷键,还能直接输入:直接输入命令。但是稍有不同的是,Mutt称之为Action,而且需要用:exec <命令>这样格式执行。比如sidebar侧边栏的移动,命令是:sidebar-next, sidebar-prev。那么我们可以直接输入:exec sidebar-next,按下回车执行。参考:https://gitlab.com/muttmua/mu…Mutt乱码问题一般分为:邮件列表乱码内容乱码附件乱码无论/.muttrc中怎么设置charset=utf-8都没用。这个时候,先在mutt中输入命令查看软件当前的charset设置::set &charset ?charset如果显示的是charset=“us-ascii”,那么就没错,ascii绝对不会显示中文。必须要utf-8等其它unicode格式才行。但是为什么muttrc中设置charset没用呢?测试了下,在MacOS、Ubuntu中同时设置一样的配置,Ubuntu正常显示中文,MacOS却不能。在Ubuntu中输入测试的命令,显示出charset=“utf-8”;而MacOS里无论iTerm2或Terminal,都是显示us-ascii,且乱码。问题就变成了:为什么muttrc中的charset不生效?locale大法:在命令行里分别输入$ locale命令,查看Shell中的语言设置,发现,我在Mac中的Locale是:↳ $ localeLANG=LC_COLLATE=“C"LC_CTYPE=“en_US.UTF-8"LC_MESSAGES=“C"LC_MONETARY=“C"LC_NUMERIC=“C"LC_TIME=“C"LC_ALL=而Ubuntu中的确是:↳ $ localeLANG=en_GB.UTF-8LANGUAGE=LC_CTYPE=en_GB.UTF-8LC_NUMERIC=“en_GB.UTF-8"LC_TIME=“en_GB.UTF-8"LC_COLLATE=“en_GB.UTF-8"LC_MONETARY=“en_GB.UTF-8"LC_MESSAGES=“en_GB.UTF-8"LC_PAPER=“en_GB.UTF-8"LC_NAME=“en_GB.UTF-8"LC_ADDRESS=“en_GB.UTF-8"LC_TELEPHONE=“en_GB.UTF-8"LC_MEASUREMENT=“en_GB.UTF-8"LC_IDENTIFICATION=“en_GB.UTF-8"LC_ALL=也许问题就出在这里:Shell的设置出了问题,而不是mutt的设置!解决方法很简单:$ export LANG=en_US.UTF-8然后再输入locale命令就可以看到正常的语言编码设置了。再打开mutt也是正常显示。但是直接这样export是临时的,需要把这个加入到~/.zshrc或~/.bash_profile中。HTML网页格式邮件的浏览参考:https://debian-administration…参考:https://fiasko.io/projects/ht…参考:http://jasonwryan.com/blog/20…大概两步:创建~/.mailcap文件,在里面设定HTML渲染规则在~/.muttrc中设定auto_view等自动浏览规则普通的邮件,内容只是单纯的text/plain格式,这样我们不用渲染直接看就行。但有的邮件为了美化,往往用text/html的格式展现,这就很麻烦,因为看到的都是html代码。所以遇到HTML格式的邮件,我们需要做的是利用第三方软件来Render(渲染).渲染的问题涉及到两个问题需要解决:HTML源码转换成人类可读的text文字显示图片HTML源码翻译成文字非常好解决,只要利用w3m等命令行浏览器即可完成,非常轻量非常简单非常快感受不到有它的存在,可以直接在mutt中查看。但是图片就有些问题了:图片在终端里展示,一直是个问题。虽然可以达到,但是需要配置很多东西。所以有人为了图方便,遇到HTML格式邮件,就直接弹出chrome网页来看(不推荐)。这样说实话,就没什么意义了。常用的HTML渲染为Text的方式有:w3m: 命令行里的浏览器links常用的图片显示方法有:直接弹出chrome浏览器查看内容 (BAD!)w3m渲染用brew install w3m后,就得到了一个命令行里的浏览器。然后我们需要配置两个mutt配置文件。/.muttrc添加这两行:auto_view text/html # View HTML automaticallyalternative_order text/plain text/enriched text/html # save html for last/.mailcap添加这一行:text/html; w3m -I %{charset} -T text/html; copiousoutput;然后重新打开mutt,再打开一个html格式的邮件就发现,内容已经很好的转换成人可读的text格式了。当然,这时候还不能看图片。关于mutt图片渲染的问题,我们留到另一篇专门说明。 ...

February 12, 2019 · 2 min · jiezi

Python解析邮件

邮件的解析是个大课题,远超一般人的预期。它远比发送邮件和接收邮件要复杂的多的多。这就是为什么网上中文外文搜邮件的问题,绝大多数都是讲发送的而讲接收的很少。发送邮件好说,接收和下载邮件也好说。关键是下载下来的邮件是一种比HTML还复杂的嵌套结构MIME邮件协议参考:阮一峰 - MIME笔记参考:MIME邮件的组织结构参考:Parsing email using Python part 2 of 2 : The content参考:Mozilla - MIME types先不论Python,也不谈什么邮件发展历史,只论现在:现在我们要达到通过编程来解析邮件,就绝对避不开这个问题:MIME邮件结构.MIME是一整套的协议,就像HTTP协议、TCP协议之类的一样,都是解析邮件的一套规则。所以我们想要解析一封邮件(把它拆成人能读懂的标题、收发件人、内容、附件等),就必须得理解这套协议。就算有现成的Python处理库也一样要懂了以后才能开始操作。了解MIME协议,其实主要就是了解邮件的嵌套结构。这个懂了就全懂了。要知道,我们收到的一封邮件可能是以下这几种不同的结构类型:简单的几句话,全是文字。 (text/plain)非常漂亮的网页一样的页面。(text/html)包括回复另一封邮件的层层嵌套的内容。(multipart/mixed)带附件的内容,比如一张图片。(multipart/mixed) + (image/jpeg)当然,这不是全部,只是有代表性的几种文档类型。最重要的是知道:所有超出简单文字或网页HTML之外的,全都是multiparts。最难理解的也是这个multiparts。下面是最复杂的Multiparts邮件,包括了所有能包括的结构。其中每个方块都有自己的Content Type和Body。简单点的结构图:[站外图片上传中…(image-8219fc-1548158814349)]文字型结构图:multipart/mixed | +– multipart/related | | | +– multipart/alternative | | | | | +– text/plain | | +– text/html | | | +– image/gif | +– application/msword详细一点的结构图:[站外图片上传中…(image-36fdd8-1548158814349)]这里是所有邮件能支持的Content Type文档类型:text/plain: 纯文本,文件扩展名.txttext/html: HTML文本,文件扩展名.htm和.htmlimage/jpeg: jpeg格式的图片,文件扩展名.jpgimage/gif: GIF格式的图片,文件扩展名.gifaudio/x-wave: WAVE格式的音频,文件扩展名.wavaudio/mpeg: MP3格式的音频,文件扩展名.mp3video/mpeg: MPEG格式的视频,文件扩展名.mpgapplication/zip: PK-ZIP格式的压缩文件,文件扩展名.zip编程上需要明确的是:要读取嵌套结构,必须用递归的方法。Content-Disposition 附件的存在方式对于附件,有两种存在方式:inline: 嵌入在文字里的,比如HTML格式邮件中显示的图片attachment: 是附在结尾的,单独的一部分一般我们只需要处理attachment格式的附件,而inline的东西就让它保存在inline里吧。邮件里面要获取这个部分的格式,需要找到这个参数:Content-Disposition。其它并拍的参数还要Content-Type和Content-ID等。Content-Transfer-Encoding 文本传输的编码方式这个只针对text/plain & text/html类型的文本有用。这个是每封邮件的必须数据,它必须要指出每段文本的传输编码方式,有的可以压缩传输(base64),有的可以原文传输(8bit或7bit),有的可以内置base64图片可直接打印(quoted-printable)。正因为每封邮件都可能采用不同的传输编码策略,所以我们解析内容之前必须要判断是哪种方式才能正确解码为原文的内容。目前常见的传输编码方式有:8bit或7bit:这个最简单,直接是原文,不需要转码。base64:内容全文用base64压缩,所以需要用base64.b64decode()库函数来解码。quoted-printable:另一种压缩方式,需要用quopri.decodestring()库函数来解码。获取当前内容的传输编码方式的代码如下:encoding = part.get(‘Content-Transfer-Encoding’)其中part可以是库email.message.Message的实例或者其中multipart多部分中的sub-part,都可以。

January 26, 2019 · 1 min · jiezi

Linux 发送邮件的命令行应用

发送邮件有超多种方法,但是接收邮件就要麻烦很多。所以这里先只讲发送邮件先说明下:不管是什么邮件客户端,都是可以直接发邮件的。但是,因为默认的话,发件人是很随便地设置成你本机地名字。并且100%会被邮箱当成垃圾邮件处理。如果你去垃圾箱里找,还是可以看到的。这就是为什么,我们还是需要配置它,让它登录某个邮箱来使用它的身份发邮件了,比如gmail邮箱或阿里云邮箱。(国内的163和qq邮箱都已经屏蔽第三方客户端登录了)另注:为什么如今这么电子技术这么发达的年代,命令行邮件终端相关的应用和文章还这么少几乎都是很多年前的?我想是因为:python等都已经能很好很方便支持发邮件了,没必要折腾命令行版本。事实上,试过就知道:为什么这些客户端会被抛弃了。。。请看下面我入的坑:Mail注:Mail的配置相当麻烦,网上找文章也寥寥无几,有也都是十几年前的东西。所以建议放弃,使用更先进的客户端。MuttMutt是Linux邮箱客户端榜上有名的利器了。先不说什么界面操作之类的,因为我们用命令行的邮箱客户端都是用来自动化的,不想用什么界面。参考:Linux使用mutt发送邮件安装其中mutt是软件本身,msmtp是用来帮助发件的工具。# Linux$ sudo apt-get install mutt msmtp# 或Mac$ brew install mutt msmtp配置你需要配置两个文件,一个是~/.muttrc用来配置Mutt本身,一个是~/.msmtprc用来配置发件人的,需要写入密码一类的。参考:Linux下使用mutt,msmtp发信配置~/.msmtprc:account Aliyunhost smtp.aliyun.comfrom jason@aliyun.comauth loginuser jason@aliyun.compassword abcde123123123account default : Aliyunlogfile /.msmtp.log然后必须修改/.msmtprc文件的权限,否则程序无法读取,发邮件时会报错。修改如下:chmod 600 /.msmtprc配置/.muttrc:set sendmail="/usr/bin/msmtp"set use_from=yesset realname=“Jason"set from=“Jason@aliyun.com"set envelope_from=yesset editor=“vim -nw"注意:第一条set sendmail中的位置不一定是这样的,在Mac和Linux上都会不同,所以需要用which msmtp来找到它的真实位置,再填进去。关于配置的解释可以看这里:发送邮件命令格式注意:收件人的地址前一定要明确指定参数名–,如下所示。否则无法正确发送附件。# 常用格式如下 -s “标题” -c 抄送 -a 附件$ echo “HELLO WORLD” | mutt -s “TITLE” – RECIPIENT@gmail.com# 发送HTML格式漂亮的邮件$ mutt – RECIPIENT@gmail.com -e ‘set content_type=“text/html”’ -s “TITLE” < out.html# 发送给多人,抄送,添加附件$ echo “hello” | mutt -s “TITLE” aaa@gmail.com, bbb@gmail.com -c ccc@gmail.com -a /home/pi/pic.jpg address=“RECIPIENT@gmail.com”# 发送邮件时设置邮件的文本类型为:html格式,邮件的等级为:重要$ echo $content | mutt -s “${subject}” -e ‘set content_type=“text/html”’ -e ‘send-hook . “my_hdr X-Priority: 1”’ $address语法:参数:Mutt发送HTML漂亮富文本邮件默认语法是:$ mutt – RECIPIENT@gmail.com -e ‘set content_type=“text/html”’ -s “TITLE” < out.html但是,值得注意的是,语法虽然简单,可一旦你本机的mutt版本不对,邮件将无法显示出正确的格式,而只是无尽的html源代码。通过mutt -v可以看到,发送出显示正常的邮件的mutt版本是在树莓派上安装的Mutt 1.5.23 (2014-03-12)。而不成功的是在Mac上的Mutt 1.9.5 (2018-04-13),反而是最新的版本!邮箱配置阿里云邮箱163邮箱新浪邮箱- 新浪@sina.com邮箱,接收服务器地址为:pop.sina.com或pop3.sina.com,发送服务器地址为:smtp.sina.com- 新浪@sina.cn邮箱,接收服务器地址为:pop.sina.cn或pop3.sina.cn,发送服务器地址为:smtp.sina.cn- 端口号设置:POP协议:pop端口:110、smtp端口:25 IMAP协议:IMAP 端口:143、smtp端口:25- 加密设置:pop是995、imap的是993smtp是587或465,如465不能正常使用,可以更换587试试,但不同的国家有可能只支持一个端口(并非所有客户端都支持加密码) 。 ...

January 24, 2019 · 1 min · jiezi

java通过smtp服务 给指定邮箱发送邮件含附件

用程序发邮件首先需要一个smtp服务器,虽然说网上也有自建服务器的教程,但是由于工程量大,还要兼容各大邮箱厂商,有可能发送失败或被归为垃圾邮件。所以不推荐自建smtp服务器实现。推荐是有2种方法来实现 第三方邮箱发邮件1、买类似阿里云的smtp资源包(阿里云 1000条 / 2元)2、申请一个腾讯、网易163的邮箱,开通smtp服务端口,借由他们的服务器来转发。(其中部分第三方邮箱可以实现用自己的域名来接发邮件,例如service@baidu.com)本文中介绍的是第二种方法,用腾讯企业邮箱为例参考借鉴的大神的原文地址:https://www.cnblogs.com/LUA123/p/5575134.html这里重点只说明一下,腾讯企业邮箱 + javamail 来实现发邮件,代码的部分。其他邮箱,例如个人的qq邮箱 163邮箱也可以用这个方法实现,申请和设置方法借鉴百度吧补充一下!腾讯企业邮箱和qq邮箱方法有几个不同,我在末尾加了qq邮箱的方案正文开始先说腾讯企业邮箱maven<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version></dependency>另外我用到了一个 StringUtils.isNotBlank() 方法 可以选择引入以下maven依赖,也可以改写成 xxx != null && !"".equals(xxx) 等价的代码<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version></dependency>java 工具类需要把 用户名、密码、发件人别名 等参数填成你自己申请的package com.gemini.common.utils; import com.sun.mail.util.MailSSLSocketFactory;import org.apache.commons.lang.StringUtils; import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.GeneralSecurityException;import java.util.Date;import java.util.Properties; import javax.mail.Authenticator;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.PasswordAuthentication;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart; public class EmailUtils { // 腾讯企业邮箱 也可以换成别家的 private static final String protocol = “smtp”;// 协议 private static final String host = “smtp.exmail.qq.com”;// 地址 private static final String port = “465”;// 端口 private static final String account = “用户名”;// 用户名 private static final String pass = “密码”;// 密码 private static final String personal = “发件人别名(选填)”;// 发件人别名,不需要设为空串或null // 权限认证 static class MyAuthenricator extends Authenticator { String u = null; String p = null; public MyAuthenricator(String u, String p) { this.u = u; this.p = p; } @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(u, p); } } /** * 发送邮件工具方法 * * @param recipients 收件人 * @param subject 主题 * @param content 内容 * @param fileStr 附件路径 * @return true/false 发送成功 */ public static boolean sendEmail(String recipients, String subject, String content, String fileStr) { Properties prop = new Properties(); //协议 prop.setProperty(“mail.transport.protocol”, protocol); //服务器 prop.setProperty(“mail.smtp.host”, host); //端口 prop.setProperty(“mail.smtp.port”, port); //使用smtp身份验证 prop.setProperty(“mail.smtp.auth”, “true”); //使用SSL,企业邮箱必需! //开启安全协议 MailSSLSocketFactory mailSSLSocketFactory = null; try { mailSSLSocketFactory = new MailSSLSocketFactory(); mailSSLSocketFactory.setTrustAllHosts(true); } catch (GeneralSecurityException e1) { e1.printStackTrace(); } prop.put(“mail.smtp.ssl.enable”, “true”); prop.put(“mail.smtp.ssl.socketFactory”, mailSSLSocketFactory); Session session = Session.getDefaultInstance(prop, new MyAuthenricator(account, pass)); session.setDebug(true); MimeMessage mimeMessage = new MimeMessage(session); try { //发件人 if (StringUtils.isNotBlank(personal)) mimeMessage.setFrom(new InternetAddress(account, personal));//可以设置发件人的别名 else mimeMessage.setFrom(new InternetAddress(account));//如果不需要就省略 //收件人 mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(recipients)); //主题 mimeMessage.setSubject(subject); //时间 mimeMessage.setSentDate(new Date()); //容器类,可以包含多个MimeBodyPart对象 Multipart mp = new MimeMultipart(); //MimeBodyPart可以包装文本,图片,附件 MimeBodyPart body = new MimeBodyPart(); //HTML正文 body.setContent(content, “text/html; charset=UTF-8”); mp.addBodyPart(body); //添加图片&附件 if(StringUtils.isNotBlank(fileStr)){ body = new MimeBodyPart(); body.attachFile(fileStr); mp.addBodyPart(body); } //设置邮件内容 mimeMessage.setContent(mp); //仅仅发送文本 //mimeMessage.setText(content); mimeMessage.saveChanges(); Transport.send(mimeMessage); // 发送成功 return true; } catch (MessagingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return false; } public static void main(String[] args) { sendEmail(“你的邮箱地址”,“test”,“test”,null); }}关于上述方案,适用于一般的邮箱申请(腾讯企业邮箱、网易邮箱),但不适用于qq邮箱,原因是qq邮箱目前只接受授权码方案登录,官方的解释是“温馨提示:在第三方登录QQ邮箱,可能存在邮件泄露风险,甚至危害Apple ID安全,建议使用QQ邮箱手机版登录。 继续获取授权码登录第三方客户端邮箱 。”使用上述方法登录qq邮箱会遇到报错javax.mail.AuthenticationFailedException: 535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256如图意思就是不支持直接用默认密码登录,必须去申请一个授权码作为密码登录其实流程和工具类都一样就重点说 2个不一样的地方1、密码不是你的邮箱密码了,而是授权码。获取方式 [登录邮箱] - [设置] - [账户] ,然后如下图找到POP3/SMTP服务的下面,有一句温馨提示 先点 [生成授权码] ,再根据提示获取到授权码。授权码就是javamail里的password2、host不同腾讯企业邮箱的host是private static final String host = “smtp.exmail.qq.com”;// 地址普通qq邮箱的host是private static final String host = “smtp.qq.com”;// 地址修改这两个地方即可适用于个人普通的qq邮箱最终效果如下另外本文也发布在了我的个人博客: https://zzzmh.cn/single?id=49 ...

January 17, 2019 · 2 min · jiezi

在gmail中使用邮件模板功能

写在前面gmail没有邮件模板的功能,虽然有一个类似的功能可以达到模板的效果,但是在gmail的帮助文档里面并没有提及,所以才有了这篇文章。问题复现工作中经常有些格式固定,内容相似的邮件是需要重复发送的,比如日报、周报之类的。对于这种情况我们一般会很容易想到用邮件模板来避免复制粘贴,但是对于gmail来说,很遗憾不支持邮件模板功能,那怎么办呢?别急,方法总是有的。问题解决普通方案在gmail中虽然没有邮件模板功能,但是有一个与之类似的功能,叫:预设回复。这个功能的描述是这样的:预设回复(模板)使用写邮件工具栏中的按钮存储常用邮件以创建回复模板。您也可以使用过滤器自动发送回复模板。恩,如此看来,这个功能可以作为邮件模板来使用,那我们来看看怎么用。step 0 开启预设回复(模板)功能设置 -> 高级 -> 预设回复(模板)-> 启用step 1 创建模板写邮件 -> 更多选项(右下角的三个点) -> 预设的电子邮件回复 -> 新建预设的电子邮件回复(保存项下的) -> 输入模板名step 2 使用模板写邮件 -> 更多选项(右下角的三个点) -> 预设的电子邮件回复 -> 点击模板名字(插入项下的)step 3 管理模板gamil的模板管理很不友好,没有专门的界面管理模板,只有在预设的电子邮件回复选项下有插入、保存、删除三个功能。插入就是往邮件体内应用模板保存可以新建模板也可以覆盖原有的模板删除可以删除模板(废话)如此,问题得到解决。但是我们还有另一种解决方案。极客方案问题的解决方法往往不止一个,我们还可以辅以chrome插件来解决这个问题。最终可以实现类似在sublime中插入code snippet那么方便的操作:按个快捷键就能插入模板,甚至是带有变量的模板。我们用到的插件叫做:Gorgias Templates 使用文档插件的基本用法就不多说了,这个上手很容易,值得一提的是他对邮件模板的拓展和模板变量的使用。邮件模板拓展在普通方案中我们的邮件模板只是把邮件体和主题做成了模板,并不包含收件人信息,而通过这个插件,我们可以把邮件主题、收件人甚至抄送、密送都在模板中设置好,这点不可谓不方便。方法是在新建模板的时候点击Show more fields来展开更多项,进行配置。模板变量模板变量,有点模板引擎的感觉,通过模板变量可以使我们的模板(包括收件人、主题等)更加灵活简单。目前支持的变量有:邮件主题(subject)收件人(to)发件人(from)抄送(cc)密送(bcc)日期(date)日期格式化支持momentjs传参随机项 (choice)邮件域名(domain)通过这插件我们基本可以实现这样的一个模板:收件人固定主题带有动态日期邮件内容固定而整个过程中我们要做的就是配好模板,在使用地方按下快捷键,操作就是这么流畅。总结极客方案虽酷,但是也不是没有缺点,我们来对比一下两种方案。方案邮件体 + 主题模板收件人 + 抄送 + 密送模板变量模板同步普通方案支持不支持不支持支持极客方案支持支持支持不支持所以,其中利弊各自权衡吧。[完]

January 16, 2019 · 1 min · jiezi

12036火车票小工具,希望大家都能顺利回家

12306鉴于市场上的大多数抢票软件的安全问题和效率问题,就手动修改了开源的代码来为自己赢得捡漏的机会,谁叫本电脑是linux系统呢。缩减刷新的频率也是一种策略,哈哈!!! 这是一款工具这是一款抢票工具这是一款12306自动抢票开源工具这是一款12306自动抢票开源工具基础上优化更改的捡漏器工具github地址:https://github.com/V-I-C-T-O-R/12306Usage在configure.py中配置信息:身份信息车票信息订票策略邮件配置短信配置执行funckeverything.py。Notice需要额外安装的第三方库:requestsPillowPrettyTablecoloramatwilio新功能新增自动url变更请求手动输入/自动识别验证码调用(调用免费接口)抢票成功邮件发送抢票成功短信发送twilio内部流程优化,新增港铁西九龙站23点-6点定时睡觉你可以做啥要改成多线程多进程随你咯添加代理池随你咯添加多账户支持随你咯方便个人,不为盈利oh! 对了,现在是2019年了,加油!效果图如下: 提示借鉴了EasyTrain库的代码优化当前代码和流程

January 14, 2019 · 1 min · jiezi