发送带附件的电子邮件是通过SMTP协议在电子邮件中附加二进制或文本文件的过程。附件可以是文档、图片、音频、视频等各种类型的文件,它们会被编码后嵌入到电子邮件中。
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
def send_email_with_attachment(sender, receiver, subject, body, attachment_path):
# 创建多部分消息对象
message = MIMEMultipart()
message['From'] = sender
message['To'] = receiver
message['Subject'] = subject
# 添加邮件正文
message.attach(MIMEText(body, 'plain'))
# 打开附件文件
with open(attachment_path, 'rb') as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
# 编码附件
encoders.encode_base64(part)
# 添加附件头
part.add_header(
'Content-Disposition',
f'attachment; filename= {attachment_path.split("/")[-1]}'
)
# 将附件添加到消息中
message.attach(part)
# 发送邮件
with smtplib.SMTP('smtp.example.com', 587) as server:
server.starttls()
server.login(sender, 'your_password')
server.send_message(message)
# 使用示例
send_email_with_attachment(
'sender@example.com',
'receiver@example.com',
'测试带附件的邮件',
'请查收附件',
'/path/to/your/file.pdf'
)
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
import java.io.File;
public class EmailWithAttachment {
public static void send(String to, String from, String host,
String subject, String text, String attachmentPath) {
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.starttls.enable", "true");
properties.setProperty("mail.smtp.port", "587");
Session session = Session.getDefaultInstance(properties,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(from, "your_password");
}
});
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subject);
// 创建消息体部分
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(text);
// 创建多部分消息
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
// 添加附件
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(attachmentPath);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(new File(attachmentPath).getName());
multipart.addBodyPart(messageBodyPart);
// 设置完整消息
message.setContent(multipart);
// 发送消息
Transport.send(message);
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
# 使用mailx发送带附件的邮件
echo "邮件正文" | mailx -s "邮件主题" -a /path/to/attachment.txt recipient@example.com
# 使用mutt发送
mutt -s "邮件主题" -a /path/to/attachment.txt -- recipient@example.com < body.txt
问题:大多数邮件服务器对附件大小有限制(通常25MB左右)。
解决方案:
问题:附件文件名或内容出现乱码。
解决方案:
问题:附件可能包含恶意软件。
解决方案:
问题:邮件发送失败或被标记为垃圾邮件。
解决方案:
通过以上方法和注意事项,您可以高效、安全地发送带附件的电子邮件。