我想编写一个使用Python的smtplib发送电子邮件的程序.我搜索了文档和RFC,但找不到任何与附件相关的内容.因此,我确信我错过了一些更高级别的概念.有人能告诉我附件如何在SMTP中工作吗?
我的应用程序必须发送一个文本文件,它首先必须生成一个String.该文本包含非ASCII符号,所以我希望它是UTF-8.我已经尝试了很多变种,但我收到的所有附件都是一些问号.并且,当我发送与邮件正文相同的文本时,它可以正常工作.
以下是生成带附件的MimeBodyPart的代码行:
String attachment = "??????";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
"UTF-8"),"text/plain; charset=UTF-8");
Run Code Online (Sandbox Code Playgroud)
我也尝试使用没有任何转换的字符串,只使用字节,现在,如你所见,我试图从字节生成一个字符串...
我究竟做错了什么?(我确实记得在另一个项目中这样做,但是我不再能够访问它的源代码).
先感谢您.提莫菲.
UPDATE
阅读完回复后,经过一些不成功的试验后,我认为最好发布我的邮件代码.我有一个Mailer
类,它负责邮件发送,其他类可以调用它的静态sendMessage()
方法来发送消息.这一切都在Google App Engine上运行.
public static void sendMessage(String to, String subject, String msgBody,
String attachment) throws AddressException, MessagingException {
Properties props = new Properties();
Session mailSession = Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(mailSession);
String email = "bla-bla-bla"; // userService.getCurrentUser().getEmail();
msg.setFrom(new InternetAddress(email));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
InternetAddress[] addresses = { new InternetAddress("bla-bla-bla") };
msg.setReplyTo(addresses);
msg.setSubject(subject);
Calendar cal = Calendar.getInstance();
String fileName = cal.get(Calendar.YEAR) + …
Run Code Online (Sandbox Code Playgroud) 将XML文档写入浏览器的响应流,并使浏览器显示"另存为"对话框.
请考虑以下download()
方法:
HttpServletResponse response = getResponse();
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(
response.getOutputStream() ) );
String filename = "domain.xml";
String mimeType = new MimetypesFileTypeMap().getContentType( filename );
// Prints "application/octet-stream"
System.out.println( "mimeType: " + mimeType );
// response.setContentType( "text/xml;charset=UTF-8" );
response.setContentType( mimeType );
response.setHeader( "Content-Disposition", "attachment;filename="
+ filename );
bw.write( getDomainDocument() );
bw.flush();
bw.close();
Run Code Online (Sandbox Code Playgroud)
在Firefox中,XML内容显示在浏览器窗口中.在IE 7中,不显示XML内容 - 您必须查看文档源.这两种情况都不是理想的结果.
该网页使用以下代码作为按钮:
<a4j:commandButton action="#{domainContent.download}" value="Create Domain" reRender="error" />
Run Code Online (Sandbox Code Playgroud)
所生成的XML 不下手<?xml version="1.0"?>
,而XML内容类似于:
<schema xmlns="http://www.jaspersoft.com/2007/SL/XMLSchema" version="1.0">
<items>
<item …
Run Code Online (Sandbox Code Playgroud) 我在网上找到PHP代码,从这里使用IMAP将附件下载到目录.http://www.nerdydork.com/download-pop3imap-email-attachments-with-php.html
我稍微修改了它
$structure = imap_fetchstructure($mbox, $jk);
$parts = ($structure->parts);
Run Code Online (Sandbox Code Playgroud)
至
$structure = imap_fetchstructure($mbox, $jk);
$parts = ($structure);
Run Code Online (Sandbox Code Playgroud)
让它运行正常,否则我得到一个错误,关于stdClass如何定义一个名为$ parts的属性.这样做,我能够下载所有附件.我最近再次测试它,但它没有用.好吧,它没有工作6次,工作到第7次,然后没有工作.我认为这与我搞砸零件处理有关,因为count($ parts)每个消息都会返回1,所以我认为它没有找到任何附件.
由于它在一个点上下载了附件而没有任何问题,我相信这个区域的事情已经搞砸了就在这里.在此代码块之前是一个for循环,它遍历框中的每个消息,并且在循环之后,每个imap结构只传递$ parts.感谢您的任何帮助,您可以提供.我查看了php.net上的imap_fetchstructure页面,无法弄清楚我做错了什么.
编辑:我只是在输入我的问题后仔细检查了文件夹,然后全部弹出.我觉得我疯了.我在开始输入这个代码之前的几分钟就没有运行过代码,而且对我来说没有任何意义,这需要很长时间才能触发.我在邮箱中有大约800条消息,但我想,因为它在PHP的最后打印了我的语句,表明所有文件创建工作都已完成.
我有一个程序,总是将相同的文件附加到GMAIL(Compose> Attach File> Open From>"MyProgram").它总是会选择相同的文件.
它做的是:
String path = Environment.getExternalStorageDirectory() + "/file.3gp";
File f = new File(path);
Uri data = Uri.fromFile(f);
Intent i = new Intent();
i.setData(data);
setResult(Activity.RESULT_OK, i);
finish();
Run Code Online (Sandbox Code Playgroud)
这个工作正常,直到Android 6.0.现在,我在尝试使用它时收到以下错误:
无法附加空文件
Astro文件共享给了我同样的错误(可以是旧版本).
但是,我安装了ES文件资源管理器,当我执行相同的例程并选择文件时,我收到一个Dialog,其中说:
拿起文件为
- 普通Android方式(适用于彩信,Gmail,...)
- 文件方式(如果失败,请尝试此操作)
"文件方式"将失败,因为我的程序."普通的Android方式"将正常工作.
有没有人知道它的作用,所以我可以复制?
提前致谢!
OBS:已经尝试了很多次putExtra(STREAM,路径),但没有成功.
我在这个网站上看到多个线程讨论在android中发送带附件的电子邮件.我想讨论的每一个方法在这里,这里和这里.
我正在通过代码创建一个csv文件并将此文件保存到android内部存储.然后我想在电子邮件中将此文件作为附件发送.嗯,电子邮件正在发送,我收到它没有附件.这就是我所做的.
String columnString = "\"Person\",\"Gender\",\"Street1\",\"PostOfice\",\"Age\"";
String dataString = "\"" + currentUser.userName +"\",\"" + currentUser.gender + "\",\"" + currentUser.street1 + "\",\"" + currentUser.poNumber.toString() + "\",\"" + currentUser.age.toString() + "\"";
String combinedString = columnString + "\n" + dataString;
File file = new File(this.getCacheDir()+ File.separator + "Data.csv");
try {
FileOutputStream out = new FileOutputStream(file);
out.write(combinedString.getBytes());
out.close();
} catch (IOException e) {
Log.e("BROKEN", "Could not write file " + e.getMessage());
}
Uri u1 = Uri.fromFile(file);
Intent sendIntent …
Run Code Online (Sandbox Code Playgroud) 我有一个表示为byte []的excel文档,我想将其作为附件发送到电子邮件中.
我在构建附件时遇到了一些麻烦.
我可以创建一个具有以下构造函数的Attachment:
(Stream contentStream, ContentType contentType)
(Stream contentStream, string name)
(Stream contentStream, string name, string mediaType)
Run Code Online (Sandbox Code Playgroud)
我的想法是从byte []创建一个MemoryStream并将其传递给创建附件的方法.
不幸的是,我看不到从MemoryStream获取预期文件名和内容类型的方法,我也看不到如何提供正确的内容类型.有纯文本,Pdf,Rtf等选项,但我没有看到立即跳出来作为我应该用于Excel文档的那个.
我能找到的最接近的是MediaTypeNames.Application.Octet,其中说明:
Octet成员指定附件包含通用二进制数据.
但是,即使这是一个使用的,除非它可以作为Stream的属性传递,那么我的发送电子邮件的方法只能发送一个byte []作为Excel文档...
是否有其他类型的流可以使用?或者我是否必须创建我自己的Stream类型,其中包含我需要的详细信息.
当然有人在那里做过这件事,当然微软会想到这个水平......
任何帮助将非常感激.
更新: 请不要投票使用将文件名作为字符串的构造函数的任何答案.我真的需要帮助使用带有Stream的那些......我想避免将文件写入磁盘,通过电子邮件发送,然后立即将其删除.由于有一种方法可以让我这样做,我想尽可能使用那个.
解决方案更新
康拉德设法找到了我要找的东西!谢谢堆人!
我只是记录建议的解决方案,以防万一在提供的链接上的内容发生了什么.
这个解决方案可以归功于www.systemnetmail.com
static void AttachmentFromStream()
{
//create the mail message
MailMessage mail = new MailMessage();
//set the addresses
mail.From = new MailAddress("me@mycompany.com");
mail.To.Add("you@yourcompany.com");
//set the content
mail.Subject = "This is an email";
mail.Body = "this content is in the body";
//Get some binary data
byte[] …
Run Code Online (Sandbox Code Playgroud) 我有一个项目,我正在使用PDF生成器向用户发送文件.我们希望为用户提供将此文件附加到电子邮件的选项,而我们在使用Stream对象和附件逻辑时遇到问题.
我们从ABCpdf开始,它有两个保存方法:它可以保存到Stream,或者如果你给它一个字符串,它会尝试保存到磁盘上的文件.我们两个都没问题.
Stream stream = new MemoryStream();
myPdf.Save(stream);
Run Code Online (Sandbox Code Playgroud)
此时一切都很酷 - stream
有几千字节的数据,如果你.save()到一个文件,你得到一个具有相同字节数的实际文件.
所以我们此时附上一封电子邮件(初始化邮件对象后,设置为:和发件人:等):
mail.Attachments.Add(new Attachment(stream, "myPdf.pdf"));
mail.Send();
Run Code Online (Sandbox Code Playgroud)
...让我们收到一个0字节的电子邮件,但正确的文件名.
我在网上找到的所有例子都使用StreamReader或StreamWriter或Flush()等.它总是看起来比简单传递Stream更复杂,但可能只有一两行更复杂.这些示例都不是以Stream开头的 - 他们总是试图将数组转换为Stream来向您展示它是多么容易,或者从磁盘中获取文件(我们无法做到这一点,这就是为什么我们很兴奋使用Stream).
无论如何,如果有人能解释我做错了什么或我应该做什么,我真的很感激.谢谢.